1、 mybaatis延迟加载
1.1、什么是延迟加载
延迟加载:先查询单表,需要时再从关联表查询,有利于提高性能,因为查询单表要比查询多表快。
resultMap可以实现高级映射(使用association和collection实现),association和collection具有延迟加载功能。mybatis高级映射及association和collection的用法
需求:
如果查询订单并关联查询用户信息,若个先查询订单信息即可满足需求,当我们需要查询用户信息时再查询用户信息。把对用户信息的查询按需去查询就是延迟加载。
1.2、使用assocication实现延迟加载
1.2.1、需求
查询订单并且关联查询用户信息。
1.2.2、mapper.xml
需要定义两个mapper的方法对应的statement。
(1)只查询订单信息
在查询订单的statement中使用association去延迟加载 下边的statement关联查询用户信息
<select id="selectOrdersLazyLoading" resultMap="selectOrdersMap">
select * from orders
</select>
(2)只查询用户信息
通过上边查询到的订单信息中userId去关联查询用户信息
<select id="selectUserById" parameterType="int" resultType="user">
select * from user where id=#{value}
</select>
延迟加载 代码:使用association中的select指定延迟加载去执行的statement的id
<select id="selectUserById" parameterType="int" resultType="user">
select * from user where id=#{value}
</select>
<!-- 实现延迟加载的resultMap -->
<resultMap type="com.shuai.po.Orders" id="ordersMap">
<!-- 对订单信息映射配置 -->
<id column="id" property="id"/>
<!-- 实现对用户信息延迟加载
select:指定延迟加载需要执行的statement的id(是根据userId查询用户信息的statement),
column:订单信息中关联用户信息的列,即userId
-->
<association property="user" javaType="com.shuai.po.User" select="selectUserById" column="">
</association>
</resultMap>
<!-- 查询订单关联查询用户,用户信息需要延迟加载 -->
<select id="selectOrdersLazyLoading" resultMap="userId">
select * from orders
</select>
1.2.3、mapperj接口
//查询订单关联查询用户 ,用户信息延迟加载
public List<Orders> selectOrdersLazyLoading() throws Exception;
1.2.4、延迟加载配置
在mybatis全局配置xml中配置延迟加载的属性
<settings>
<!-- 打开延迟加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 设置按需加载 -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
1.2.5、测试
在执行selectOrdersLazyLoading获得订单信息时并不会执行查询用户信息的语句
当使用Orders中的user属性时将触发延迟加载,查询用户信息
@Test
public void test() {
SqlSession sqlSession=sf.openSession();
//创建代理对象
OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class);
//调用接口的方法
try {
List<Orders> list = ordersMapperCustom.selectOrdersLazyLoading();
//System.out.println(list); //触发了延迟加载
//通过getUser出发延迟
for(Orders orders:list) {
User user=orders.getUser();
System.out.println(user);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sqlSession.close();
}
结果:
当注释掉遍历输出时,没有直接执行查询用户的sql,只执行了查询订单的信息
当运行掉遍历输出时,直接执行查询用户的sql获取了用户信息(需要时执行)
1.2.6、延迟 思考
不使用mybaits提供的association即collection的延迟加载功能,如何实现延迟加载
方法:
定义两个mapper方法:
1、查询订单列表
2、根据用户id查给用户信息
实现思路:
先查询一个mapper方法,获取订单信息列表
在程序中(service),按需去调用第二个mapper方法去查询用户信息
总结:
使用延迟加载方法,先查询简单的dql(最好单表),再去按需加载关联查询的其它信息。
来源:CSDN
作者:任性的萝卜
链接:https://blog.csdn.net/weixin_44373940/article/details/104198951