ToB企服应用市场:ToB评测及商务社交产业平台

标题: Mybatis 懒加载使用及源码分析 [打印本页]

作者: 杀鸡焉用牛刀    时间: 2022-9-16 17:22
标题: Mybatis 懒加载使用及源码分析
Mybatis 懒加载的使用

什么是懒加载?懒加载的意思就是在使用的时候才去加载,不使用不去加载,相反的就叫饥饿加载或者立即加载。懒加载在Mybatis中一般是存在与联合查询的情况,比如查询一个对象的同时连带查询相关的表对应的数据。在Mybatis中查询可以通过ResultMap设置查询对象返回一个集合属性,也就是说像这样的:
  1. @Data
  2. public class User implements Serializable {
  3.     private int id;
  4.     private int age;
  5.     private String name;
  6.     private List<Order> orderList;
  7. }
复制代码
这里的orderList就是一个集合,在mapper.xml中配置如下:
  1. <resultMap id="userMap" type="mybatis.model.User">
  2.     <id column="id" property="id"/>
  3.     <result property="age" column="age"/>
  4.     <result property="name" column="name"/>
  5.     <collection property="orderList" ofType="mybatis.model.Order" column="id" select="findByUid"/>
  6. </resultMap>
  7. <select id="findByUid" resultType="mybatis.model.Order">
  8.     select * from `order` where uid = #{id}
  9. </select>
  10. <select id="selectById" resultMap="userMap">
  11.     select * from user where id = #{id}
  12. </select>
复制代码
可以看到这里查询User对象的时候还查询了Order列表,这个用户关联的订单信息。如果只是这样查询那么结果是饥饿加载:
  1. @Test
  2. public void testLazyLoad(){
  3.     SqlSession sqlSession = sqlSessionFactory.openSession();
  4.     UserMapper mapper = sqlSession.getMapper(UserMapper.class);
  5.     User user = mapper.selectById(1);
  6.     System.out.println(user.getName());
  7. }
复制代码
输出结果,执行了两个sql语句查询,说明查询User的同时也查询了Order
[code]09:52:56.575 [main] INFO mybatis.plugins.MyPlugin - 对方法进行增强....==>  Preparing: select * from user where id = ? ==> Parameters: 1(Integer) Parameters: 1(Integer) type, MethodHandler callback, List




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4