【MyBatis】深入解析 MyBatis:关于注解和 XML 的 MyBatis 开发方案下字段名不一致的的查询映射解决方案

news2025/4/11 7:25:03

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


注解查询映射


我们再来调用下面的 selectAll() 这个接口,执行的 SQL 是 select* from user_info,表示全列查询:
在这里插入图片描述


运行测试类对应方法,在日志中可以看到,字段名一致,Mybatis 就成功从数据库对应的字段中拿到值,但是字段名不一样,则没有从数据库中获取到值;

在这里插入图片描述

因为 Java 和数据库的属性命名规范不同,导致一些字段名称不同;

虽然数据库返回的值是正确的,但是并没有给 Java 中 UserInfo 类对象的各个属性成功赋值;


此时,我们需要一个转换规则,让名称不一样的字段可以对应起来:

在这里插入图片描述


通过 as 起别名映射


我们通过 as 关键字来给字段起别名

select id , username, `password`, age, gender, phone, delete_flag as deleteFlag, create_time as createTime, update_time as updateTime from user_info;

验证 SQL 语句是否可以被成功执行:

在这里插入图片描述


接下来,我们将起好别名的 SQL 语句用 Mybatis 执行:

在这里插入图片描述


执行对应测试类方法,观察打印日志:

在这里插入图片描述


通过 @Results 进行结构映射映射


但是上面的方式还是比较麻烦的,我们可以通过注解 @Results 来绑定参数:

在这里插入图片描述


我们再继续点 Result [ ] 查看源码:

在这里插入图片描述


光从源码,我们还是无法知道 @Results 注解是如何使用的;

下面是 @Results 注解的使用,用于对应名称不一样的数据库字段和 java 属性:
在这里插入图片描述


我们重新执行对应的测试类方法,观察打印日志:

在这里插入图片描述


通过 @ResultsMap 复用@Results


但是如果后续还要执行关于 select 的 SQL ,岂不是每一个接口方法都要加上:

    @Results({
            @Result(column = "delete_flag" , property = "deleteFlag"),
            @Result(column = "create_time" , property = "createTime"),
            @Result(column = "update_time" , property = "updateTime")
    })

还是有些麻烦了,是否有更简单的工具,可以帮我们对应上名称不一样的字段呢?

在这里插入图片描述

我们再来查看 @Results 注解的源码,源码不单单只有 Result[ ],还有 id;

这个 id 属性可以帮我们标识一条 @Result 注解对应的名字:

在这里插入图片描述


通过上面的方式,我们就给这条注解起好了名字,后续如果还要使用 @Results 映射刚刚的字段,只需要使用 @ResultMap 注解来映射 @Results 即可

在这里插入图片描述


执行 selectAllById 接口对应的测试类方法,观察日志,成功给后面三个字段赋值,说明映射成功:
在这里插入图片描述


开启驼峰命名


但但但但但是,上面的两种方式还是太吃操作了,煮啵煮啵,有没有更简单快捷的映射方法推荐一下?

有的兄弟,有的!!!

接下来这款操作,不需要修改老长的 SQL 语句,也不需要使用复杂的 @Results、@Result、@ResultMap 注解;

我们只需要赋值下面的代码到配置文件中,即可实现从数据库命名规范字段 Java 命名规范字段的转换:

mybatis:
  configuration:
    map-underscore-to-camel-case: true  # 开启驼峰命名自动转换

通常数据库列使用蛇形命名法进行命名(下划线分割各个单词),而 Java 属性一般遵循驼峰命名法约定。

在这里插入图片描述

为了在这两种命名方式之间启用自动映射,需要将mapUnderscoreToCamelCase设置为true。


驼峰命名规则:abc_xyz => abcXyz

  • 表中字段名:abc_xyz
  • 类中属性名:abcXyz

配置好对应 yml 文件后,我们再来执行下列接口对应的测试类方法:

在这里插入图片描述


观察打印日志,赋值成功,说明成功映射参数:

在这里插入图片描述


XML 查询映射


通过 as 起别名映射


上文提到,我们可以使用 as 对 SQL 中的字段起别名,来解决查询映射的问题;

那么在 XML 开发模式下,又该如何解决该问题呢?我们写出如下 SQL:

select id , username, `password`, age, gender, phone, delete_flag as deleteFlag, create_time as createTime, update_time as updateTime from user_info;

在这里插入图片描述

