需要查询关联信息时,使用mybatis延迟加载特性可有效的减少数据库压力,首次查询只查询主要信息,关联信息等用户获取时再加载。
- 打开延迟加载开关
在mybatis核心配置文件中配置:lazyLoadingEnabled、aggressiveLazyLoading
设置项 |
描述 |
允许值 |
默认值 |
lazyLoadingEnabled |
全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。 |
true | false |
false |
aggressiveLazyLoading |
当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 |
true | false |
true |
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
一对一查询延迟加载
需求:查询订单信息,关联查询用户信息。默认只查询订单信息,当需要查询用户信息时再去查询用户信息。
sql语句:SELECT orders.* FROM orders
<select id="findOrdersList3" resultMap="userordermap2">
SELECT
orders.*
FROM
orders
</select>
在Mapper.xml配置statement语句,用于查询订单表
orders表中有user_id外键,可以利用该外键关联查询user表的用户信息
<select id="findUserById" parameterType="java.lang.Integer" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM user WHERE id = #{id}
</select>
在Mapper.xml配置查询用户statement语句
<!-- 订单信息resultmap -->
<resultMap type="cn.itcast.mybatis.po.Orders" id="userordermap2">
<id property="id" column="id"/>
<result property="user_id" column="user_id"/>
<result property="number" column="number"/>
<association property="user" javaType="cn.itcast.mybatis.po.User" select="findUserById" column="user_id"/>
</resultMap>
association:
select="findUserById":指定关联查询sql为findUserById
column="user_id":关联查询时将users_id列的值传入findUserById
最后将关联查询结果映射至cn.itcast.mybatis.po.User。
public List<Orders> findOrdersList3() throws Exception;
Dao接口类方法
总结:
延迟加载思想:先进行一次单表查询,而且该表必须含有延迟加载表的外键
当延迟加载关联表时,在Mapper.xml中配置statement语句,配置select和colum属性
延迟加载有三个条件
1.必须是resultMap输出映射
2.必须是collection标签(即类中有List<T>属性)
3.必须是association标签(即类中有包装pojo类属性)