文章目录
自动映射原理
在 MyBatis 的配置文件(settings
元素部分)中,有一个 autoMappingBehavior 配置,其默认值为 PARTIAL ,表示 MyBatis 会自动映射(简单的,没有嵌套关系的)结果集。
有三种自动映射等级:
NONE - 禁用自动映射。仅对手动映射的属性进行映射。
PARTIAL - 对除在内部定义了嵌套结果映射(也就是连接的属性)以外的属性进行映射
FULL - 自动映射所有属性。`
"PARTIAL"也 表示设置自动映射的行为为部分匹配模式。具体来说,当实体类中存在与查询结果列相同的属性时,MyBatis 会将它们进行自动映射,而对于没有匹配的列,则会忽略它们。这样可以避免在实体类中定义过多无用的属性。
需要注意的是,如果设置了全局的自动映射行为(通过 标签中的 autoMappingBehavior 属性),则该项设置会被覆盖。此外,还可以在映射语句(Mapper)级别或者方法级别上进行自定义的自动映射行为设置,其他可以参考官方文档Auto-Mapping。
xml
<configuration>
<properties>....</properties>
<settings>
....
<setting name="autoMappingBehavior" value="PARTIAL"/>
....
</settings>
<typeAliases>....</typeAliases>
....
</configuration>
如果你的类的属性名与表的字段名一致,那么 MyBatis 会自动将结果集的一行封装成一个 JavaBean 。
一般而言,数据库表和字段的命名风格是以下划线为分隔符,而 Java 中命名风格是驼峰命风格。
如果,PO 类的属性名和 Table 的列名仅仅是命名风格的不同,那么此时你可以使用 mapUnderscoreToCamelCase
进行控制,以便于自动转换或不转换。
xml
<configuration>
<properties>....</properties>
<settings>
....
<setting name="mapUnderscoreToCamelCase" value="false"/>
....
</settings>
<typeAliases>....</typeAliases>
....
</configuration>
jdbcType
将 ResultSet 数据映射成对象时,会涉及到两种数据类型:数据库类型(varchar) 和 Java 类型(String)。MyBatis 使用 类型转换器(typeHandler)来处理两种类型数据的转换问题。
[!attention]注意,
不同的数据库对于同一个数据类型的概念可能会使用不同的『单词』。
例如:整型 ,在 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)。
同时启用配置文件和注解两种配置方式
虽然通过 mapper.xml 配置文件和注解都可以拿到 mapper 对象,进而操作数据库,不过,有意思地是,Mybatis 居然支持同时使用 mapper.xml 和注解。
虽然这个特性看起来有些多余,但是实际上它极具价值,因为,注解配置虽然万般皆好,唯独有一个功能它实现不了,在这个功能上注解是取代不了 mapper.xml 配置文件的(不知道这个问题在 MyBatis 的未来的发展中会不会解决掉)。所以,MyBatis 允许两种配置方式同时使用,我们就可以同时「享受」注解和配置文件的全部优点的同时,又避免各自的缺点。
同时使用两种配置方式本质上是让 mapper.xml 和注解两者进行分工,你要做的操作和工作分配如下:
- "退回"到早期 mapper.xml 的使用方式:在核心配置文件中指定 mapper.xml 配置文件的路径名(而不是指定接口所在) ;
- 在 mapper.xml 配置文件中只配置 "<resultMap>" 指定映射规则,不配置 SQL 语句。SQL 语句在接口中通过 @Select 等注解指定;
- 在注解中使用 "@ResultMap" 注解引用 mapper.xml 配置文件中的映射规则。
[!attention] 注意
映射文件中的映射规则 "<resultMap>" 可以有多个,他们之间通过 id 来进行区分。
另外,注解是哪一点功能实现不了,反而不如 mapper.xml 配置文件,我们在复杂映射关系之后讲解。其实就是 @Results 注解没有 100% 实现 <resultMap> 的全部功能。