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 }