1. 程式人生 > >mybatis12一級緩存

mybatis12一級緩存

each public fault trace from ble version 查詢語句 app

驗證一級緩存的存在

對應的實體類

/**
 *學生對應的實體類
 */
public class Student {
    
    private  Integer sId;
    private  String sName;

    public Integer getsId() {
        return sId;
    }
    public void setsId(Integer sId) {
        this.sId = sId;
    }
    public String getsName() {
        return sName;
    }
    
public void setsName(String sName) { this.sName = sName; } public Student(Integer sId, String sName) { super(); this.sId = sId; this.sName = sName; } public Student() { super(); } @Override public String toString() { return "Student [sId=" + sId + ", sName=" + sName +"]"; } }

對應的數據庫--student表

CREATE DATABASE /*!32312 IF NOT EXISTS*/`mybatis` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `mybatis`;

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (
  `sid` int(10) NOT NULL AUTO_INCREMENT COMMENT 主鍵id,
  `sname` varchar(20) DEFAULT NULL COMMENT 姓名,
  PRIMARY KEY (`sid`)
) ENGINE
=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8; /*Data for the table `student` */ insert into `student`(`sid`,`sname`) values (1,學生1),(2,學生2),(3,學生3),(4,學生4),(5,學生5);

創建對應的dao

public interface StudentDao {
    /**
     * 根據學生的編號查詢對應的信息
     * 驗證一級緩存的存在
     */
    Student selectStudentById(Integer sId);
}

對應的mapper文件

<?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="cn.bdqn.dao.StudentDao">

    <!-- 查詢指定學生的信息    驗證一級緩存的存在 -->
     <select id="selectStudentById" resultType="Student">
      select  sid,sname from  student where sid=#{xxx}
    </select>
    
</mapper>

對應的測試類代碼

package cn.bdqn.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import cn.bdqn.bean.Student;
import cn.bdqn.dao.StudentDao;
import cn.bdqn.util.SessionUtil;

public class TeacherTest {
    StudentDao dao;
    SqlSession session;

    @Before
    public void before() {
        // 因為需要關閉session 需要把session提取出去
        session = SessionUtil.getSession();
        dao = session.getMapper(StudentDao.class);
    }

    @After
    public void after() {
        if (session != null) {
            session.close();
        }
    }

    /**
     * 驗證一級緩存的存在
     * myBatis的一級緩存是一直開啟的,並且不能關閉!
     */
    @Test
    public void test1() {
        Student student = dao.selectStudentById(1);
        System.out.println(student);
        //再次查詢相同的id對象
        Student student2 = dao.selectStudentById(1);
        System.out.println(student2);
    }
    
}

查詢語句的結果是:

技術分享

只有一條查詢結果!

驗證mybatis緩存查詢的依據!

在dao中增加一個方法

public interface StudentDao {
    /**
     *  驗證mybatis緩存查詢的依據!
     */
    Student selectStudentById(Integer sId);
    
    Student selectStudentById2(Integer sId);
}

修改mapper文件

<?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="cn.bdqn.dao.StudentDao">

    <!-- 查詢指定學生的信息    驗證mybatis緩存查詢的依據! 
          兩個查詢語句的id不一致,但是sql語句一樣-->
     <select id="selectStudentById" resultType="Student">
      select  sid,sname from  student where sid=#{xxx}
    </select>
    
     <select id="selectStudentById2" resultType="Student">
      select  sid,sname from  student where sid=#{xxx}
    </select>
    
</mapper>

增加測試代碼

   /**
     * 驗證查詢的依據
     * 兩個查詢都是查詢id為1的學生對象,但是查詢語句的id不一致
     */
    @Test
    public void test2() {
        Student student = dao.selectStudentById(1);
        System.out.println(student);
        //再次查詢相同的id對象
        Student student2 = dao.selectStudentById2(1);
        System.out.println(student2);
    }

修改log4j配置文件

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %c %L %m %n

#log4j.rootLogger=trace,console
log4j.logger.cn.bdqn.dao.StudentDao=trace,console
#修改成對應的mapper文件中的namespace,就不會顯示其他信息了

查詢的結果是:

技術分享

    /**
     * 得到的結論是:
     *  mybatis的查詢依據是  :  mapper文件中sql的id   + sql語句!
     *  hibernate底層查詢的依據是: 查詢對象的id!
     *  
     *  其實緩存的底層是一個map,
     *  map的key就是查詢依據,value是查詢的結果!
     */

驗證增刪改查對一級緩存的影響!

在dao中增加一個新增的方法

    /**
     * 驗證增刪改查對一級緩存的影響!
     */
    void addStudent(Student student);

在mapper中新增

    <!-- 新增一個學生 -->
    <insert id="addStudent">
      insert into student values(#{sId},#{sName})
      <!--#{sId},#{sName} 對應的是實體類中的屬性名  -->
    </insert>

增加測試代碼

    /**
     * 驗證增刪改對一級緩存的影響
     * 之前是只有一條查詢語句!
     * 但是加上新增語句之後發現出現了再次查詢!
     * 
     * 因為增刪改查操作都要清空緩存,把數據同步到數據庫,
     * 保證後續的查詢得到正確的結果集!
     */
    @Test
    public void test3() {
        Student student = dao.selectStudentById(1);
        System.out.println(student);
        dao.addStudent(new Student(66, "新增學生"));
        //再次查詢相同的id對象
        Student student2 = dao.selectStudentById(1);
        System.out.println(student2);
    }

得到的結果是:

技術分享

mybatis12一級緩存