Mybatis

一. Mybatis框架式如何实现分页的?

  1. 逻辑分页:将所有数据查询出来,在内存中进行分页处理。
  2. 物理分页:直接在数据库中进行分页。
    具体实现:
  3. 自己写sql进行物理分页。
  4. 使用拦截器进行物理分页。
  5. 使用PageHelper进行物理分页。
  6. RowBounds进行逻辑分页。
    二. MyBatis中的缓存机制:
    MyBatis中有两级缓存:一级缓存和二级缓存。
  7. 一级缓存是sqlSession级别的缓存,第一次查询数据库,然后将数据缓存到HashMap中,key是mybatis自动生成的,value是查询出来的数据,后面再次查询会从一级缓存(hashMap)中查询。
    一级缓存何时清除:对该数据进行增删改、session提交和关闭也会清空缓存。
    image
    三、注意事项:
  8. 一级缓存时SqlSession级别的缓存,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会再从数据库查询。
  9. 一级缓存时默认开启的,不能关闭,但是可以调用SqlSession的clearCache()方法清理缓存。
  10. 不同SqlSession之间的缓存数据是隔离的,即一个SqlSession中的缓存数据在另一个SqlSession中读取不到。
  11. 一级缓存的作用访问可以配置两种:
    local-cache-scope:statement
    local-cache-scope:session(默认是session)
    四、一级缓存失效的情况:
  12. 不同的SqlSession
  13. 查询条件不同。
  14. 两次SqlSession查询期间做了增删改的操作。
  15. 两次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;
    }

六. 二级缓存

  1. 二级缓存默认是关闭的,开启二级缓存,需要同事有如下两项
    image
  2. 二级缓存时跨SqlSession的,多个SqlSession可以共用同一个二级缓存。
  3. 二级缓存时mapper级别的缓存,根据mapper和namespace区分,两个mapper的namespace相同,则两个mapper执行sql查询到的数据将缓存到相同的二级缓存区域中。
  4. 使用二级缓存的POJO类要实现serializable接口。
posted @ 2025-07-08 15:50  Charlie-Pang  阅读(11)  评论(0)    收藏  举报