# 映射结果集(基本)
在前面的内容中,由于我们的 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.Date 和 java.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>
← 注解的简单使用 同时启用两种配置方式 →