Mybatis基础学习笔记(六)-缓存与懒加载
Mybatis基础学习笔记
懒加载
- 在一对多查询过程中面临一个问题,如一个用户下有一个有大量数据的账户,在查询时面临可能不需要加载用户账户信息的问题
- 立即加载:多对一、一对一:通常需要立即加载
- 延迟加载:一对多、多对多:应该按需加载,使用延迟加载
使用位置
-
<resultMap id="blogResult" type="Blog"> <association property="author" column="author_id" javaType="Author" select="selectAuthor"/> </resultMap>
-
参数解析:
- property 映射到列结果的字段或属性
- javaType 一个 Java 类的完全限定名,或一个类型别名,如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。
- column 数据库中的列名,或者是列的别名
- select 用于加载复杂类型属性的映射语句的 ID,它会从 column 属性指定的列中检索数据,作为参数传递给目标 select 语句。
- fetchType 可选的。有效值为 lazy 和 eager。 指定属性后,将在映射中忽略全局配置参数 lazyLoadingEnabled,使用属性的值。
-
主配置文件中的设置:
缓存
- 存在于内存中的临时数据,使用缓存能减少与数据库的交互次数,提高执行效率,对于经常查询,不经常更改的数据,且数据正确与否队最终结果影响不大的时候非常适合使用缓存
- 一级缓存:存在于sqlsession
- 无需配置
- sqlsession的缓存:存在于sqlsession中,结构为一个Map,当重复查询一个数据时,如果sqlsession中存在同样的数据,会直接从缓存中获取,在sqlseeion关闭时释放或者调用sqlsession的clearCache()方法
- 对于同一个sqlsession在两次查询间进行更新数据库则不会再从缓存中获取
- 存在的问题:一个方法中两个sqlsession对象在另一个sqlsession对象更新操作时,进行查询的sqlsession任然会从缓存中获取数据,导致数据错误
- 二级缓存:存在于SqlsessionFactory
- 使用方式:
- 主配置文件设置:默认为true,无需配置
- 在mapper的select标签下增加userCache属性,设置其为true
- 存放数据:表中一行数据,并没有组装到实体类中,所以查询返回的对象是不同的
- 使用方式: