MyBatis的使用六(解决字段名与成员名不一致)

时间:2023-02-04 11:07:02

本文主要讲述mybatis如何解决mysql的字段名与java实体类的成员变量名称不一致。

  1. 实体类Employee

public class Employee {
    private Integer empId;
    private String empName;
    private Integer age;
    private String gender;
//    private Integer deptId;

    public Employee() {
    }

    public Employee(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 "Employee{" +
                "empId=" + empId +
                ", empName='" + empName + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }
}

  2. 数据表t_emp表

CREATE TABLE t_emp (
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_name VARCHAR(32) NOT NULL DEFAULT '',
    age INT NOT NULL DEFAULT 20,
    gender CHAR(1) CHECK(gender IN ('男','女')))
    CHARACTER SET utf8 COLLATE utf8_bin ENGINE INNODB;

  MyBatis的使用六(解决字段名与成员名不一致)

二. 引出问题

  EmpMapper接口声明如下

public interface EmpMapper {

    // 显示所有数据
    List<Employee> selectEmpAll();
}

  EmpMapper.xml文件声明如下

<!--namespace绑定mapper的接口所在的包名.接口名-->
<mapper namespace="com.hspedu.mapper.EmpMapper">
    <!--List<Employee> selectEmpAll();-->
    <select id="selectEmpAll" resultType="Employee">
        select * from t_emp
    </select>

</mapper>

  测试test结果

Employee{empId=null, empName='null', age=23, gender='男'}
Employee{empId=null, empName='null', age=25, gender='男'}
Employee{empId=null, empName='null', age=22, gender='女'}
Employee{empId=null, empName='null', age=24, gender='男'}
Employee{empId=null, empName='null', age=20, gender='女'}

  当字段名与成员名不一致时,无法将字段名的值赋给成员变量。

三. 解决方式

解决方式1:给字段名取别名

  EmpMapper.xml文件声明如下

    <!--List<Employee> selectEmpAll();-->
    <select id="selectEmpAll" resultType="Employee">
        select emp_id empId,emp_name empName,age,gender from t_emp;
    </select>

  注意:取的别名必须与实体类的成员变量名保持一致。

解决方式2:mybatis配置文件

  在mybatis-config.xml文件中,添加<setting>标签

    <settings>
        <!--将MySQL中_映射为java的驼峰-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

解决方式3:resultMap自定义映射

  EmpMapper.xml文件声明如下

    <resultMap id="result" type="Employee">
        <id column="emp_id" property="empId" />
        <result column="emp_name" property="empName" />
        <!--<result column="age" property="age" />
        <result column="gender" property="gender" />-->
    </resultMap>
    <!--List<Employee> selectEmpAll();-->
    <select id="selectEmpAll" resultMap="result">
        select * from t_emp
    </select>

  在resultMap标签中:

  id标签是主键的映射标签;result标签是非主键的映射标签

  column的值是字段名,property的值是自定义名称,但是仍需与实体类的成员名保持一致。