值得一提,XML 文件中的 SQL 语句换行没有意义,依旧代表一个完整的字符串,但是在 java 文件中,SQL 语句换行是需要带上 + 加号的;


我们执行对应的测试类方法:

在这里插入图片描述


查看打印日志,可以发现,不同名的对应属性通过起别名的方式,依旧可以成功映射:

在这里插入图片描述


结果映射


我们重新添加一个方法,来讲解结果映射:

在这里插入图片描述


<resultsMap>


此时,我们需要使用 <resultMap> </resultMap> 标签来进行结果映射

在这里插入图片描述


在这里插入图片描述


其实<resultsMap>标签和 @Result 注解源码是类似的,需要写的字段一样,知识写法不同:

在这里插入图片描述


@Results 的写法如下:

在这里插入图片描述


我们可以类比 <resultsMap> 的写法:

在这里插入图片描述


在这里插入图片描述

不过,如果使用这种方法来映射属性,就要把对象中的所有属性的映射都写全;

因为在别的 XML 文件中,依旧可以引入这个映射,特定场景下,如果这个映射没有写入全部对象属性,则可能会映射不上;


在这里插入图片描述


在这里插入图片描述


生成测试语句,调用 selectAll2() 对应的测试类方法,观察打印日志:

在这里插入图片描述


开启驼峰命名


mybatis:
  configuration:
    map-underscore-to-camel-case: true  # 开启驼峰命名自动转换

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2328116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图像退化对目标检测的影响 !!

文章目录 引言 1、理解图像退化 2、目标检测中的挑战 3、应对退化的自适应方法 4、新兴技术与研究方向 5、未来展望 6、代码 7、结论 引言 在计算机视觉领域&#xff0c;目标检测是一项关键任务&#xff0c;它使计算机能够识别和定位数字图像中的物体。这项技术支撑着从自动驾…

《AI大模型应知应会100篇》第57篇:LlamaIndex使用指南:构建高效知识库

第57篇&#xff1a;LlamaIndex使用指南&#xff1a;构建高效知识库 摘要 在大语言模型&#xff08;LLM&#xff09;驱动的智能应用中&#xff0c;如何高效地管理和利用海量知识数据是开发者面临的核心挑战之一。LlamaIndex&#xff08;原 GPT Index&#xff09; 是一个专为构建…

目标检测中COCO评估指标中每个指标的具体含义说明:AP、AR

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

如何利用ATECLOUD测试平台的芯片测试解决方案实现4644芯片的测试?

作为多通道 DC-DC 电源管理芯片的代表产品&#xff0c;4644 凭借 95% 以上的转换效率、1% 的输出精度及多重保护机制&#xff0c;广泛应用于航天航空&#xff08;卫星电源系统&#xff09;、医疗设备&#xff08;MRI 梯度功放&#xff09;、工业控制&#xff08;伺服驱动单元&a…

《继电器:机械骑士的电磁战甲》

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 第一章&#xff1a;千年契约的青铜誓言 在电气王国的熔炉深处&#xff0c;电磁铁与簧片的盟约已镌刻千年。电磁铁身披螺旋铜线编织的斗篷&#xff0c;其胸膛中沉睡着一道可召唤磁力的古…

快速求平方根

1. 前置知识 建议首先阅读我的另外一篇文章《雷神之锤 III 竞技场》快速求平方根倒数的计算探究》。建议大家自己看过《雷神之锤 III 竞技场》快速求平方根倒数的计算探究》学会快速求平方根倒数算法后&#xff0c;不看我这篇文章&#xff0c;自己推导一篇快速求平方根的算法&…

C语言基础要素(019):输出ASCII码表

计算机以二进制处理信息&#xff0c;但二进制对人类并不友好。比如说我们规定用二进制值 01000001 表示字母’A’&#xff0c;显然通过键盘输入或屏幕阅读此数据而理解它为字母A&#xff0c;是比较困难的。为了有效的使用信息&#xff0c;先驱者们创建了一种称为ASCII码的交换代…

CI/CD(九) Jenkins共享库与多分支流水线准备

后端构建 零&#xff1a;安装插件 Pipeline: Stage View&#xff08;阶段视图&#xff09;、SSH Pipeline Steps&#xff08;共享库代码中要调用sshCommond命令&#xff09; 一、上传共享库 二、Jenkins配置共享库 3、新增静态资源与修改配置 如果是docker和k8s启动&#xf…

pip安装timm依赖失败

