一级缓存
一级缓存: 同一个SqlSession对象, 第一次 查询 学号为1 的学生信息,从数据库查询,查询后将对象 放入内存(缓存中) 当 第n(n>1)次继续查询学号为1 的信息 ,直接从 缓存中获取. 只要 commit 就会清理所有缓存对象.(将学号为1的信息从内存中 移除) mybatis 默认开启一级缓存,如果用同样的SqlSession对象查询相同的数据,则只会在第一次查询时向数据库发送sql,并将查询结果 放入到 SQLSession(作为缓存) 后续再次查询该同样的对象,则直接从缓存中获得对象,不在访问数据库
一级缓存 是 SqlSession缓存, 一级缓存的作用域 默认是 同一个SqlSession
Mybatis默认开启 一级缓存, 也就是 再同一个SqlSession中执行相同的查询sql, 第一次回查询数据库,并写到缓存中
第二次直接 去缓存中取
当执行sql查询时 发生了 增删改的操作,mybatis会把 sqlsession 的缓存清空
@Test public void findAll() throws Exception{ //mybatis配置文件的路径 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //获得 SqlSessionFactory 对象 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获得 SqlSession ,该对象 类似 JDBC中的 Connection对象 SqlSession session = sqlSessionFactory.openSession(); //利用session获得 接口信息 DeptMapper deptMapper = session.getMapper(DeptMapper.class); //调用接口的方法,执行 查询 List<Dept> list = deptMapper.findAll(); //遍历 list for (Dept d:list){ //输出信息 System.out.println(d.getId()+"-----"+d.getName()); } // session.commit(); System.out.println("-----------------------------------------------"); //调用接口的方法,执行 查询 List<Dept> list2 = deptMapper.findAll(); //遍历 list for (Dept d:list2){ //输出信息 System.out.println(d.getId()+"-----"+d.getName()); } //关闭session session.close(); //关闭流对象 inputStream.close(); }
DEBUG [main] -> Preparing: select * from dept DEBUG [main] -> Parameters: DEBUG [main] -<== Total: 4 1-----开发部 2-----测试部 3-----财务部
4-----ppp
-------------------------------------------- 第二遍 没有 执行 查询
1-----开发部 2-----测试部 3-----财务部 4-----ppp
观察发现 第二次执行同样的 方法 ,并没有执行 数据库的查询,而是直接从缓存里 取
放开 // session.commit(); 去掉 // 去掉注释 ,当事务提交时, 缓存清空,因此又会 查询数据库
DEBUG [main] -> Preparing: select * from dept DEBUG [main] -> Parameters: DEBUG [main] -<== Total: 4 1-----开发部 2-----测试部 3-----财务部 4-----ppp -------------------commit---------------------------- DEBUG [main] -> Preparing: select * from dept DEBUG [main] -> Parameters: DEBUG [main] -<== Total: 4 1-----开发部 2-----测试部 3-----财务部 4-----ppp