关于MyBatis resultMaps

时间:2018-01-03 11:45:18

标签: java mysql spring-boot mybatis

有人可以帮助澄清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变量&#34;用户名&#34;和#34;密码&#34;被分配给名为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>

2 个答案:

答案 0 :(得分:0)

@physicsboy你在最后的评论中是对的。基本上,resultmap将列映射到属性。结果图'看到'您设置列的姓氏,例如,如果您进行以下查询:

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。

答案 1 :(得分:0)

是。 结果映射告诉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中的实际字段名称。