07-Mybatis延迟加载
在mybatis中只有resultMap标签的association标签和collection标签具有延迟加载的功能。
延迟加载的意思是在进行关联查询时,利用延迟加载,先加载主信息,需要关联信息时,再去按需加载关联信息。这样就会大大的提高数据库的性能,查询单表要比查询夺标速度要快的多。
设置延迟加载(打开延迟加载):Mybatis默认时不开启延迟加载的,需要我们去配置打开延迟加载。需要再全局配置文件中SqlMapConfig.xml中设置lazyLoadingEnabled,aggressiveLazyLoading
开启延迟加载:
<!-- 设置延迟加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
上面已经在全局配置文件中打开了延迟加载,下面我们就通过一个案例来测试是否已经可以使用延迟加载了:
需求分析:
查询订单信息及关联的用户信息。
编码实现:
编写Javabean:
public class OrdersExt extends Orders{
private User user;
//省略getter和setter方法
}
编写Mapper接口
public interface OrdersMapper {
public List<OrdersExt> findOrdersAndUserLazyLoading();
}
编写OrdersMapper.xml配置文件:
为了使用懒加载,把刚才的需求分解成,首先查询订单信息,然后再按需根据id查询用户信息。
这样就需要配置两个select标签语句;在进行关联查询的时候,association标签找那个的select 是把按需查询用户信息的statement的id,column的作用就是把查询出来的orders信息集合的外键user_id作为findUserById的入参。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lc.mybatis.mapper.OrdersMapper">
<!-- 需求:查询订单信息(主信息为订单,从信息为用户),并且对关联表进行懒加载 -->
<!-- 声明resultMap -->
<resultMap type="ordersExt" id="lazyloading">
<!-- 订单信息 -->
<id column="id" property="id"/>
<result column="user_id" property="user_id"/>
<result column="number" property="number"/>
<!-- 用户信息(一对一) -->
<!-- select属性:指定关联查询statement(即查询用户statement的id),然后将查询的结果封装到property指定的属性中去 -->
<!-- column属性:指定查询出来的列column属性的值,作为statement查询语句的入参 -->
<association property="user" select="findUserById" column="user_id"></association>
</resultMap>
<select id="findOrdersAndUserLazyLoading" resultMap="lazyloading">
SELECT * FROM ORDERS
</select>
<select id="findUserById" parameterType="user" resultType="user">
SELECT * FROM USER WHERE id=#{id}
</select>
<!-- 在mybatis中,resultMap标签 的association标签和collection标签具有延迟加载的功能。resultType结果映射就没有延迟加载 -->
</mapper>
编写测试类:
通过断点方式来测试是否使用了懒加载。在测试语句中得到lists处打断点,通过查询lists中的元素中的user属性是否为空,当执行到获取user对象后,再看lists中元素的user属性是否为空。
public class OrdersMapperTest {
private SqlSessionFactory sqlSessionFactory ;
@Before
public void setUp() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindOrdersAndUserLazyLoading() {
SqlSession sqlSession = sqlSessionFactory.openSession();
//获取UserMapper的代理类
OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
List<OrdersExt> lists = ordersMapper.findOrdersAndUserLazyLoading();
lists.get(0).getUser();
sqlSession.close();
}
}
显然通过测试:在第一次获取lists集合,集合中的元素中user属性为空,当获取user后,lists集合中元素的user属性就不为空。
原文:https://blog.youkuaiyun.com/ITITII/article/details/79999481