Mybatis懒加载

懒加载是什么?

        按需加载所需内容,当调用到关联的数据时才与数据库交互否则不交互,能大大提高数据库性能,并不是所有场景下使用懒加载都能提高效率。

        Mybatis懒加载:resultMap里面的association、collection有延迟加载功能

懒加载针对什么使用?为什么要用懒加载?

        懒加载针对级联使用的,懒加载的目的是减少内存的浪费和减轻系统负担


举例:

查询所有用户信息(其下有多个收货地址)

select b.id ,b.userName,b.userCode,a.*
from smbms_address a right join smbms_user b on a.userId = b.id

进行分步查询:当我需要查看地址的时候加载收货地址信息

-- 查询所有用户信息
select * from smbms_user
-- 查询地址信息
select * from smbms_address where userId = #{id}

以上为单表查询,效率相对于大数据量的关联查询要高

Mybatis懒加载实例

1、在 Mybatis 主配置文件中开启懒加载




    
    
    
    
        

        
        
        
        
        

    

    
    
        
    
    
    
    
        
            
            
                
                
                
                
            
        
    
    
        
        
    

2、创建实体类等

package com.hz.pojo;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class User implements Serializable {
	private Long id; //id
	private String userCode; //用户编码
	private String userName; //用户名称
	private String userPassword; //用户密码
	private Integer gender;  //性别
	private String birthday;  //出生日期
	private String phone;   //电话
	private String address; //地址
	private Integer userRole;    //用户角色
	private Integer createdBy;   //创建者
	private String creationDate; //创建时间
	private Integer modifyBy;     //更新者
	private String modifyDate;   //更新时间

	private  Role role;	//用户角色对象

	private List
addressList; //收货地址集合 }
package com.hz.pojo;

import lombok.*;

@Setter
@Getter
@NoArgsConstructor //无参构造方法
@AllArgsConstructor //有参构造方法
@ToString
public class Address {
	private Long id;				//主键ID
	private String postCode; 		//邮编
	private String contact;			//联系人
	private String addressDesc;		//地址
	private String tel;				//联系电话
	private Integer createdBy; 		//创建者
	private String creationDate; 	//创建时间
	private Integer modifyBy; 		//更新者
	private String modifyDate;		//更新时间
	private User user;  			//所属用户对象

}

3、创建Dao接口和XML文件

   

    
        
        
        
            
        
    
    
    

因为 User表与 Address表 是一对多关联,所以使用resultMap的collection映射,在collection标签中,添加属性fetchType,属性值为lazy,表示懒加载。

4、测试

    @Test
    public void findUserList1() {
        SqlSession sqlSession = MyBatisUtil.createSqlSession();
        UserDao userDao = sqlSession.getMapper(UserDao.class);
        List userList = userDao.findUserList1();
        for (User u :userList) {
            System.out.println("userName:"+u.getUserName());
        }
        //调用地址
//        List userList = userDao.findUserList1();
//        for (User u :userList) {
//            List
addressList = u.getAddressList(); // System.out.println("userName:"+u.getUserName()); // for (Address address :addressList) { // System.out.println("addressName:"+address.getContact()); // } // } }

只查询 UserName :结果如下

Mybatis懒加载_第1张图片 

组合查询时 :结果如下

Mybatis懒加载_第2张图片

你可能感兴趣的:(mybatis,mybatis)