MyBatis基础之自动映射、映射类型、文件注解双配置

文章目录

自动映射原理

在 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.Datejava.sql.Date ,是两种不同的类型。在写 JavaBean 一定要确认你所使用的是哪个 Date 类型(一般都是使用 java.lang.Date)。

同时启用配置文件和注解两种配置方式

虽然通过 mapper.xml 配置文件和注解都可以拿到 mapper 对象,进而操作数据库,不过,有意思地是,Mybatis 居然支持同时使用 mapper.xml 和注解。

虽然这个特性看起来有些多余,但是实际上它极具价值,因为,注解配置虽然万般皆好,唯独有一个功能它实现不了,在这个功能上注解是取代不了 mapper.xml 配置文件的(不知道这个问题在 MyBatis 的未来的发展中会不会解决掉)。所以,MyBatis 允许两种配置方式同时使用,我们就可以同时「享受」注解和配置文件的全部优点的同时,又避免各自的缺点。

同时使用两种配置方式本质上是让 mapper.xml 和注解两者进行分工,你要做的操作和工作分配如下:

  1. "退回"到早期 mapper.xml 的使用方式:在核心配置文件中指定 mapper.xml 配置文件的路径名(而不是指定接口所在) ;
  2. 在 mapper.xml 配置文件中只配置 "<resultMap>" 指定映射规则,不配置 SQL 语句。SQL 语句在接口中通过 @Select 等注解指定;
  3. 在注解中使用 "@ResultMap" 注解引用 mapper.xml 配置文件中的映射规则。

[!attention] 注意

映射文件中的映射规则 "<resultMap>" 可以有多个,他们之间通过 id 来进行区分。

另外,注解是哪一点功能实现不了,反而不如 mapper.xml 配置文件,我们在复杂映射关系之后讲解。其实就是 @Results 注解没有 100% 实现 <resultMap> 的全部功能。

相关推荐
张铁铁是个小胖子9 小时前
MyBatis学习
java·学习·mybatis
hanbarger13 小时前
mybatis框架——缓存,分页
java·spring·mybatis
乘风御浪云帆之上20 小时前
数据库操作【JDBC & HIbernate & Mybatis】
数据库·mybatis·jdbc·hibernate
向阳12182 天前
mybatis 动态 SQL
数据库·sql·mybatis
新手小袁_J2 天前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
xlsw_2 天前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
cmdch20172 天前
Mybatis加密解密查询操作(sql前),where要传入加密后的字段时遇到的问题
数据库·sql·mybatis
秋恬意2 天前
什么是MyBatis
mybatis
CodeChampion2 天前
60.基于SSM的个人网站的设计与实现(项目 + 论文)
java·vue.js·mysql·spring·elementui·node.js·mybatis
ZWZhangYu3 天前
【MyBatis源码分析】使用 Java 动态代理,实现一个简单的插件机制
java·python·mybatis