Mybatis实现关联属性懒加载

延迟加载配置

  • mybatis默认没有开启延迟加载,需要在config.xml中setting配置。
  • lazyLoadingEnabled:true使用延迟加载,false禁用延迟加载,默认为false。
  • aggressiveLazyLoading:true启用时,当延迟加载开启时访问对象中一个懒对象属性时,将完全加载这个对象的所有懒对象属性。false,当延迟加载时,按需加载对象属性(即访问对象中一个对象属性时,不会加载对象中的引用属性)。默认为true。
  • 修改延迟加载需要的select语句

延迟加载场景分析

查询订单时,需要关联查询订单明细表
假设有10 个订单,每个订单有5个明细信息。
如果用户仅仅需要查看订单信息,不需要订单明细信息,但是查询了10+50个对象到内存(只有10个是用户想要的)。显然是增加内存的负担。
如果用户的需求仅仅是查询订单信息,我仅仅订单信息用户,没有查询订单的详情,那么,内存中只有10对象(10个对象全是客户想的),这样做显然 节省了内存。
业务需求特点:需要的时候在进行查询,不需要的时候不尽兴查询,这种情况就是延迟加载,也叫作懒加载。

配置过程

  1. 去掉sql语句中对user表的查询语句
  2. 对resultMap orderAndUser 进行修改
  3. 注意:查询订单时要同时查询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">
			
		association>
	resultMap>

因为在assocication多了一个select元素,就要在UserMapper中多加一个方法。

	//根据ID查询用户
	public Users queryUserById(Integer id);

在UserMapper.xml中添加queryUserById的select

	
	<select id="queryUserById" parameterType="int" resultType="users">
		select * from t_user where id=#{id}
	select>

你可能感兴趣的:(Mybatis)