作者 | 浩说编程 来源 | 公众号:浩说编程 [ 大厂技术资源 | 研发必备安装包 | 经典必读电子书 | 限时免费获取 ] 问题导读 一、了解MyBatis的一级缓存、二级缓存吗? 追问-1:如何配置二级缓存? 追问-2:一级缓存和二级缓存的使用顺序? 二、MyBatis的分页原理是什么? 三、MyBatis如何实现一对多复杂查询? 一、了解MyBatis的一级缓存、二级缓存吗? 正经回答: 先说缓存,合理使用缓存是系统优化的常见手段。 将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询。 而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力。 同时提高系统性能。 一级缓存 一级缓存是SqlSession级别的缓存。 在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。 不同的sqlSession之间的缓存数据区域是互相不影响的。 也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。 一级缓存的工作原理: 与Redis同理,用户发起查询请求,查找某条数据,sqlSession先去缓存中查找,是否有该数据。 如果有,直接返回;如果没有,从数据库中查询,并将查询到的数据放入一级缓存区域,供下次查找使用。 但sqlSession执行commit,即增删改操作时会清空缓存。这么做的目的是避免脏读。 码文不易 你的关注是浩说编程持续更新的动力 浩说编程会做的更好 二级缓存 为什么要有二级缓存? 二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存。 二级缓存是跨SqlSession的。二级缓存的作用范围更大。 在实际开发中,MyBatis通常和Spring进行整合开发。 Spring将事务放到Service中管理,对于每一个service中的sqlsession是不同的。 这是通过mybatis-spring中的 org.mybatis.spring.mapper.MapperScannerConfigurer创建sqlsession自动注入到service中的。 每次查询之后都要进行关闭sqlSession,关闭之后数据即被清空。 所以spring整合之后,如果没有事务,一级缓存是没有意义的。深入追问:追问-1:如何配置二级缓存? MyBatis对二级缓存的支持粒度很细,它会指定某一条查询语句是否使用二级缓存。 1、MyBatis支持二级缓存的总开关,全局配置变量cacheEnabled=true 在mybatis-config.xml添加123 2、该select语句所在的Mapper,配置 或节点 3、该select语句的参数 useCache=true insert into xxx (name, price) values (#{name}, #{price})