级缓存
-
默认开启. 线程级别的缓存, SqlSession 的缓存;
-
在一个 SqlSession 生命周期中有效. SqlSession 关闭,缓存清空;
-
在同一个 SqlSession 中, Mybatis 会把执行的方法和参数通过算法生成缓存的键值, 将键值和结果 存放在一个 Map 中, 如果后续的键值一样, 则直接从 Map 中获取数据;
-
不同的 SqlSession 之间的缓存是相互隔离的;
-
用一个 SqlSession, 可以通过配置使得在查询前清空缓存;flushCache="true"
-
任何的 UPDATE, INSERT, DELETE 语句都会清空缓存。
二级缓存
-
进程级别的缓存, SqlSessionFactory 的缓存
-
在一个SqlSessionFactory生命周期中有效. 可以在多个SqlSession 生命中期中共享.
-
默认关闭, 需要使用的时候, 要为某个命名空间开启二级缓存(在 mapper.xml 中配置cache).
-
由于在更新时会刷新缓存, 因此需要注意使用场合:查询频率很高, 更新频率很低时使用, 即经 常使用 select, 相对较少使用delete, insert, update。
-
缓存是以 namespace 为单位的,不同 namespace 下的操作互不影响。但刷新缓存是刷新整个 namespace 的缓存, 也就是你 update 了一个, 则整个缓存都刷新了。
-
最好在 「只有单表操作」 的表的 namespace 使用缓存, 而且对该表的操作都在这个 namespace 中。 否则可能会出现数据不一致的情况。 二级缓存应用场景: 对于访问多的查询请求并且用户对查询结果实时性要求不高的情况下,可采用mybatis二级缓存,降低 数据库访问量,提高访问速度,如电话账单查询 根据需求设置相应的flushInterval:刷新间隔时间,比如三十分钟,24小时等。。
列名和属性名不一致问题
如果查询时使用 resultType 属性, 表示采用 MyBatis 的Auto-Mapping(自动映射)机制, 即相同的列名和 属性名会自动匹配. 因此, 当数据库表的列名和类的属性名不一致时, 会导致查不到数据. 解决该问题可以 有两种方式: 查询时, 可以通过列别名的方式将列名和属性名保持一致,继续使用自动映射, 从而解决该问题. 但是较为 麻烦. <!-- 开启二级缓存, 要求实体类进行序列化 --> <cache />
-
使用resultMap resultMap用于自定义映射关系, 可以由程序员自主制定列名和属性名的映射关系. 一旦使用 resultMap, 表示不再采用自动映射机制. 20.1. 关系映射查询 数据库中表与表之间的关系: 一对一 (人->身份证) 一对多 (夏令营->学生) 多对一 (学生->班级) 多对多 (学生->课程) 20.2. resultMap 的关联方式实现多表查询(一对一|多对一)
-
在 StudentMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到