MyBatis相關記錄

mybatis 項目初始化

  1. maven依賴java

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.13</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
  2. Mybatis 全局配置文件mysql

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
    
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                    <property name="url" value="jdbc:mysql://192.168.31.136:3306/mybatis"/>
                    <property name="username" value="root"/>
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <mapper resource="UserMapper.xml"/>
        </mappers>
    </configuration>
  3. 建立實體類和Mapper配置文件sql

    public class User {
        private Long id;
        private String name;
        private Integer age;
    }
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.godfunc.UserMapper">
        <select id="selectUser" resultType="com.godfunc.User">
        select * from user where id = #{id}
      </select>
    </mapper>
  4. 測試數據庫

    @Test
        public void func1() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream resourceAsStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            User user = sqlSession.selectOne("com.godfunc.UserMapper.selectUser", 1L);
            log.error("result: {}", user);
        }
    sqlSession.close();

接口式編程

  1. 建立 UserMapper.javaapache

    public interface UserMapper {
        User selectUser(Long id);
    }
  2. UserMapper.xmlnamespace 改成 UserMapper.java 的全類名。編程

  3. 測試緩存

    @Test
        public void func2() throws IOException {
            String resource = "mybatis-config.xml";
            InputStream resourceAsStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            User user = userMapper.selectUser(1L);
            log.error("type {}", userMapper.getClass());
            log.error("result: {}", user);
            sqlSession.close();
        }

    此時咱們看到控制檯將 userMapper 的 type 打印出來了:mybatis

    [main] ERROR com.godfunc.Demo1 - type class com.sun.proxy.$Proxy5

    在這裏咱們能夠看到,myBatisuserMapper 建立了一個代理對象(也就是 UserMapper 的實現類 ),此時咱們就知道了,Mybatis 的接口式編程,其實最終仍是爲接口建立了實現類,而後調用實現方法,對數據庫進行操做。app

  4. INSERT 返回主鍵maven

    • UserMapper.java 中加上 insert

      void insert(User user);
    • UserMapper.xml 中配置 sql

      <insert id="insert" parameterType="com.godfunc.User" useGeneratedKeys="true" keyProperty="id">
              INSERT INTO user(name, age) values(#{name}, #{age})
      </insert>

      note: 若是參數是一個對象,咱們是能夠直接經過屬性名就行取值的。

Mybatis 多參數

多個參數,Mybatis 會作特殊處理,會將多個參數封裝到一個 map 中。map 的 key 是從 param1...paramn

  1. 接口方法和 sql 配置

    <update id="update">
            update user set name = #{param1}, age = #{param2} where id = #{param3}
    </update>
    void update(String name, Integer age, Long id);

    這樣,咱們能夠經過取出 map 中的多個參數,進行數據的更新。

    note: 若是參數是 List 獲取 Array , 裝到 map 中 key 的名字是 listarray

Mybatis 參數封裝

  1. update 爲例(這裏用的是@Param註解)

    void update(@Param("name") String name, @Param("age") Integer age, @Param("id") Long id);
  2. 在執行update 方法時,會進入 org.apache.ibatis.binding.MapperProxy類中,執行 invoke 方法,從類的命名上咱們能夠清楚的知道, MapperProxy 是Mapper的動態代理類

查詢返回 Map

  1. 接口和配置文件以下

    @MapKey("id")
    Map<Long, User> selectResultMap();
    <select id="selectResultMap" resultType="com.godfunc.User">
        select * from user
    </select>

    11:23:24.543 [main] ERROR com.godfunc.Demo1 - result {1=User{id=1, name='里斯', age=2}, 3=User{id=3, name='天全', age=3}, 8=User{id=8, name='王大山', age=34}, 9=User{id=9, name='天全11', age=3}}

    Mapper 配置文件中返回值類型依舊是 User,在接口方法聲明上使用 @MapKey("id") 將 返回結果中的 id 做爲 Mapkey.

級聯查詢

  1. 接口和配置文件以下

    public class User {
        private Long id;
        private String name;
        private Integer age;
        private Job job;
    }
User selectUserWithJob(Long id);
<resultMap id="userMap" type="com.godfunc.User">
       <result column="id" property="id"/>
       <result column="name" property="name"/>
       <result column="age" property="age"/>
       <result column="job_id" property="job.id"/>
       <result column="job_name" property="job.name"/>
       <result column="u_id" property="job.uid"/>
   </resultMap>
   <select id="selectUserWithJob" resultMap="userMap">
       select u.*, b.id job_id, b.name job_name, b.u_id  from user u left join job b on b.u_id = u.id where u.id = #{id}
   </select>

這裏是一個對一關聯,也能夠使用 association 標籤作,可是這裏直接使用了 . 的方式。

子查詢

  1. 當咱們進行子查詢,想要傳遞多個參數時,能夠這樣作 column="{key1=column1,key2=column2}"*

  2. fetchType="eager|lazy" 設置子查詢當即加載|懶加載

  3. bind 將一個表達式的值綁定到一個變量中(能夠用來作模糊查詢的% 拼接)

    <select id="selectByUserName" resultType="com.godfunc.User">
        <bind name="_name" value="'%'+name+'%'"/>
        select * from user where name like #{_name}
    </select>

    Note: 若是隻有一個參數,也要加 @Param 註解,否則會報錯

緩存

  1. 一級緩存 默認是開啓的
  2. 二級緩存
    1. 緩存的回收策略(eviction):
      • LRU - 最近最少使用的 :移除最長時間不被使用的對象。
      • FIFO - 先進先出:按對象進入緩存的順序來移除他們。
      • SOFT - 軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。
      • WEAK - 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。
    2. 緩存刷新間隔(flushInterval):緩存多久時間清空一次,默認不清空,設置一個毫秒值。
    3. 是否只讀(readOnly)
相關文章
相關標籤/搜索