zoukankan      html  css  js  c++  java
  • 每周总结(补)【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,机器学习尝试。

  • 相关阅读:
    javascript:getElementsByName td name
    C# 批量复制文件
    笨笨图片批量下载器[C# | WinForm | 正则表达式 | HttpWebRequest]
    浩方魔兽"去"小喇叭终极解决方案[Warcraft III]
    JavaScript——DataListBox(组合框)
    PowerDesigner 12 根据名称生成注释(完整示例)
    笨笨图片批量抓取下载 V0.2 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程]
    使用IHttpHandler做权限控制[ASP.NET | IHttpHandler | AjaxPro | UserHostName]
    AjaxPro 未定义错误
    北京有趣地名(二)
  • 原文地址:https://www.cnblogs.com/20183711PYD/p/14026560.html
Copyright © 2011-2022 走看看