如果使用额外发送SQL的方式 加载关联对象
如果列表中关联的对象的id部分相同,那么mybatis发送的SQL数量会减少
由此判断,mybatis中一定存在一个缓存
下面就来说一下mybatis的一级缓存:
首先来做个测试 查询两个对象
1 // 测试mybatis的一级缓存 2 @Test 3 public void TestSqlSessionCache() { 4 try { 5 SqlSession session = MybatisUtil.openSession(); 6 EmployeeMapper employeeMapper = session 7 .getMapper(EmployeeMapper.class); 8 employeeMapper.get(1L); 9 employeeMapper.get(2L); 10 session.commit(); 11 session.close(); 12 } catch (Exception e) { 13 e.printStackTrace(); 14 } 15 }
发送两条SQL语句,
但是如果对一个对象查询两次,会发送几条SQL呢
1 // 测试mybatis的一级缓存 2 @Test 3 public void TestSqlSessionCache() { 4 try { 5 SqlSession session = MybatisUtil.openSession(); 6 EmployeeMapper employeeMapper = session 7 .getMapper(EmployeeMapper.class); 8 employeeMapper.get(1L); 9 employeeMapper.get(1L); 10 session.commit(); 11 session.close(); 12 } catch (Exception e) { 13 e.printStackTrace(); 14 } 15 }
结果会发现只发送一条SQL
1. 说明mybatis的SqlSession中也存在一个缓存,我们称之为一级缓存
2.一级缓存的生命周期和SqlSession一样长
3.在SqlSession中有一个clearCache方法可以清空一级缓存
4.回顾,在hibernate的session中还提供了一个evict(Object)方法可以清除一个指定的缓存对象,为什么mybatis中没有?
注意:在mybatis,根本不存在get,mybatis 中只有select,所以mybatis中所有的缓存,包括一级缓存和缓存,都是缓存的查询SQL
5.列表中关联的对象的id部分相同,那么mybatis发送的SQL数量会减少的真正原因:mybatis在查询的时候,把SQL和查询出来的对象进行缓存