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

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

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

在这里插入图片描述

相关文章:

  • 债券与股票:投资市场的两大基石
  • 用 OpenSSL 库实现 3DES(三重DES)加密
  • SSL错误无法建立安全连接
  • 三数之和-力扣
  • Koji构建系统宏定义注入与Tag体系解析
  • Bright Data网页抓取工具实战:BOSS直聘爬虫 + PandasAI分析洞察前端岗位市场趋势
  • 西安java面经1
  • Node.js Conf 配置库要点分析 和 使用注意事项
  • 云原生安全实践:CI/CD流水线集成DAST工具
  • 【Lua热更新知识】学习一 Lua语法学习
  • Delphi 获取 XP系统 mac地址
  • 四大LLM 微调开源工具包深度解析
  • 算法第13天|继续学习二叉树:平衡二叉树(递归)、二叉树所有路径(递归)、左叶子之和(递归)
  • mysql如何快速生成测试大数据库
  • Rust 学习笔记:关于 Future trait 和 Async 语法的练习题
  • 项目练习:使用mybatis的foreach标签,实现union all的拼接语句
  • 【Linux shell】条件判断和流程控制
  • 第十四章 Linux实操篇——进程管理(重点)
  • 网络原理8 - HTTP协议1
  • AI Agent 核心策略解析:Function Calling 与 ReAct 的设计哲学与应用实践
  • 网站多久需要维护/线上培训
  • 王野天 女演员/seo关键词seo排名公司
  • 百度一下做网站/百度网址输入
  • 青岛网站建设的方案/抖音关键词挖掘工具
  • 社交网络营销的特点/企业网站优化服务
  • 网站权限设计方案/网推团队