SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)

自定义映射resultMap

一.  准备工作

1. 新建mybatis_resultMap模块    com.atguigu.mybatis

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第1张图片

2. 导入依赖

jar


    
    
        org.mybatis
        mybatis
        3.5.7
    
    
    
        junit
        junit
        4.12
        test
    
    
    
        mysql
        mysql-connector-java
        8.0.26
    

    
    
        log4j
        log4j
        1.2.17
    




    
        
            org.apache.maven.plugins
            maven-compiler-plugin
            3.8.0
            
                1.8
                1.8
            


        
    

 3 . 从mybatis_parameter里面复制jdbc.properties和log4j.xml到mybatis_resultMap的resources中

jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
jdbc.username=root
jdbc.password=123456

log4j.xml




    
        
        
            
        
    
    
        
    
    
        
    
    
        
        
    

4 . 创建核心配置文件mybatis-config.xml

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第2张图片






    

    
    
    
        
        
    
    
        
            
            
                
                
                
                
            
        
    

    
    
        
    

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第3张图片

5. 复制工具类

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第4张图片

6 .创建实体对应的包 和mapper对应的包和映射文件所在的包com/atguigu/mybatis/mapper

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第5张图片

7 . 在SQLyog里面建立表  

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第6张图片

 SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第7张图片

员工对部门是多对一的关系

所以把关系设置到多的一分  也就是员工的一方

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第8张图片

 8 . 添加测试数据

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第9张图片

 SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第10张图片

因为员工和部门之间是多对一  所以员工所对应的部门用到的是部门的部门的id(在这里没有创建主外键关联)

9. 设置实体类Dept和Emp

Emp
package com.atguigu.mybatis.pojo;


public class Emp {

    private Integer empId;

    private String empName;

    private Integer age;

    private String gender;

    public Emp() {
    }

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

    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;
    }


    @Override
    public String toString() {
        return "Emp{" +
                "empId=" + empId +
                ", empName='" + empName + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}
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 + '\'' +
                '}';
    }
}
10 创建mapper接口和映射文件

mapper接口

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第11张图片

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第12张图片

 映射文件

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第13张图片

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第14张图片

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第15张图片

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

表里面的字段名用的是下划线  实体类用的是驼峰命名  这个时候字段名和属性名不一致

JDBC工具类:如何映射

将查出来的字段名  通过反射来获取对应的属性名  在用属性名获取属性进行赋值

现在字段名和属性名不一致  如何进行对应

 EmpMapper
   /**
     * 根据id查询员工信息
     * @param empId
     * @return
     */
    Emp getEmpByEmpId(@Param("empId") Integer empId);

EmpMapper.xml



    
    

测试:ResultMapTest

    @Test
    public void testGetEmpByEmpId(){
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
        Emp emp = mapper.getEmpByEmpId(1);
        System.out.println(emp);
    }
因为字段名和属性名不一致测试结果:empId=null, empName='null'

那么如何根据一个下划线对应一个驼峰

解决办法 起别名

第一种方式

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第16张图片



    
    

 测试SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第17张图片

 第二方式:

mybatis-config.xml

    
        
        
    

EmpMapper.xml



    
    

测试:

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第18张图片

字段名和属性名不一致的情况,如何处理映射关系
1、为查询的字段设置别名,和属性名保持一致
2、当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰
此时可以在MyBatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰
emp_id:empId,emp_name:empName

 拓展:

1 . mybatis-3.5.11文件内容

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第19张图片

 SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第20张图片

 2. 将下划线映射为驼峰配置成模板

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第21张图片

三.  使用resultMap处理字段名和属性名的不一致的情况

字段名和属性名不一致的情况,如何处理映射关系
1、为查询的字段设置别名,和属性名保持一致
2、当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰
此时可以在MyBatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰
emp_id:empId,emp_name:empName
3、使用resultMap自定义映射处理

EmpMapper.xml


 
    
        
        
        
        
    

    
    
测试:



拓展: 

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第22张图片

SSM整合之Mybatis笔记(自定义映射resultMap)(P036—P037)_第23张图片

总结:

若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用 _ ),实体类中的属性
名符合 Java 的规则(使用驼峰)
此时也可通过以下两种方式处理字段名和实体类中的属性的映射关系
a> 可以通过为字段起别名的方式,保证和实体类中的属性名保持一致
b> 可以在 MyBatis 的核心配置文件中设置一个全局配置信息 mapUnderscoreToCamelCase ,可
以在查询表中数据时,自动将 _ 类型的字段名转换为驼峰
例如:字段名 user_name ,设置了 mapUnderscoreToCamelCase ,此时字段名就会转换为
userName

全部总结:

字段名和属性名不一致的情况,如何处理映射关系 
1、为查询的字段设置别名,和属性名保持一致
2、当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰 此时可以在MyBatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰 emp_id:empId,emp_name:empName
3、使用resultMap自定义映射处理
    resultMap:设置自定义的映射关系
    id:唯一标识
    type:处理映射关系的实体类的类型
    常用的标签:
    id:处理主键和实体类中属性的映射关系
    result:处理普通字段和实体类中属性的映射关系
    association:处理多对一的映射关系(处理实体类类型的属性)
    collection:处理一对多的映射关系(处理集合类型的属性)
    column:设置映射关系中的字段名,必须是sql查询出的某个字段
    property:设置映射关系中的属性的属性名,必须是处理的实体类类型中的属性名

你可能感兴趣的:(1024程序员节,mysql,mybatis)