MyBatis学习之映射器Mapper(结果映射以及解决列名不一致)

本文详细介绍了MyBatis中resultMap和resultType的使用,它们都能解决实体类属性与数据库列名不一致的问题。resultType通过类型别名简化配置,但要求属性名与列名匹配;resultMap则能建立自定义映射关系,支持复杂类型封装,通过column和property属性指定列名和属性名,实现一对一和一对多查询。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Table of Contents

结果映射:(resultMap, resultType)

    1. resultType配置结果类型

    2. resultMap结果类型

    3. 小结:都可以解决实体类属性  和  数据库表的列名  不匹配 情况


结果映射:(resultMap, resultType)

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的长达数千行的代码。ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。

resultType属性可以指定结果集的类型,它⽀持 基本类型实体类类型(JavaBean 或 POJO(Plain Old Java Objects,普通老式 Java 对象)

需要注意的是,它和parameterType⼀样,如果注册过类型别名的,可以直接使⽤别名。没有注册过的必须使⽤全限定类名。例如:我们的实体类此时必须是全限定类名

同时,当是实体类名称是,还有⼀个要求,实体类中的属性名称必须和查询语句中的列名 保持⼀ 致,否则⽆法实现封装

1. resultType配置结果类型

这⾥考虑实体类属性和数据库表的列名已经不⼀致的情况

  •  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 语句中的列名。

  • xml映射

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

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

<!-- SQL 映射 XML 中 -->
<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>

这样,可以解决 实体类属性和数据库表的列名已经不⼀致的情况

思考: 如果我们的查询很多,都使⽤别名的话写起来岂不是很麻烦,有没有别的解决办法呢?

2. resultMap结果类型

resultMap标签可以建⽴查询的列名和实体类的属性名称不⼀致时建⽴对应关系。从⽽实现封装。 在select标签中使⽤resultMap属性指定引⽤即可。同时resultMap可以实现将查询结果映射为复 杂类型的pojo,⽐如在查询结果映射对象中包括pojo和list实现⼀对⼀查询和⼀对多查询。

<!--
 建⽴User实体和数据库表的对应关系
 type属性:指定实体类的全限定类名
 id属性:给定⼀个唯⼀标识,是给查询select标签引⽤⽤的。
 -->
<resultMap id="userResultMap" type="User">
    <!-- id标签:⽤于指定主键字段
     result标签:⽤于指定⾮主键字段
     column属性:⽤于指定数据库列名
     property属性:⽤于指定实体类属性名称
     -->

 <!--主键映射-->
  <id property="id" column="user_id" />

<!--普通属性映射-->

  <result property="username" column="user_name"/>
  <result property="password" column="hashed_password"/>
</resultMap>

type属性:指定实体类的全限定类名
 id="userResultMap":给定⼀个唯⼀标识,是给查询select标签引⽤⽤的。

<id>标签:⽤于指定主键字段
<result>标签:⽤于指定⾮主键字段
     column属性:⽤于指定数据库列名
     property属性:⽤于指定实体类属性名称

 

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

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

使用外部的 resultMap ,这也是解决  实体类属性  和  数据库表的列名  不匹配的另外一种方式。

 

3. 小结:都可以解决实体类属性  和  数据库表的列名  不匹配 情况

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值