关于 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_pa​​ssword 的数据库列,这是否与他们也编写以下内容相同?

<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 - 我知道这有点冗长。我更新以希望使事情更清楚。我想知道 是否意味着 POJO 变量“username”映射到数据库列“user_name” @lance-java - 这实际上是从 MyBatis 文档中复制/粘贴的 XD 【参考方案1】:

@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 时,它​​可以自动将列映射到名称相同的属性。所以没有必要设置所有的。据我所知, 是强制性的,即使列的属性名称是相同的。【参考方案2】:

是的。 结果映射告诉 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的用法

mybatis中的resultMap

Mybatis-常见SQL语句示例

mybatis里返回类型用resultmap映射的时候,如果resultmap写了一个collec

mybatis中resultmap用法问题