SSM(四)Mybatis延迟加载

1.概念

MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询。延迟加载可以有效的减少数据库压力。

2.关联对象的加载时机

①.直接加载

执行完对主加载对象的select语句,马上执行对关联对象的select查询

②.侵入式延迟加载

执行对主加载对象的查询时,不会执行对关联对象的查询。但是当要访问主加载对象的详情时,就会马上执行关联对象的select查询。即对关联对象的查询执行,侵入到了主加载对象的详情访问中。也可以这样理解:将关联对象的详情侵入到了主加载对象的详情中,即将关联对象的详情作为主加载对象详情的一部分出现了

③.深度延迟加载

执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象或关联对象详情时,才会执行对关联对象的select查询。

3.XML大配置

①.侵入式延迟(侵入式延迟默认为true,所以只要启动延迟就默认是侵入式延迟)

1 <settings>
2       <setting name="lazyLoadingEnabled" value="true"/>
3 </settings>

②.深度延迟(只需把侵入式延迟aggressiveLazyLoading设置为false)

1 <settings>
2       <setting name="lazyLoadingEnabled" value="true"/>
3       <setting name="aggressiveLazyLoading" value="false"/>
4 </settings>

4.例子和测试

接口:

 1 package cn.sohappy.acourses.course0921;
 2 
 3 import cn.sohappy.acourses.bean.BillManyToOne;
 4 import cn.sohappy.acourses.bean.UserOneToMany;
 5 import cn.sohappy.bean.Smbms_user;
 6 
 7 import java.util.List;
 8 
 9 public interface IUserDAO {
10 
11     //03.oneToMany,多条sql查询,传入user,返回包含账单信息的user
12     UserOneToMany getUserOneToManyBillsMultiSQL(UserOneToMany user);
13 }

XML片段:

 1 <!--03.oneToMany多条sql-->
 2     <resultMap id="UserOneToManyBillsMultiSQL" type="cn.sohappy.acourses.bean.UserOneToMany" autoMapping="false">
 3         <id property="id" column="id"/>
 4         <result property="username" column="userName"/>
 5         <!--select为第二条sql名,column为第一条sql结果中的字段名,其值作为第二条sql的条件-->
 6         <collection property="bills" ofType="cn.sohappy.acourses.bean.BillManyToOne" select="selectBillsByUser" column="id"/>
 7     </resultMap>
 8     <select id="selectBillsByUser" resultType="cn.sohappy.acourses.bean.BillManyToOne">
 9         select * from smbms_bill where createdBy=#{**}
10     </select>
11     <select id="getUserOneToManyBillsMultiSQL" resultMap="UserOneToManyBillsMultiSQL">
12         select * from smbms_user where userCode=#{usercode}
13     </select>

测试:

 1 public void onToManyMultiSQL(){
 2         SqlSession session = MyBatisUtil.getSession();
 3         IUserDAO mapper = session.getMapper(IUserDAO.class);
 4         UserOneToMany user = new UserOneToMany();
 5         user.setUsercode("zhangsan");
 6         /*侵入式延迟aggressiveLazyLoading,加载主对象属性时才会发送第二条sql
 7         * 深度延迟lazyLoadingEnabled,加载关联对象或关联对象属性时发送第二条sql*/
 8         //深度延迟,此处只发一条sql.侵入式延迟,此处发一条sql,不延迟,此处发两条sql(既获取user信息又获取bill信息)
 9         UserOneToMany userOneToMany = mapper.getUserOneToManyBillsMultiSQL(user);
10         //深度延迟,下行代码不发sql.侵入式延迟,下行代码将发送第二条sql(获取bill信息)
11 //        System.out.println(userOneToMany.getId()+","+userOneToMany.getUsername());
12         //深度延迟,下行代码将发送第二条sql(获取bill信息)
13         List<BillManyToOne> bills = userOneToMany.getBills();
14         /*for (BillManyToOne item: bills) {
15             System.out.println(item.getId()+","+item.getBillcode()+"."+item.getProductname());
16         }*/
17         session.close();
18     }
原文地址:https://www.cnblogs.com/tomasman/p/7666812.html