mybatis12一級緩存
阿新 • • 發佈:2017-09-17
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一級緩存