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 }