一级缓存:与数据库同一次会话期间查询到的数据会放在本地缓存中,以后如果需要获取相同的数据,直接从缓存中拿,没必要再去查询数据库。
package com.gong.mybatis.test; import java.io.IOException; java.io.InputStream; java.util.ArrayList; java.util.Arrays; java.util.HashMap; java.util.List; java.util.Map; org.apache.ibatis.io.Resources; org.apache.ibatis.session.sqlSession; org.apache.ibatis.session.sqlSessionFactory; org.apache.ibatis.session.sqlSessionFactoryBuilder; org.junit.Test; com.gong.mybatis.bean.Department; com.gong.mybatis.bean.Employee; com.gong.mybatis.dao.EmployeeMapper; com.gong.mybatis.mapper.EmployeeMapperDynamicsql; public class TestMybatis4 { public sqlSessionFactory getsqlSessionFactory() throws IOException { String resource = "mybatis-config.xml"; InputStream is = Resources.getResourceAsStream(resource); return new sqlSessionFactoryBuilder().build(is); } @Test void test() IOException { sqlSessionFactory sqlSessionFactory = getsqlSessionFactory(); sqlSession openSession = sqlSessionFactory.openSession(); try { EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.); Employee em = mapper.getEmpById(1); System.out.println(em); Employee em2 = mapper.getEmpById(1); System.out.println(em2); System.out.println(em == em2); openSession.commit(); } finally { // TODO: handle finally clause openSession.close(); } } }
输出结果:
DEBUG 01-22 10:18:00,037 ==> Preparing: select id,last_name lastName,email,gender from tbl_employee where id = ? (BaseJdbcLogger.java:145) DEBUG 01-22 10:18:00,108 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145) DEBUG 01-22 10:18:00,175 <== Total: 1 (BaseJdbcLogger.java:145) Employee [id=1,lastName=dema,1)">genderemail=dema@qq.com,1)">dept=null] Employee [idtrue
说明:一级缓存的作用:在一次会话中,使用了相同的查询方法,所以系统只会发送一次sql请求,同时可以看到,em和em2是同一个对象,说明em2并不是重新发送sql请求得到的,而是直接从缓存中获得的。
一级缓存失效的四种情况:
1、使用不同的sqlSession对象
); Employee em = mapper.getEmpById(1); System.out.println(em); sqlSession openSession2 = sqlSessionFactory.openSession(); EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class); Employee em2 = mapper2.getEmpById(1); System.out.println(em2); System.out.println(em == em2); openSession.commit(); } openSession.close(); } } }
结果:
DEBUG 01-22 10:23:05,279 ==> Preparing: select id,gender from tbl_employee where id = ? (BaseJdbcLogger.java:145) DEBUG 01-22 10:23:05,323 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145) DEBUG 01-22 10:23:05,367 ==> Preparing: select id,gender from tbl_employee where id = ? (BaseJdbcLogger.java:145) DEBUG 01-22 10:23:05,388 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145) DEBUG 01-22 10:23:05,393 <== Total: 1 (BaseJdbcLogger.java:145) Employee [idfalse
); System.out.println(em); sqlSession openSession2 = sqlSessionFactory.openSession(); EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class); Employee em2 = mapper.getEmpById(3 openSession.close(); } } }
输出:
DEBUG 01-22 10:25:29,976 ==> Preparing: select id,gender from tbl_employee where id = ? (BaseJdbcLogger.java:145) DEBUG 01-22 10:25:30,021 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145) DEBUG 01-22 10:25:30,086 DEBUG 01-22 10:25:30,088 (BaseJdbcLogger.java:145) DEBUG 01-22 10:25:30,093 Parameters: 3(Integer) (BaseJdbcLogger.java:145) DEBUG 01-22 10:25:30,096 <=3,1)">=小红,1)">=0,1)">=xiaohong@qq.com,1)">false
3、同一个sqlSession,但在两次查询之间执行了增删改操作
EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class); mapper.deleteEmp(5); Employee em2 = mapper.getEmpById(1DEBUG 01-22 10:27:54,536 ==> Preparing: select id,gender from tbl_employee where id = ? (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,586 ==> Parameters: 1(Integer) (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,636 Preparing: delete from tbl_employee where id=? (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,640 Parameters: 5(Integer) (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,700 <== Updates: 1 (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,702 Parameters: 1(Integer) (BaseJdbcLogger.java:145) DEBUG 01-22 10:27:54,712 <false
4、同一个sqlSession,但手动清除了一级缓存
即在两次查询之间使用了:
openSession.clearCache();