一、什么是延迟加载
resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射), association、collection具有延迟加载功能。
延迟加载:先从单表查询,需要的时候再去关联表查询,大大提高数据库的性能,因为查询单表要比关联查询多张表速度更快。
二、使用 association 实现延迟加载
1、xxxMapper.xml
<resultMap type="day01.Orders" id="FindOrderUserByLasyLoading">
<!-- 对订单信息进行映射配置 -->
<id column="id" property="id"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!-- 实现对用户信息的延迟加载
select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement)
要使用 userMapper.xml中的getOne完成根据用户id(user_id)查询用户信息,因此加上 userMapper.xml的namespace
column:订单信息中关联用户信息查询的列,即user_id -->
<association property="user" javaType="day01.User" select="day02.UserMapper.getOne" column="user_id">
</association>
</resultMap>
<select id="findOrderUserByLasyLoading" resultMap="FindOrderUserByLasyLoading">
select * from orders
</select>
2、延迟加载的配置(在SqlMapConfig中进行)
<!-- 开启延迟加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
3、测试:
@Test
public void test3() {
SqlSession sqlSession=sqlSessionFactory.openSession();
UserCustomMapper userCustomMapper=sqlSession.getMapper(UserCustomMapper.class);
//在这里不会去查询user,只会发送一条sql语句去查询orders
List<Orders> list=userCustomMapper.findOrderUserByLasyLoading();
for(Orders orders:list) {
//此时才会再发送一条sql语句去查询user信息,若当前user和上一次循环的user一样,仍然不会发送sql语句。
User user = orders.getUser();
System.out.println(user);
}
sqlSession.close();
}