【SSM框架】自定义映射resultMap

CSDN话题挑战赛第2期
参赛话题:学习笔记

目录

1.使用全局配置处理字段名和属性名不一致的情况

2.resultMap处理字段和属性的映射关系

1.处理一对一映射

2.多对一映射处理

级联方式处理映射关系

使用association处理映射关系

分步查询

3.一对多映射处理

1.collection

2.分步查询


前期准备:

 建立 t_emp 表,并添加数据:

【SSM框架】自定义映射resultMap_第1张图片

 建立 t_dept 表,并添加数据:

【SSM框架】自定义映射resultMap_第2张图片

实体类:Emp

package com.atguigu.mybatis.pojo;

public class Emp {
    private Integer empId;
    private String empName;
    private Integer age;
    private String gender;
    private Dept dept;

    public Emp() {
    }

    public Emp(Integer empId, String empName, Integer age, String gender, Dept dept) {
        this.empId = empId;
        this.empName = empName;
        this.age = age;
        this.gender = gender;
        this.dept = dept;
    }

    public Integer getEmpId() {
        return empId;
    }

    public void setEmpId(Integer empId) {
        this.empId = empId;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "empId=" + empId +
                ", empName='" + empName + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", dept=" + dept +
                '}';
    }
}

实体类:Dept

package com.atguigu.mybatis.pojo;

public class Dept {
    private Integer deptId;
    private String deptName;

    public Dept() {
    }

    public Dept(Integer deptId, String deptName) {
        this.deptId = deptId;
        this.deptName = deptName;
    }

    public Integer getDeptId() {
        return deptId;
    }

    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    @Override
    public String toString() {
        return "Dept{" +
                "deptId=" + deptId +
                ", deptName='" + deptName + '\'' +
                '}';
    }
}

  接口:

public interface EmpMapper {
    Emp getEmpById(@Param("empId") Integer empId);
}

SQL:

select * from t_emp where emp_id = #{empId};

测试:

   public void test(){
        SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp empById = mapper.getEmpById(1);
        System.out.println(empById.toString());

    }

运行结果:

【SSM框架】自定义映射resultMap_第3张图片

原因:JAVA中属性名 与 数据库中字段名不一致

1.使用全局配置处理字段名和属性名不一致的情况

若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性
名符合Java的规则(使用驼峰)
此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系:
1.可以通过为字段起别名的方式,保证和实体类中的属性名保持一致
select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId};

2.可以在MyBatis的核心配置文件中设置一个全局配置信息mapUnderscoreToCamelCase,可
以在查询表中数据时,自动将_类型的字段名转换为驼峰
【SSM框架】自定义映射resultMap_第4张图片
  
        
    

例如:字段名user_name,设置了mapUnderscoreToCamelCase,此时字段名就会转换为
userName

2.resultMap处理字段和属性的映射关系

1.处理一对一映射


    
    
    
    


    
resultMap:设置自定义映射
  • 属性:
  • id:表示自定义映射的唯一标识
  • type:查询的数据要映射的实体类的类型
  • 子标签:
  • id:设置主键的映射关系
  • result:设置普通字段的映射关系
  • association :设置多对一的映射关系
  • collection:设置一对多的映射关系
  • 属性:
  • property:设置映射关系中实体类中的属性名
  • column:设置映射关系中表中的字段名

2.多对一映射处理

级联方式处理映射关系

  
            
            
            
            

            
            
            
            
 



    

接口:

Emp getEmpAndDeptById(@Param("empId") Integer empId);

测试:

    public void test2(){
        SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp empAndDeptById = mapper.getEmpAndDeptById(1);
        System.out.println(empAndDeptById);
        
    }

使用association处理映射关系

  
            
            
            
            
      
          
          
      

 

分步查询

①查询员工信息

    Emp getEmpAndDeptByStep(@Param("empId") Integer empId);
    
        
        
        
        
        
        

    

    
select:设置分步查询,查询某个属性的值的sql的标识(namespace.sqlid)
column:将sql以及查询结果中的某个字段设置为分步查询的条件
②根据员工所对应的部门 id 查询部门信息
    Dept getDeptByStep(@Param("deptId") Integer deptId);
    

测试:

    public void test3(){
        SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp empAndDeptByStep = mapper.getEmpAndDeptByStep(1);
        System.out.println(empAndDeptByStep);

    }

【SSM框架】自定义映射resultMap_第5张图片

分步查询的优点:可以实现延迟加载
但是必须在核心配置文件中设置全局配置信息:
  • lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
  • aggressiveLazyLoading:当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载
此时就可以实现按需加载,获取的数据是什么,就只会执行相应的 sql
此时可通   association和 collection 中的   fetchType 属性设置当前的分步查询是否使用延迟加载, fetchType="lazy(延迟加载)   |  eager(立即加载)"

 测试:

    public void test3(){
        SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp empAndDeptByStep = mapper.getEmpAndDeptByStep(1);
        System.out.println(empAndDeptByStep.getEmpName());

    }

未开启延迟加载(执行了2次SQL): 

【SSM框架】自定义映射resultMap_第6张图片

开启延迟加载:

    
 
        
        
    

 执行了1次SQL:

【SSM框架】自定义映射resultMap_第7张图片

3.一对多映射处理

1.collection

接口:

Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);

 实体类中,添加 emps集合:

【SSM框架】自定义映射resultMap_第8张图片

 DeptMapper.xml:

collection :设置一对多的映射关系
ofType :设置 collection 标签所处理的集合属性中存储数据的类型
    
        
        
        
            
            
            
            

        



    


    

测试:

    public void test4(){
        SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept deptAndEmpByDeptId = mapper.getDeptAndEmpByDeptId(1);
        System.out.println(deptAndEmpByDeptId);


    }

运行结果: 

【SSM框架】自定义映射resultMap_第9张图片

2.分步查询

①查询部门信息
    Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);

    
        
        
        
            
        

    

    

②根据部门 id 查询部门中的所有员工
    List getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);
    

测试:

    public void test5(){
        SqlSessionUtils sqlSessionUtils = new SqlSessionUtils();
        SqlSession sqlSession = sqlSessionUtils.getSqlSession();
        DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
        Dept deptAndEmpByStepOne = mapper.getDeptAndEmpByStepOne(1);
        System.out.println(deptAndEmpByStepOne);


    }

【SSM框架】自定义映射resultMap_第10张图片

你可能感兴趣的:(【SSM框架】,mybatis,mysql,数据库,spring,spring,boot)