mybatis映射系列教程2:简单字段映射

331人浏览 / 0人评论

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让我们从JDBC ResultSets 数据提取代码中解放出来,如下一个简单映射语句的示例,其并没有显式指定 resultMap。比如:


  select id, username, hashedPassword
  from t_users
  where id = #{id}

上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。虽然在大部分情况下都够用,但是 HashMap 不是一个很好的领域模型。我们的程序更可能会使用 JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)作为领域模型。MyBatis 对两者都提供了支持。看看下面这个 JavaBean:

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 可以被映射到 ResultSet,就像映射到 HashMap 一样简单。


  select id, username, hashedPassword
  from t_users
  where id = #{id}

类型别名是个好帮手。使用它们,我们就可以不用输入类的完全限定名称了。比如:






  select id, username, hashedPassword
  from t_users
  where id = #{id}

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


  select
    user_id             as "id",
    user_name           as "userName",
    hashed_password     as "hashedPassword"
  from t_users
  where id = #{id}

下面这也是解决列名不匹配的另外一种方式。


  
  
  

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


  select user_id, user_name, hashed_password
  from t_users
  where id = #{id}

全部评论

晴天下起了小雨
2017-10-01 18:00
很喜欢,果断关注了
wjmyly7336064
2017-10-01 18:00
相当实用,赞美了
橘大佬
2017-10-01 18:00
就是有些细节再到位点就好了…