每週總結(補)【2020/11/22】——自主學習MyBatis與Hive配置
Hive配置
參考網址:https://www.jianshu.com/p/5d6365984b9b
環境:Ubuntu18.04
流程簡介:首先下載好Hive,我選擇的是1.2.2版本,之後使用ubuntu的命令下載mysql相關服務,下載好之後提前建立好名為“hive”的資料庫,同時設定好遠端訪問mysql,我設定的使用者名稱為root,密碼為123456。相關操作如下:
sudo apt-get install mysql-server mysql-client【下載mysql】
啟動後更改mysqld.cnf檔案,將bind-address = 127.0.0.1註釋掉。
mysql -uroot -p【輸入安裝mysql時設定的使用者和密碼,進入資料庫】
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;【設定任意IP訪問,使用者名稱root,密碼123456】
flush privileges;【過載授權表】
create database hive;【建立hive資料庫】
exit;【退出】
安裝hive並解壓到目錄下之後(目錄隨意,自己找得到就行),將conf下所有.template重新命名:
mv beeline-log4j.properties.template beeline-log4j.properties mv hive-default.xml.template hive-site.xml mv hive-env.sh.template hive-env.sh mv hive-exec-log4j.properties.template hive-exec-log4j.properties mv hive-log4j.properties.template hive-log4j.properties
編輯/etc/profile,新增路徑:
export HIVE_HOME=/usr/hive export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/conf
配置conf下hive-env.sh
export JAVA_HOME=/usr/java/jdk #jdk目錄 export HADOOP_HOME=/usr/hadoop #hadoop目錄 export HIVE_HOME=/usr/hive #hive目錄 export HIVE_CONF_DIR=/usr/hive/conf #hive配置檔案目錄
配置hive-site.xml,活用Linux檔案操作,查詢相關程式碼段修改,或者把以下檔案貼上上去之後把原有的刪除(刪除操作嘗試未果,建議前者)
<property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.132.128:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value> <description> 192.168.132.128是我的主機名,hive是MySQL指中的資料庫名 </description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>123456</value> </property> #需要建立/usr/hive/tmp/目錄 <property> <name>hive.exec.local.scratchdir</name> <value>/usr/hive/tmp/${user.name}</value> </property> <property> <name>hive.downloaded.resources.dir</name> <value>/usr/hive/tmp/${hive.session.id}_resources</value> </property> #以下目錄都需要在HDFS下建立 <property> <name>hive.exec.scratchdir</name> <value>/hive/tmp</value> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/hive/warehouse</value> </property> <property> <name>hive.querylog.location</name> <value>/hive/logs</value> </property>
把相應的檔案建立好即可。
再下載mysql驅動包,我下載的是5.1.49版本,將mysql-connector-java-5.1.49-bin.jar複製到解壓後hive的lib目錄下。
再配置hive-log4j.properties:
hive.log.dir=/usr/hive/logs
建立相關目錄檔案即可。
最後初始化mysql
schematool -dbType mysql -initSchema
切換到bin目錄下直接輸入hive啟動hive
MyBatis
Mybatis的基本配置在上一個周總結部落格中進行了簡要說明,核心思路是編寫interface介面和對應的*Mapper.xml配置檔案,sql語句寫在xml裡,以下補上幾個知識點。
Lambok外掛:
IDEA下下載lambok,之後匯入maven專案:
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> </dependencies>
這個外掛強大之處在於bean檔案中使用註釋即可完成相關的GetAndSet,toString等方法的建立,只需要三個註釋:
package com.pyd.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; @Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private String password; }
是真的方便。
動態SQL
這裡直接貼上一個xml配置檔案:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.pyd.dao.BlogMapper"> <insert id="addBlog" parameterType="Blog"> insert into mybatis.blog(id, title, author, create_time, views) VALUES(#{id},#{title},#{author},#{createTime},#{views}) </insert> <!-- IF--> <select id="queryBlogIF" parameterType="map" resultType="Blog"> select * from blog where 1=1 <if test="title != null"> and title = #{title} </if> <if test="author != null"> and author = #{author} </if> </select> <!-- 寫法2:使用sql標籤--> <sql id="if-title-author"> <if test="title != null"> title = #{title} </if> <if test="author != null"> and author = #{author} </if> </sql> <select id="queryBlogIF2" parameterType="map" resultType="Blog"> select * from blog <where> <include refid="if-title-author"></include> </where> </select> <!-- Choose[類似選擇中的switch](可以自動去掉and和or)--> <select id="queryBlogChoose" parameterType="map" resultType="Blog"> select * from blog <where> <choose> <when test="title != null"> title = #{title} </when> <when test="author != null"> and author = #{author} </when> <otherwise> and views = #{views} </otherwise> </choose> </where> </select> <!-- set(可以自動去掉多餘的逗號)--> <update id="updateBlog" parameterType="map"> update mybatis.blog <set> <if test="title != null"> title = #{title}, </if> <if test="author != null"> author = #{author} </if> </set> where id = #{id} </update> <!-- foreach--> <!-- select * from blog where 1=1 and (id=1 or id=2 or id=3)--> <select id="queryBlogForeach" parameterType="map" resultType="Blog"> select * from blog <where> <foreach collection="ids" item="id" open="and (" close=")" separator="or"> id = #{id} </foreach> </where> </select> </mapper>
方便的地方在於拼接的時候可以自動去掉多餘的逗號和AND | OR。
建議先將SQL寫出來執行一下,IDEA內提供了寫sql命令的地方,再結合SQL語句編寫配置檔案。
註解實現簡單的SQL:
仍然是貼一段程式碼說明:
package com.pyd.dao; import com.pyd.pojo.User; import org.apache.ibatis.annotations.*; import java.util.List; import java.util.Map; public interface UserMapper { //列欄位要與實體類對應 @Select("select * from try") List<User> getUsers(); @Select("select * from try where id = #{id}") User getUserById(@Param("id")int id); @Insert("insert into try(id,name,pwd) values (#{id},#{name},#{password})") int addUser(User user); @Update("update try set name = #{name},pwd = #{password} where id = #{id}") int updateUser(User user); @Delete("delete from try where id = #{id}") int deleteUser(@Param("id")int id); }
註解只能實現簡單的SQL語句。
快取機制:
MyBatis讀取快取的順序是先讀取二級快取,再讀取一級快取,最後判定無快取時根據SQL進入資料庫操作。Mybatis在沒有宣告的情況下預設啟動了一級快取,二級快取需要手動開啟。
一級快取:
一級快取在執行close()命令之前都存在,相同的select語句在執行時不會執行第二遍,即指定兩個相同select語句查詢物件輸出時,第一個物件執行SQL語句查詢後輸出,第二個物件直接輸出結果。但是,insert,update,delete這三種操作都會進行重新整理,無法進行一級快取。
二級快取:
二級快取需要手動設定,在需要執行的xml裡設定setting:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
配置引數不止這些,詳情參考Mybatis官方手冊
表現為:在指定的快取存活時間內,先關閉一個sqlSession服務,再開啟第二個服務,執行相同的select操作時,不會再次執行語句,因為已經快取好了。給出測試:
import com.pyd.dao.UserMapper; import com.pyd.pojo.User; import com.pyd.utils.MybatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; public class MyTest { @Test public void test(){ SqlSession sqlSession= MybatisUtils.getSqlSession(); SqlSession sqlSession2=MybatisUtils.getSqlSession(); UserMapper mapper=sqlSession.getMapper(UserMapper.class); User user=mapper.queryUserById(1); System.out.println(user); sqlSession.close(); //會話提交之後才會放到二級快取中 UserMapper mapper2=sqlSession2.getMapper(UserMapper.class); User user2=mapper2.queryUserById(1); System.out.println(user2); sqlSession2.close(); } }
執行如下:
可以看到這個SQL語句只執行了一次。
下一週(其實就是本週)的學習任務是Spring,機器學習嘗試。