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"/> 复制代码
这些元素是结果映射的基础。 id 和 result 元素都将一个列的值映射到一个简单数据类型(String, int, double, Date 等)的属性或字段。
这两者之间的唯一不同是, id 元素对应的属性会被标记为对象的标识符,在比较对象实例时使用。 这样可以提高整体的性能,尤其是进行缓存和嵌套结果映射(也就是连接映射)的时候。 我平时使用都是用 id 修饰表中主键。
关于 id 和 result 的属性,重点关注 property 和 column 属性,简单来说就是,property 的值为 JavaBean 中的字段名,column 指的是数据库中的列名。
Mybatis官网XML映射文件