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映射文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值