1. 程式人生 > 實用技巧 >每週總結(補)【2020/11/22】——自主學習MyBatis與Hive配置

每週總結(補)【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&amp;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,機器學習嘗試。