MyBatis实战指南(六)自动映射
前言
在上一篇博客中,我们深入解析了MyBatis XML实战的核心内容,围绕结果映射机制展开详细讲解,从基础字段映射到复杂对象关联映射,通过具体案例演示了如何通过XML配置实现数据库字段与Java对象的精准映射。
本篇博客将聚焦MyBatis的自动映射机制,从底层原理到实战配置逐步拆解:
包括默认自动映射规则、驼峰命名转换配置(
mapUnderscoreToCamelCase
)、自动映射行为控制(autoMappingBehavior
)等核心功能,结合具体场景演示如何利用自动映射简化开发,同时规避潜在问题。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的MyBatis实战指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12969707.html?spm=1001.2014.3001.5482
一、什么是自动映射?
想象一下,如果我们从数据库查询出了一些数据。
比如一个用户表的记录,包含
ID
、USERNAME
等字段。
同时,你有一个Java类
User
,里面有id
、userName
等属性。
自动映射就是MyBatis帮你把数据库里的列值自动填充到Java对象对应属性的过程。
比如:
- 数据库的
ID
列 → Java对象的id
属性 - 数据库的
USERNAME
列 → Java对象的userName
属性
二、自动映射相关的设置详解
2.1 mapUnderscoreToCamelCase配置的是什么
mapUnderscoreToCamelCase 是一种常见的自动映射配置项,主要用于控制 下划线命名法与驼峰命名法之间的自动转换规则
在实际开发中,我们会遇到一个常见的命名差异:
- 数据库字段通常使用下划线命名法,如
user_name
、phone_number
- Java属性通常使用驼峰命名法,如
userName
、phoneNumber
这时候,mapUnderscoreToCamelCase
配置就派上用场了。当你设置:
<setting name="mapUnderscoreToCamelCase" value="true"/>
MyBatis会自动将下划线命名法转换为驼峰命名法进行匹配,例如:
user_name
→userName
phone_number
→phoneNumber
这样即使你的数据库字段和Java属性命名方式不同,也能正确映射。
2.2 autoMappingBehavior(自动映射行为)
这个设置控制MyBatis如何自动映射结果:
NONE:完全关闭自动映射。所有字段都必须手动映射,即使列名和属性名完全一致。
PARTIAL(默认值):只会自动映射没有定义嵌套结果映射的字段。
比如你的
User
类有一个简单属性id
和一个复杂属性role
:id
会被自动映射role
因为是嵌套对象,不会被自动映射,需要在resultMap中明确定义
FULL:会自动映射任何复杂的结果集,无论是否嵌套。
比如上面的例子,
id
和role
都会被自动映射(如果列名匹配)
2.3 autoMappingUnknownColumnBehavior(未知列映射行为)
这个设置控制当MyBatis遇到无法映射的列时的处理方式:
NONE(默认值):不做任何反应,忽略无法映射的列。
WARNING:输出警告日志,提醒你有无法映射的列。
注意:需要将
org.apache.ibatis.session.AutoMappingUnknownColumnBehavior
的日志级别设置为WARN才能看到这些警告。FAILING:映射失败并抛出异常。
这种模式可以帮助你及时发现映射问题,但在某些情况下可能过于严格。
2.4 实战示例分析
我们先来看一段代码
<resultMap id="userMap" type="User">
<id property="userId" column="uid"></id>
<association property="role" javaType="Role">
<id property="roleId" column="rid"></id>
</association>
</resultMap>
<select id="findUserById" resultMap="userMap">
SELECT
u.id "uid",
u.username,
u.phone_number,
u.sex,
r.id "rid",
r.role_name
FROM
user u
LEFT JOIN role r ON u.role_id = r.ID
WHERE
u.id = #{id};
</select>
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="autoMappingBehavior" value="FULL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
</settings>
这个配置做了以下几件事:
mapUnderscoreToCamelCase = true
:允许下划线命名到驼峰命名的自动转换,所以phone_number
会自动映射到phoneNumber
属性。autoMappingBehavior = FULL
:所有字段都会被自动映射,包括嵌套对象。autoMappingUnknownColumnBehavior = WARNING
:如果有无法映射的列,会输出警告。在resultMap中,我们明确定义了:
userId
属性映射到uid
列role
对象的roleId
属性映射到rid
列
由于使用了
FULL
自动映射,其他字段会被自动映射:username
→username
属性phone_number
→phoneNumber
属性(因为开启了驼峰转换)sex
→sex
属性role_name
→role.roleName
属性(因为开启了FULL自动映射)
2.5 实战建议
对于简单项目,可以开启
mapUnderscoreToCamelCase
和autoMappingBehavior = FULL
,减少手动映射的工作量。在开发阶段,建议设置
autoMappingUnknownColumnBehavior = WARNING
或FAILING
,及时发现映射问题。对于复杂查询,特别是涉及多表连接的情况,建议明确定义resultMap,避免自动映射可能带来的问题。
命名尽量保持一致性,减少不必要的映射复杂度。
以上就是这篇博客的全部内容,下一篇我们将继续探索MyBatis的更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的MyBatis实战指南知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12969707.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |