转载

Mybatis结果映射

结果映射

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

问题:

当定义的 bean 类属性字段和表中的字段不一致时,查询的结果无法精确的映射到 bean 对象中。

表结构定义:

CREATE TABLE `user`(
    `id` INT(20) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
    `name` VARCHAR(30) DEFAULT NULL COMMENT '姓名',
    `pwd` VARCHAR(30) DEFAULT NULL COMMENT '密码',
    PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT charset=utf8;
复制代码

User.java

@Data
@AllArgsConstructor
@Alias("user")
public class User {
    private int id;
    private String name;
    private String password;
}
复制代码

可以直观的发现 password 和 pwd 名称不一致,如果按照之前的 UserMapper.xml 文件进行数据查询,发现查询的 user 对象中的 password 属性值为 null。

解决方案

方案一:编写 SQL 语句时指定别名,别名和 Java 实体类的属性名一致。

<select id="selectUserById" resultType="User">
    select id , name , pwd as password from user where id = #{id}
</select>
复制代码

方案二:使用结果集映射 ResultMap 【推荐】

<resultMap id="userMap" type="User">
    <result property="password" column="pwd" />
</resultMap>

<select id="getUserList" resultMap="userMap">
    select * from mybatis.user
</select>
复制代码

为了减少代码量,只需要将不一致的字段映射好就可以了。

resultMap

ResultMap 的属性列表

属性 描述
id 当前命名空间中的一个唯一标识,用于标识一个结果映射。
type 类的完全限定名, 或者一个类型别名
autoMapping 如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)。

id & result

<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
复制代码

这些元素是结果映射的基础。 idresult 元素都将一个列的值映射到一个简单数据类型(String, int, double, Date 等)的属性或字段。

这两者之间的唯一不同是, id 元素对应的属性会被标记为对象的标识符,在比较对象实例时使用。 这样可以提高整体的性能,尤其是进行缓存和嵌套结果映射(也就是连接映射)的时候。 我平时使用都是用 id 修饰表中主键。

关于 id 和 result 的属性,重点关注 property 和 column 属性,简单来说就是,property 的值为 JavaBean 中的字段名,column 指的是数据库中的列名。

参考文献

Mybatis官网XML映射文件

原文  https://juejin.im/post/5e81f7abf265da47f5177a78
正文到此结束
Loading...