当前位置: 首页 > ai >正文

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

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

  • 前言
  • 一、什么是自动映射?
  • 二、自动映射相关的设置详解
    • 2.1 mapUnderscoreToCamelCase配置的是什么
    • 2.2 autoMappingBehavior(自动映射行为)
    • 2.3 autoMappingUnknownColumnBehavior(未知列映射行为)
    • 2.4 实战示例分析
    • 2.5 实战建议


前言

  • 在上一篇博客中,我们深入解析了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">SELECTu.id "uid",u.username,u.phone_number,u.sex,r.id "rid",r.role_nameFROMuser uLEFT JOIN role r ON u.role_id = r.IDWHEREu.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

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

在这里插入图片描述

http://www.xdnf.cn/news/13292.html

相关文章:

  • 科技评论:Jim Keller 的“反向”战略:RISC-V 成为中国应对美国芯片封锁的关键武器
  • 为何AI推理正推动云计算从集中式向分布式转型
  • 一个教学项目pom.xml杂记
  • V837s-SDK Telnetd服务连接不上异常解决
  • 蓝奏云(Lanzou Cloud)一款国内知名的免费网盘和文件分享服务 以及蓝奏云的api
  • Cesium1.95中高性能加载1500个点
  • MybatisPlus
  • python整数处理 2022年信息素养大赛复赛/决赛真题 小学组/初中组 python编程挑战赛 真题详细解析
  • c++中类的继承
  • 使用Meshlab处理非流形边的问题
  • ruoyi框架分页插件失效
  • PG库创建自增ID
  • 【无标题】装箱问题的拓扑动力学解法:几何凝聚与量子坍缩模型
  • 7.3.折半查找(二分查找)
  • Playwright:高效处理浏览器兼容性的自动化测试利器
  • BERT情感分类
  • net中Serilog 使用json配置输出日志
  • linux arm系统烧录
  • 铭豹扩展坞 USB转网口 突然无法识别解决方法
  • 参数量计算举例
  • Text GRAD使用场景的案例分析
  • 深度剖析 iPaaS 数据蜂巢:企业数字化集成的关键力量
  • 电子商务平台的安全防护
  • window7 wpf程序打不开问题排查及处理
  • 豆包全新视频生成模型、视觉深度思考模型发布
  • SecureCRT 配色方案 VBScript 脚本
  • SSM框架整合
  • GO 语言中的flag包--易懂解释
  • 编译原理实验 之 TINY 解释测试目标代码
  • 【多智能体】受木偶戏启发实现多智能体协作编排