关于 MyBatis resultMaps 的说明
Posted
技术标签:
【中文标题】关于 MyBatis resultMaps 的说明【英文标题】:Clarification about MyBatis resultMaps 【发布时间】:2018-06-13 02:09:52 【问题描述】:有人可以帮助澄清 MyBatis 文档中定义的重命名属性/列吗?
MyBatis 文档
文档定义了一个简单的 Java 类:
public class User
private int id;
private String username;
private String password;
...
以及以下内容:
ResultMaps 的优点在于您已经学到了很多东西 关于他们,但你还没有见过!这些简单的案例 不需要比您在这里看到的更多。举个例子, 让我们看看最后一个示例作为外部示例会是什么样子 resultMap,因为这是解决列名不匹配的另一种方法。
<resultMap id="userResultMap" type="User"> <id property="id" column="user_id" /> <result property="username" column="user_name"/> <result property="password" column="password"/> </resultMap>
并且引用它的语句使用 resultMap 属性 这样做(注意我们删除了 resultType 属性)。例如:
<select id="selectUsers" resultMap="userResultMap"> select user_id, user_name, password from some_table where id = #id </select>
我的问题 上述是否意味着 POJO/Bean 变量“username”和“password”被分配给名为 user_name 和 hashed_password 的数据库列,这是否与他们也编写以下内容相同?
<select id="selectUsers" resultType="User"> select user_id as "id", user_name as "userName", hashed_password as "password" from some_table where id = #id </select>
【问题讨论】:
你的 bean 应该有setUsername(String)
和 setId(int)
并且映射器将调用这些设置器
@aristotll - 我知道这有点冗长。我更新以希望使事情更清楚。我想知道 @physicsboy 你的最后一条评论是对的。基本上,结果映射将列映射到属性。结果映射“看到”您设置列的姓氏,例如,如果您进行以下查询:
select id, column_A from table
您的结果图将是
<resultMap id="ResultMapName" type="WhateverType">
<id property="id" column="id" />
<result property="columnA" column="column_A"/>
</resultMap>
但是,如果您为其中一列设置别名:
select id, column_A as column_A_with_alias from table
你的 resultMap 应该是
<resultMap id="ResultMapName" type="WhateverType">
<id property="id" column="id" />
<result property="columnA" column="column_A_with_alias"/>
</resultMap>
不用说你的 POJO 应该有所有属性的 getter 和 setter。
【讨论】:
ResultMap 还有一个名为 autoMapping 的属性。当设置为 true 时,它可以自动将列映射到名称相同的属性。所以没有必要设置所有的是的。 结果映射告诉 MyBatis “从查询中的列 x 中获取值并将其存储在 POJO 中的字段 y 中。
更多信息: 当 POJO 中的字段与查询中的列名匹配时,MyBatis 喜欢它。 在这种情况下, 您不需要 resultMap 条目。
只有当 POJO 中的字段与查询中的列名不完全匹配时,您才需要 resultMap(在您的帖子中的“我的问题”上面的示例中就是这种情况)。
由于User
POJO 中的字段与第二个示例中的列名不完全匹配(“hashedPassword”!= “password”),您仍然需要使用 resultMap 条目在查询和 POJO 之间进行映射。
如果您将查询更改如下:
<select id="selectUsers" resultType="User">
select
user_id as "id",
user_name as "username",
hashed_password as "hashedPassword"
from some_table
where id = #id
</select>
那么你就不需要resultMap了, 因为“用户名”是 POJO 中的实际字段名称。
【讨论】:
以上是关于关于 MyBatis resultMaps 的说明的主要内容,如果未能解决你的问题,请参考以下文章
MyBatis之ResultMap的association和collection标签详解(图文例子)
Mybatis中mapper配置文件的resultMap标签中的子元素idresultassociationcollectiondiscriminator的用法