SSM(四)Mybatis延遲加載

1.概念java

MyBatis中的延遲加載,也稱爲懶加載,是指在進行關聯查詢時,按照設置延遲加載規則推遲對關聯對象的select查詢。延遲加載能夠有效的減小數據庫壓力。sql

2.關聯對象的加載時機數據庫

 

①.直接加載session

 

執行完對主加載對象的select語句,立刻執行對關聯對象的select查詢app

 

②.侵入式延遲加載測試

執行對主加載對象的查詢時,不會執行對關聯對象的查詢。可是當要訪問主加載對象的詳情時,就會立刻執行關聯對象的select查詢。即對關聯對象的查詢執行,侵入到了主加載對象的詳情訪問中。也能夠這樣理解:將關聯對象的詳情侵入到了主加載對象的詳情中,即將關聯對象的詳情做爲主加載對象詳情的一部分出現了 spa

 

③.深度延遲加載code

 

執行對主加載對象的查詢時,不會執行對關聯對象的查詢。訪問主加載對象的詳情時也不會執行關聯對象的select查詢。只有當真正訪問關聯對象或關聯對象詳情時,纔會執行對關聯對象的select查詢。對象

3.XML大配置blog

①.侵入式延遲(侵入式延遲默認爲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     }
相關文章
相關標籤/搜索