1 延迟加载
延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。
2 使用association实现延迟加载
<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
SELECT
*
FROM
orders
</select>
b 关联查询用户信息
<!-- 通过用户id查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="cn.minyan.mybatis.bean.User">
SELECT
*
FROM
user
WHERE
id = #{id}
</select>
上边先去执行findOrdersUserLazyLoading,当需要去查询用户的时候再去执行findUserById,通过resultMap的定义将延迟加载执行配置起来。
3 延迟加载resultMap
使用association中的select指定延迟加载去执行的statement的id。
<!-- 延迟加载的resultMap -->
<resultMap type="cn.minyan.mybatis.bean.Orders" id="OrdersUserLazyLoadingResultMap">
<!-- 对订单信息进行映射设置 -->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<association property="user" javaType="cn.minyan.mybatis.bean.User"
select="cn.minyan.mybatis.dao.Mapper.findUserById" column="user_id">
</association>
</resultMap>
4 mapper.java
public List<Orders> findOrdersUserLazyLoading() throws Exception;
5 测试
a 测试思路1、执行上边mapper方法(findOrdersUserLazyLoading),内部去调用cn.minyan.mybatis.mapper.OrdersMapperCustom中的findOrdersUserLazyLoading只查询orders信息(单表)。
2、在程序中去遍历上一步骤查询出的List<Orders>,当我们调用Orders中的getUser方法时,开始进行延迟加载。
3、延迟加载,去调用UserMapper.xml中findUserbyId这个方法获取用户信息。
b 延迟加载配置lazyLoadingEnabled、aggressiveLazyLoading
设置项 | 描述 | 允许值 | 默认值 |
lazyLoadingEnabled | 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。 | true | false | false |
aggressiveLazyLoading | 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 | true | false | true |
<!-- 全局配置参数,需要时在配置 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
注意:若SqlMapConfig.xml中还有其他配置,settings需要放在最上面
/**
* 测试延迟加载
* @throws Exception
*/
@Test
public void findOrdersUserLazyLoadingTest() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
Mapper mapper = sqlSession.getMapper(Mapper.class);
System.out.println("===> " + mapper.getClass());
List<Orders> orders = mapper.findOrdersUserLazyLoading();
System.out.println("===> " + orders);
for (Orders order : orders) {
User user = order.getUser();
System.out.println("===> " + user);
}
sqlSession.close();
}