zoukankan      html  css  js  c++  java
  • 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     }
  • 相关阅读:
    菜鸟学Windows Phone 8开发(2)——了解XAML
    菜鸟学Windows Phone 8开发(1)——创建第一个应用程序
    Android6.0之来电转接号码显示修改
    Android之拨号界面图片风格,无信息默认显示界面修改
    Android之mtklog分析
    Android之常用Git命令
    Android开发之Git配置
    Android之Dialer之紧急号码
    Android之mtk上传log
    字节对齐
  • 原文地址:https://www.cnblogs.com/tomasman/p/7666812.html
Copyright © 2011-2022 走看看