在pycharm终端给虚拟环境安装timm库失败&#xff08; pip install timm&#xff09;&#xff0c;提示你要访问 https://rustup.rs/ 来下载并安装 Rust 和 Cargo 直接不用管&#xff0c;换一条命令 pip install timm0.6.13 成功安装 简单粗暴

详解隔离级别(4种),分别用表格展示问题出现的过程及解决办法

选择隔离级别的时候&#xff0c;既需要考虑数据的一致性&#xff0c;避免脏数据&#xff0c;又要考虑系统性能的问题。下面我们通过商品抢购的场景来讲述这4种隔离级别的区别 未提交读&#xff08;read uncommitted&#xff09; 未提交读是最低的隔离级别&#xff0c;其含义是…

NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)

⼆分答案可以处理⼤部分「最⼤值最⼩」以及「最⼩值最⼤」的问题。如果「解空间」在从⼩到⼤的「变化」过程中&#xff0c;「判断」答案的结果出现「⼆段性」&#xff0c;此时我们就可以「⼆分」这个「解空间」&#xff0c;通过「判断」&#xff0c;找出最优解。 这个「⼆分答案…

深层储层弹塑性水力裂缝扩展机理

弹性与弹塑性储层条件下裂缝形态对比 参考&#xff1a; The propagation mechanism of elastoplastic hydraulic fracture in deep reservoir | International Journal of Coal Science & Technology

循环神经网络 - 机器学习任务之异步的序列到序列模式

前面我们学习了机器学习任务之同步的序列到序列模式&#xff1a;循环神经网络 - 机器学习任务之同步的序列到序列模式-CSDN博客 本文我们来学习循环神经网络应用中的第三种模式&#xff1a;异步的序列到序列模式&#xff01; 一、基本概述&#xff1a; 异步的序列到序列模式…

什么是检索增强生成(RAG)

1、什么是检索增强生成&#xff08;RAG&#xff09; 1.1 检索增强生成的概念 检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;是一种结合了信息检索和文本生成技术的新型自然语言处理方法。这种方法增强了模型的理解和生成能力。 相较于经典生成…

MATLAB 控制系统设计与仿真 - 33

状态反馈控制系统 -全维状态观测器的实现 状态观测器的建立解决了受控系统不能测量的状态重构问题&#xff0c;使得状态反馈的工程实现成为可能。 考虑到系统的状态方程表达式&#xff0c;如果{A,B}可控&#xff0c;{A,C}可观&#xff0c;且安装系统的性能指标&#xff0c;可…

企业管理系统的功能架构设计与实现

一、企业管理系统的核心功能模块 企业管理系统作为现代企业的中枢神经系统&#xff0c;涵盖了多个核心功能模块&#xff0c;以确保企业运营的顺畅与高效。这些功能模块通常包括&#xff1a; 人力资源管理模块&#xff1a;负责员工信息的录入、维护、查询及统计分析&#xff0c…

覆盖学术、职场、生活的专业计算工具

软件介绍 今天要给大家介绍一款超给力的工具软件——CalcKit 计算器。它就像是你口袋里的智能计算专家&#xff0c;轻松化解日常生活中的各类计算难题。无论是简单的数字加减乘除&#xff0c;还是复杂的专业运算&#xff0c;它都不在话下。 这款软件内置了极为强大的计算功能…

【大模型系列篇】大模型基建工程:基于 FastAPI 自动构建 SSE MCP 服务器 —— 进阶篇

&#x1f525;&#x1f525;&#x1f525; 上期 《大模型基建工程&#xff1a;基于 FastAPI 自动构建 SSE MCP 服务器》中我们使用fastapi-mcp自动挂载fastapi到mcp工具&#xff0c;通过源码分析和实践&#xff0c;我们发现每次sse请求又转到了内部fastapi RESTful api接口&…

【python】Plot a Square

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数 更多有趣的代码示例&#xff0c;可参考【Programming】 1、功能描述 用 python 实现&#xff0c;以 A和B两个点为边长&#xff0c;方向朝 C 绘制正方形 思路&#xff1a; 计算向量 AB 和 AC。使用向…

实战打靶集锦-37-Wpwnvm

文章目录 1. 主机发现2. 端口扫描&服务枚举3. 服务探查4. 系统提权 靶机地址&#xff1a;https://download.vulnhub.com/wpwn/wpwnvm.zip 1. 主机发现 目前只知道目标靶机在192.168.37.xx网段&#xff0c;通过如下的命令&#xff0c;看看这个网段上在线的主机。 $ nmap -…