# 映射结果集(基本)

在前面的内容中,由于我们的 PO 类的属性名与数据库中表的列名是一致的,因此,在 Mapper.xml 配置文件中,Mybatis 省略/简化 掉了一块配置。

<resultMap id="xxx" type="demo.bean.po.Department">
  <id column="id" jdbcType="INTEGER" property="id" />
  <result column="name" jdbcType="VARCHAR" property="name" />
  <result column="location" jdbcType="VARCHAR" property="location" />
</resultMap>

...

<select id="..." resultMap="xxx"> ... </select>

<!-- 如何配合 @Select 注解使用见后续内容 -->

很容易猜得到这个块配置的作用就是(在查询功能中)指定数据库的表的列与 PO 类的属性之间的对应关系

实际上,Mybatis 需要有这样的一个配置来 指导/告诉 它如何将结果集(ResultSet)中的数据映射成对象,或对象的集合。这是任何一个 ORM 框架的基本功能(重要功能)之一。

# 1. <resultMap>

resultMap 元素必要的两个属性有:

属性名 说明
id resultMap 的唯一标识符。
type 它表示映射所返回的实际类型。

# 2. <id> 和 <result>

resultMap 最常见的两个子元素有:

  • id 子元素

    表示数据库表的主键列。 其中,

    column 属性表示表的列名;

    property 属性,表示映射对象的属性名

  • result 子元素

    表示数据库的普通列。其中,

    column 属性,表示数据库表的列名;

    property 属性,表示映射对象的属性名

# 3. jdbcType

将 ResultSet 数据映射成对象时,会涉及到两种数据类型:数据库类型(varchar) 和 Java 类型(String)。MyBatis 使用 类型转换器(typeHandler)来处理两种类型数据的转换问题。

补充,不同的数据库对于同一个数据类型的概念可能会使用不同的『单词』。例如:

整型,在 MySQL 中是 INT ,在 Oracle 中是 INTEGER

在 Java 的 JDBC 中,对不同数据库的各种类型的『称呼』进行了统一:JDBC 类型 。例如:

『整型』的 JDBC Type 表示为 INTEGER ,即表示 MySQL 中的 INT ,又表示 Oracle 中的 INTEGER

常见的有:

JDBC Type Mysql Type Java Type
SMALLINT SMALLINT short
java.lang.Short
INTEGER INTEGER int
java.lang.Integer
BIGINT BIGINT long
java.lang.Long
FLOAT FLOAT float
java.lang.Float
DOUBLE DOUBLE double
java.lang.Double
DECIMAL DECIMAL java.math.BigDecimal
CHAR CHAR java.lang.String
VARCHAR VARCHAR java.lang.String
DATE DATE java.util.Date
TIME TIME java.util.Date
TIMESTAMP TIMESTAMP java.util.Date

注意:对于 java.lang.Datejava.sql.Date ,是两种不同的类型。在写 JavaBean 一定要确认你所使用的是哪个 Date 类型( 一般都是使用 java.lang.Date

# 4. 自动映射原理

在 MyBatis 的配置文件settings 元素部分)中,有一个 autoMappingBehavior 配置,其默认值为 PARTIAL ,表示 MyBatis 会自动映射(简单的,没有嵌套关系的)结果集。

<configuration>

  <properties> ... </properties>

  <settings>
    ...
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    ...
  </settings>

  <typeAliases> ... </typeAliases> 

  ...

</configuration>

如果你的类的属性名与表的字段名一致,那么 MyBatis 会自动将结果集的一行封装成一个 JavaBean 。

一般而言,数据库表和字段的命名风格是以下划线为分隔符,而 Java 中命名风格是驼峰命风格。

如果,PO 类的属性名和 Table 的列名仅仅是命名风格的不同,那么此时你可以使用 mapUnderscoreToCamelCase 进行控制,以便于自动转换或不转换。

<configuration>

  <properties> ... </properties>

  <settings>
    ...
    <setting name="mapUnderscoreToCamelCase" value="false"/>
    ...
  </settings>

  <typeAliases> ... </typeAliases> 

  ...

</configuration>