Mybatis
一. Mybatis框架式如何实现分页的?
- 逻辑分页:将所有数据查询出来,在内存中进行分页处理。
- 物理分页:直接在数据库中进行分页。
具体实现: - 自己写sql进行物理分页。
- 使用拦截器进行物理分页。
- 使用PageHelper进行物理分页。
- RowBounds进行逻辑分页。
二. MyBatis中的缓存机制:
MyBatis中有两级缓存:一级缓存和二级缓存。 - 一级缓存是sqlSession级别的缓存,第一次查询数据库,然后将数据缓存到HashMap中,key是mybatis自动生成的,value是查询出来的数据,后面再次查询会从一级缓存(hashMap)中查询。
一级缓存何时清除:对该数据进行增删改、session提交和关闭也会清空缓存。
![image]()
三、注意事项: - 一级缓存时SqlSession级别的缓存,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会再从数据库查询。
- 一级缓存时默认开启的,不能关闭,但是可以调用SqlSession的clearCache()方法清理缓存。
- 不同SqlSession之间的缓存数据是隔离的,即一个SqlSession中的缓存数据在另一个SqlSession中读取不到。
- 一级缓存的作用访问可以配置两种:
local-cache-scope:statement
local-cache-scope:session(默认是session)
四、一级缓存失效的情况: - 不同的SqlSession
- 查询条件不同。
- 两次SqlSession查询期间做了增删改的操作。
- 两次SqlSession查询期间手动清理了缓存。
五、Dao层如何走一级缓存,下面的代码中不会有一级缓存。每个goodDao.selectById(id)都会开启新的SqlSession。
public GoodDTO getGood(Integer id){
GoodDO goodDO = goodDao.selectById(id);
GoodDTO goodDTO = new GoodDTO();
BeanUtils.copyProperties(goodDO, goodDTO);
GoodDO goodDO1 = goodDao.selectById(id);
return goodDTO;
}
上面的代码在方法上加上@Transactional,这样每个goodDao.selectById(id)都在同一个SqlSession中。
@Transactional
public GoodDTO getGood(Integer id){
GoodDO goodDO = goodDao.selectById(id);
GoodDTO goodDTO = new GoodDTO();
BeanUtils.copyProperties(goodDO, goodDTO);
GoodDO goodDO1 = goodDao.selectById(id);
return goodDTO;
}
六. 二级缓存
- 二级缓存默认是关闭的,开启二级缓存,需要同事有如下两项
![image]()
- 二级缓存时跨SqlSession的,多个SqlSession可以共用同一个二级缓存。
- 二级缓存时mapper级别的缓存,根据mapper和namespace区分,两个mapper的namespace相同,则两个mapper执行sql查询到的数据将缓存到相同的二级缓存区域中。
- 使用二级缓存的POJO类要实现serializable接口。



浙公网安备 33010602011771号