Mybatis-解决字段不一致问题引出结果集映射ResultMap

数据库字段名
在这里插入图片描述
实体类属性名
在这里插入图片描述

查询结果:[id=1, password=null, name=米兰]
可见当返回实体类和数据库字段不一致时,会找不到对应的赋值
原因:

<select id="getUsers" resultType="COM.MLJ.MYBATIS_STUDY.User">
    select * from user1;
    //select id,name,pwd from user1;
    //查出来的pwd与password不对应
  </select>

解决方法:
1.起别名

    select id,name,pwd as password from user1;

2.resultMap

  <resultMap type="User" id="UserMap">
  	<result column="id" property="id"/>
  	<result column="name" property="name"/>
  	<result column="pwd" property="password"/>
  </resultMap>
  
  
  <select id="getUsers" resultMap="UserMap">
    select * from user1;
  </select>

**

2. resultMap

resultMap 元素是 MyBatis 中最重要最强大的元素。
ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们 的关系。

你已经看到简单映射语句的示例了,但没有明确的 resultMap。比如:

<select id="selectUsers" resultType="map">
  select id, username, hashedPassword
  from some_table
  where id = #{
    
    id}
</select>

这样一个语句简单作用于所有列被自动映射到 HashMap 的键上,这由 resultType 属性 指定。这在很多情况下是有用的,但是 HashMap 不能很好描述一个领域模型。那样你的应 用程序将会使用 JavaBeans 或 POJOs(Plain Old Java Objects,普通 Java 对象)来作为领域 模型。MyBatis 对两者都支持。
看看下面这个 JavaBean:

package com.someapp.model;
public class User {
    
    
  private int id;
  private String username;
  private String hashedPassword;

  public int getId() {
    
    
    return id;
  }
  public void setId(int id) {
    
    
    this.id = id;
  }
  public String getUsername() {
    
    
    return username;
  }
  public void setUsername(String username) {
    
    
    this.username = username;
  }
  public String getHashedPassword() {
    
    
    return hashedPassword;
  }
  public void setHashedPassword(String hashedPassword) {
    
    
    this.hashedPassword = hashedPassword;
  }
}

基于 JavaBean 的规范,上面这个类有 3 个属性:id,username 和 hashedPassword。这些 在 select 语句中会精确匹配到列名。

这样的一个 JavaBean 可以被映射到结果集,就像映射到 HashMap 一样简单。

<select id="selectUsers" resultType="com.someapp.model.User">
  select id, username, hashedPassword
  from some_table
  where id = #{
    
    id}
</select>

要记住类型别名是你的伙伴。使用它们你可以不用输入类的全路径。比如:

<!-- In mybatis-config.xml file -->
<typeAlias type="com.someapp.model.User" alias="User"/>

<!-- In SQL Mapping XML file -->
<select id="selectUsers" resultType="User">
  select id, username, hashedPassword
  from some_table
  where id = #{
    
    id}
</select>

这些情况下,MyBatis 会在幕后自动创建一个 ResultMap,基于属性名来映射列到 JavaBean 的属性上。如果列名没有精确匹配,你可以在列名上使用 select 字句的别名(一个 基本的 SQL 特性)来匹配标签。比如:

<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 最优秀的地方你已经了解了很多了,但是你还没有真正的看到一个。这些简 单的示例不需要比你看到的更多东西。 只是出于示例的原因, 让我们来看看最后一个示例中 外部的 resultMap 是什么样子的,这也是解决列名不匹配的另外一种方式。

<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id" />
  <result property="username" column="username"/>
  <result property="password" column="password"/>
</resultMap> 

引用它的语句使用 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:

<select id="selectUsers" resultMap="userResultMap">
  select user_id, user_name, hashed_password
  from some_table
  where id = #{
    
    id}
</select>

猜你喜欢

转载自blog.csdn.net/mmmmmlj/article/details/108727385