MyBatis实战指南(六)自动映射

发布于:2025-06-12 ⋅ 阅读:(33) ⋅ 点赞:(0)


前言

  • 在上一篇博客中,我们深入解析了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


一、什么是自动映射?

想象一下,如果我们从数据库查询出了一些数据。

  • 比如一个用户表的记录,包含IDUSERNAME等字段。
    在这里插入图片描述

  • 同时,你有一个Java类User,里面有iduserName等属性。
    在这里插入图片描述

自动映射就是MyBatis帮你把数据库里的列值自动填充到Java对象对应属性的过程

比如:

  • 数据库的ID列 → Java对象的id属性
  • 数据库的USERNAME列 → Java对象的userName属性

二、自动映射相关的设置详解

2.1 mapUnderscoreToCamelCase配置的是什么

mapUnderscoreToCamelCase 是一种常见的自动映射配置项,主要用于控制 下划线命名法驼峰命名法之间的自动转换规则

在实际开发中,我们会遇到一个常见的命名差异

  • 数据库字段通常使用下划线命名法,如user_namephone_number
  • Java属性通常使用驼峰命名法,如userNamephoneNumber

这时候,mapUnderscoreToCamelCase配置就派上用场了。当你设置:

<setting name="mapUnderscoreToCamelCase" value="true"/>

MyBatis会自动将下划线命名法转换为驼峰命名法进行匹配,例如:

  • user_nameuserName
  • phone_numberphoneNumber

这样即使你的数据库字段和Java属性命名方式不同,也能正确映射

2.2 autoMappingBehavior(自动映射行为)

这个设置控制MyBatis如何自动映射结果:

  1. NONE:完全关闭自动映射。所有字段都必须手动映射,即使列名和属性名完全一致。

  2. PARTIAL(默认值):只会自动映射没有定义嵌套结果映射的字段。

    比如你的User类有一个简单属性id和一个复杂属性role

    • id会被自动映射
    • role因为是嵌套对象,不会被自动映射,需要在resultMap中明确定义
  3. FULL:会自动映射任何复杂的结果集,无论是否嵌套。

    比如上面的例子,idrole都会被自动映射(如果列名匹配)

2.3 autoMappingUnknownColumnBehavior(未知列映射行为)

这个设置控制当MyBatis遇到无法映射的列时的处理方式:

  1. NONE(默认值):不做任何反应,忽略无法映射的列。

  2. WARNING:输出警告日志,提醒你有无法映射的列。

    注意:需要将org.apache.ibatis.session.AutoMappingUnknownColumnBehavior的日志级别设置为WARN才能看到这些警告。

  3. 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>

这个配置做了以下几件事:

  1. mapUnderscoreToCamelCase = true:允许下划线命名到驼峰命名的自动转换,所以phone_number会自动映射到phoneNumber属性。

  2. autoMappingBehavior = FULL:所有字段都会被自动映射,包括嵌套对象。

  3. autoMappingUnknownColumnBehavior = WARNING:如果有无法映射的列,会输出警告。

  4. 在resultMap中,我们明确定义了:

    • userId属性映射到uid
    • role对象的roleId属性映射到rid
  5. 由于使用了FULL自动映射,其他字段会被自动映射:

    • usernameusername属性
    • phone_numberphoneNumber属性(因为开启了驼峰转换)
    • sexsex属性
    • role_namerole.roleName属性(因为开启了FULL自动映射)

2.5 实战建议

  1. 对于简单项目,可以开启mapUnderscoreToCamelCaseautoMappingBehavior = FULL,减少手动映射的工作量。

  2. 在开发阶段,建议设置autoMappingUnknownColumnBehavior = WARNINGFAILING,及时发现映射问题。

  3. 对于复杂查询,特别是涉及多表连接的情况,建议明确定义resultMap,避免自动映射可能带来的问题。

  4. 命名尽量保持一致性,减少不必要的映射复杂度。


以上就是这篇博客的全部内容,下一篇我们将继续探索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

非常感谢您的阅读,喜欢的话记得三连哦

在这里插入图片描述