延迟加载配置
- mybatis默认没有开启延迟加载,需要在config.xml中setting配置。
- lazyLoadingEnabled:true使用延迟加载,false禁用延迟加载,默认为false。
- aggressiveLazyLoading:true启用时,当延迟加载开启时访问对象中一个懒对象属性时,将完全加载这个对象的所有懒对象属性。false,当延迟加载时,按需加载对象属性(即访问对象中一个对象属性时,不会加载对象中的引用属性)。默认为true。
- 修改延迟加载需要的select语句
延迟加载场景分析
查询订单时,需要关联查询订单明细表
假设有10 个订单,每个订单有5个明细信息。
如果用户仅仅需要查看订单信息,不需要订单明细信息,但是查询了10+50个对象到内存(只有10个是用户想要的)。显然是增加内存的负担。
如果用户的需求仅仅是查询订单信息,我仅仅订单信息用户,没有查询订单的详情,那么,内存中只有10对象(10个对象全是客户想的),这样做显然 节省了内存。
业务需求特点:需要的时候在进行查询,不需要的时候不尽兴查询,这种情况就是延迟加载,也叫作懒加载。
配置过程
- 去掉sql语句中对user表的查询语句
- 对resultMap orderAndUser 进行修改
- 注意:查询订单时要同时查询userid,避免查询user时没有凭据
修改orderMapper.xml文件select语句
<!-- 关联属性延迟加载 -->
<select id="queryOrderAndUser" resultMap="orderAndUser">
select
o.id oids,o.orderid,o.createtime,o.note,o.userid
from orders o,t_user u
where o.userid=u.id
</select>
<resultMap type="orders" id="orderAndUser">
<id property="id" column="oids"></id>
<result property="orderId" column="orderid"></result>
<result property="createtime" column="createtime" />
<result property="note" column="note" />
<association property="user" javaType="users"
select="net.neuedu.mybatis.mapper.UserMapper.queryUserById" column="userid">
<!--
这里不查询用户的信息,而是将用的信息放在另外一个查询中
column是order表中的userid字段
-->
</association>
</resultMap>
因为在assocication多了一个select元素,就要在UserMapper中多加一个方法。
//根据ID查询用户
public Users queryUserById(Integer id);
在UserMapper.xml中添加queryUserById的select
<!-- public Users queryUserById(Integer id); -->
<select id="queryUserById" parameterType="int" resultType="users">
select * from t_user where id=#{id}
</select>