mybatis提供了懒加载机制, 需要使用resultMap才能使用懒加载机制(resultType不支持懒加载)
全局配置文件:
<settings>
<!-- 两个属性组合使用,才能使懒加载生效 -->
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
懒加载方式查询订单及其所属用户:
查询订单, 当使用到用户的属性时才去查询用户的信息。
<resultMap type="com.changez.sm.base.bean.Orders" id="lazyQueryOrderAndUser">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="order_num" property="orderNum"/>
<result column="create_time" property="createTime"/>
<association property="user" javaType="com.changez.sm.base.bean.User"
column="user_id" //传递结果集中的user_id值到select指定的statementsql语句以作为参数
select="com.changez.sm.mapper.UserMapper.getUserById">
</association>
</resultMap>
查询订单信息时, 懒加载查询用户信息
<select id="queryOrderAndUserLoading" resultMap="lazyQueryOrderAndUser">
SELECT t.* from temp_changez_orders t where t.id=3
</select>
查询用户信息:
<select id="getUserById" parameterType="string" resultType="user">
select * from temp_changez_user t where t.id=#{id}
</select>
测试代码:
@Test
public void lazyLoading() {
OrdersController ordersController = (OrdersController) applicationContext.getBean("ordersController");
// 使用懒加载, 最开始仅会查询orders的信息,可以查看控制台日志,当前近执行了查询orders表的sql
Orders a = ordersController.queryOrderAndUserLoading();
System.out.println(a.getId()+", "+a.getOrderNum());
//当使用到orders中的user属性时,才去加载user对象的信息,可查看控制台日志, 此时才执行查询user表的sql
System.out.println(a.getUser().getUsername()+", "+a.getUser().getSex());
System.out.println(1111);
}