每周总结(补)【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,机器学习尝试。