每周总结(补)【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;
}

每周总结(补)【2020/11/22】——自主学习MyBatis与Hive配置

 是真的方便。

动态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();
    }
}

运行如下:

每周总结(补)【2020/11/22】——自主学习MyBatis与Hive配置

可以看到这个SQL语句只执行了一次。

  下一周(其实就是本周)的学习任务是Spring,机器学习尝试。