MyBatis相关面试题
提示:MyBatis相关面试题,持续更新中
文章目录
- 1、MyBatis框架是如何实现分页的?
- 2、说一说MyBatis框架里面的缓存机制是怎么回事?
- (1)一级缓存
- (2)二级缓存
1、MyBatis框架是如何实现分页的?
分页分为两种:逻辑分页:将所有数据查询出来,再在内存中进行分页处理;物理分页:直接在数据库中进行分页;具体实现:1、自己写SQL进行分页;(物理分页)2、使用拦截器进行分页;(物理分页)3、使用PageHelper进行分页;(物理分页)4、使用RowBounds进行分页;(逻辑分页)
2、说一说MyBatis框架里面的缓存机制是怎么回事?
MyBatis中有两级缓存:一级缓存 和 二级缓存;
(1)一级缓存
1、一级缓存是SqlSession级别的缓存, 通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会再从数据库查询;2、一级缓存是默认开启的,是不能关闭的,但可以调用SqlSession的clearCache()方法清理缓存;3、不同SqlSession之间的缓存数据是隔离的,即一个SqlSession中的缓存数据在另一个SqlSession中是读取不到的;4、一级缓存的作用范围可以配置两种:local-cache-scope: statement(配置后,会清理缓存,相当于缓存失效)local-cache-scope: session(默认)--------------------------------------------------------------------------------------------------------------------一级缓存失效的几种情况1、不同的SqlSession对应不同的一级缓存;2、同一个SqlSession但是查询条件不同;3、同一个SqlSession两次查询期间执行了任何一次增删改操作;4、同一个SqlSession两次查询期间手动清空了缓存;--------------------------------------------------------------------------------------------------------------------注:以下代码,若不开启事务,每一次的goodsDao.queryByPage()都是新的sqlsession不会存在一级缓存,只有开启事务后,才会有一级缓存@Resourceprivate GoodsDao goodsDao;//@Transactional@Overridepublic List<Goods> queryByPage(Integer startRow, Integer pageSize) {List<Goods> list1 = goodsDao.queryByPage(startRow, pageSize);System.out.println("查詢1:" + list1 + "\n");List<Goods> list2 = goodsDao.queryByPage(startRow, pageSize);System.out.println("查詢2:" + list2 + "\n");return list2;}
(2)二级缓存
二级缓存在SqlSession提交或关闭后才生效;
二级缓存默认是关闭的,开启二级缓存,需要同时有如下两项:application.yml mybatis:configuration:cache-enabled: trueMapper.xml<cache/>二级缓存是跨SqlSession的,多个SqlSession可以共用同一个二级缓存;二级缓存是mapper级别的缓存,根据mapper的namespace区分,两个mapper的namespace相同,则这两个mapper执行sql查询到的数据将缓存到相同的二级缓存区域中;使用二级缓存的POJO类要实现Serializable接口;