6.1 简介
所谓实体类与数据库之间的映射,其实就是在java中创建一个类,用来存放数据库里的某一张表。但是,如果只是在纯粹的桌面端与web端开发中,没有使用到框架的化,其实字段与属性之间的映射要求并没有那么严格。但是,使用MyBatis框架之后,对于字段与属性之间的关系,是十分严格的。
6.2 例子
数据库:User表字段:
字段 | 类型 |
---|---|
id | int |
name | varchar |
gender | int |
User实体类:
package com.yun.pojo;
import org.apache.ibatis.type.Alias;
public class User {
private int id;
private String name;
private int sex;
public User() {
}
public User(int id, String name, int sex) {
this.id = id;
this.name = name;
this.sex = sex;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", sex=" + sex +
'}';
}
}
提示: 这里可以明显地发现,实体类并没有与数据库进行良好地映射,数据库中的 gender 字段,在实体类中,却并没有使用同样的名字进行定义,而是使用了 sex 属性。
当我们编写好接口与mapper文件时,在测试类中,我们会发现,不能得到正确的值。
测试结果:
提示: 数据库中gender的候选值有1与2,但是,最后的查询结果并没有出现相应的性别结果。
6.3 原理
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yun.dao.UserMapper" >
<select id="getUserList" resultType="User">
select * from user
</select>
</mapper>
提示: 上述语句中,主要是查询出数据库中的所有用户的所有信息。
二者之间的映射: select * from user 语句,本质是 select id,name,gender from user语句。因此,在MyBatis实现数据库与实体类之间的映射时,MyBatis会去实体类中寻找gender属性的 setGender()与getGender() 方法。但是,由于属性名改变了,相应的属性Getter()与Setter()也发生了改变,所以,Mybaits得到了数据库的值,但是没有映射到实体类中。
解决方法:
- select 语句更改为:select id,name,gender as sex from user。
- 更改实体类中的Setter()与Getter()方法名,将setSex()更改为setGender(),getSex()更改为getGender(),但是这样不符合实体类的使用。
- 使用Map接口做resultMap映射。
6.4 ResultMap映射
6.4.1 简介
当实体类与数据库存在部分字段无法正确映射时,可以使用ResultMap作为中间组件,将数据库的字段映射给实体类
6.4.2 使用
UserMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yun.dao.UserMapper" >
<resultMap id="userResultMap" type="user">
<result column="gender" property="sex"/>
</resultMap>
<select id="getUserList" resultMap="userResultMap">
select * from user
</select>
</mapper>
提示: 在mapper标签下,使用resultMap标签,将需要转映射的字段定义在下面。column 对应的是sql语句的结果字段,property 对应的是实体类中的属性。而就集合来讲,colunmn等于key,property等于values。在 select 标签中,resultType需要更改为resultMap 。
执行结果:
写在最后,resultMap并不仅限于此,还有更高级的用法,可以查询官方文档。