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



注解查询映射
我们再来调用下面的 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 # 开启驼峰命名自动转换



相关文章:
【MyBatis】深入解析 MyBatis:关于注解和 XML 的 MyBatis 开发方案下字段名不一致的的查询映射解决方案
注解查询映射 我们再来调用下面的 selectAll() 这个接口,执行的 SQL 是 select* from user_info,表示全列查询: 运行测试类对应方法,在日志中可以看到,字段名一致,Mybatis 就成功从数据库对应的字段中拿到…...
图像退化对目标检测的影响 !!
文章目录 引言 1、理解图像退化 2、目标检测中的挑战 3、应对退化的自适应方法 4、新兴技术与研究方向 5、未来展望 6、代码 7、结论 引言 在计算机视觉领域,目标检测是一项关键任务,它使计算机能够识别和定位数字图像中的物体。这项技术支撑着从自动驾…...
《AI大模型应知应会100篇》第57篇:LlamaIndex使用指南:构建高效知识库
第57篇:LlamaIndex使用指南:构建高效知识库 摘要 在大语言模型(LLM)驱动的智能应用中,如何高效地管理和利用海量知识数据是开发者面临的核心挑战之一。LlamaIndex(原 GPT Index) 是一个专为构建…...
目标检测中COCO评估指标中每个指标的具体含义说明:AP、AR
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...
鸿蒙应用元服务开发-Account Kit概述
Account Kit(华为账号服务)提供简单、快速、安全的登录功能,让用户快捷地使用华为账号登录元服务。用户授权后,Account Kit可提供头像、手机号码等信息,帮助元服务更了解用户。Account Kit提供的SampleCode示例工程体现…...
如何利用ATECLOUD测试平台的芯片测试解决方案实现4644芯片的测试?
作为多通道 DC-DC 电源管理芯片的代表产品,4644 凭借 95% 以上的转换效率、1% 的输出精度及多重保护机制,广泛应用于航天航空(卫星电源系统)、医疗设备(MRI 梯度功放)、工业控制(伺服驱动单元&a…...
SpringBoot集成OAuth2.0
文章目录 OAuth 2.0 介绍概念与传统认证方式的对比常见应用场景 OAuth 2.0 原理核心角色授权流程 Spring Boot 集成 OAuth 2.01. 添加依赖2. 配置 OAuth 2.0 客户端3. 配置 Spring Security4. 创建控制器5. 主应用类 代码解释 OAuth 2.0 介绍 概念 OAuth 2.0 是一个开放标准的…...
《继电器:机械骑士的电磁战甲》
点击下面图片带您领略全新的嵌入式学习路线 🔥爆款热榜 88万阅读 1.6万收藏 第一章:千年契约的青铜誓言 在电气王国的熔炉深处,电磁铁与簧片的盟约已镌刻千年。电磁铁身披螺旋铜线编织的斗篷,其胸膛中沉睡着一道可召唤磁力的古…...
c++中cin.ignore()的作用
在 C 中,cin.ignore() 是用于忽略(丢弃)输入流中的字符的函数,通常用来清除输入缓冲区中的残留内容(如换行符、多余输入等),以避免影响后续的输入操作。 基本用法 cin.ignore(n, delim);n&…...
python如何获取html中附件链接,并下载保存附件
在Python中,要获取HTML中的附件链接并下载保存附件,你通常需要执行以下步骤: 解析HTML内容:使用像BeautifulSoup这样的库来解析HTML并找到包含附件链接的标签(例如<a>标签,它们通常有一个href属性指向…...
【计算机相关学习】R语言
在Python统治数据科学的时代,我意外推开了R语言的大门。这个诞生于统计学家之手的编程语言,像一把精巧的手术刀,改变了我对数据处理的认知边界。 语法里的统计基因令人惊艳。当我第一次用<-符号完成变量赋值时,这个源…...
JavaScript DOM 节点操作
目录 一、DOM 节点 节点类型(Node Types) 二、查找节点 1.查找父节点 1. parentNode 2. parentElement 2.查找子节点 1. childNodes 2. children 3. firstChild / lastChild 4. firstElementChild / lastElementChild 3.查找兄弟节点 1. pre…...
快速求平方根
1. 前置知识 建议首先阅读我的另外一篇文章《雷神之锤 III 竞技场》快速求平方根倒数的计算探究》。建议大家自己看过《雷神之锤 III 竞技场》快速求平方根倒数的计算探究》学会快速求平方根倒数算法后,不看我这篇文章,自己推导一篇快速求平方根的算法&…...
科普:One-Class SVM和SVDD
SVM(支持向量机)算法是用于解决二分类问题的,它在样本空间(高维空间)中找一个最优超平面,使得两类数据点中离超平面最近的点(称为支持向量)到超平面的距离最大。 对于极少数“坏样本…...
Vue 3 中按照某个字段将数组分成多个数组
方法一:使用 reduce 方法 const originalArray [{ id: 1, category: A, name: Item 1 },{ id: 2, category: B, name: Item 2 },{ id: 3, category: A, name: Item 3 },{ id: 4, category: C, name: Item 4 },{ id: 5, category: B, name: Item 5 }, ];const grou…...
冒泡排序笔记
核心思想 通过相邻元素的比较和交换,使较大的元素逐渐“浮”到数组的末尾(像气泡从水底冒到水面一样) 基础冒泡排序 public class BubbleSort{public static void bubbleSort(int[] arr){for(int i 0; i < arr.length - 1; i){//冒泡…...
【ABAP】REST/HTTP技术(一)
1、概念 1.1、SAP 如何提供 Http Service 如果要将 SAP 应用程序服务器 (application server)作为 http 服务提供者,需要定义一个类,这个类必须实现 IF_HTTP_EXTENSION 接口。IF_HTTP_EXTENSION 接口只有一个方法 HANDLE_REQUEST。…...
Flutter PopupMenuButton 深度解析:从入门到架构级实战
在移动应用交互设计中,上下文菜单如同隐形的魔法师,在有限屏幕空间中优雅地扩展操作维度。作为Flutter框架中的核心交互组件,PopupMenuButton绝非简单的菜单触发器,其背后蕴含着Material Design的交互哲学、声明式UI的架构智慧以及…...
C语言基础要素(019):输出ASCII码表
计算机以二进制处理信息,但二进制对人类并不友好。比如说我们规定用二进制值 01000001 表示字母’A’,显然通过键盘输入或屏幕阅读此数据而理解它为字母A,是比较困难的。为了有效的使用信息,先驱者们创建了一种称为ASCII码的交换代…...
VSCode开发者工具快捷键
自动生成浏览器文件.html的快捷方式 在文本里输入: ! enter VSCode常用快捷键列表 代码格式化:Shift Alt F向上或向下移动一行:Alt Up 或者 Alt Down快速复制一行代码:Shift Alt Up 或者 Shift Alt Down快速保…...
CI/CD(九) Jenkins共享库与多分支流水线准备
后端构建 零:安装插件 Pipeline: Stage View(阶段视图)、SSH Pipeline Steps(共享库代码中要调用sshCommond命令) 一、上传共享库 二、Jenkins配置共享库 3、新增静态资源与修改配置 如果是docker和k8s启动…...
使用Deployment运行无状态应用
使用Deployment运行无状态应用 文章目录 使用Deployment运行无状态应用[toc]一、工作负载资源与控制器二、ReplicationController、ReplicaSet和Deployment1. ReplicationController(已淘汰)2. ReplicaSet(ReplicationController 的增强版&am…...
pip安装timm依赖失败
在pycharm终端给虚拟环境安装timm库失败( pip install timm),提示你要访问 https://rustup.rs/ 来下载并安装 Rust 和 Cargo 直接不用管,换一条命令 pip install timm0.6.13 成功安装 简单粗暴...
详解隔离级别(4种),分别用表格展示问题出现的过程及解决办法
选择隔离级别的时候,既需要考虑数据的一致性,避免脏数据,又要考虑系统性能的问题。下面我们通过商品抢购的场景来讲述这4种隔离级别的区别 未提交读(read uncommitted) 未提交读是最低的隔离级别,其含义是…...
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
⼆分答案可以处理⼤部分「最⼤值最⼩」以及「最⼩值最⼤」的问题。如果「解空间」在从⼩到⼤的「变化」过程中,「判断」答案的结果出现「⼆段性」,此时我们就可以「⼆分」这个「解空间」,通过「判断」,找出最优解。 这个「⼆分答案…...
深层储层弹塑性水力裂缝扩展机理
弹性与弹塑性储层条件下裂缝形态对比 参考: The propagation mechanism of elastoplastic hydraulic fracture in deep reservoir | International Journal of Coal Science & Technology...
循环神经网络 - 机器学习任务之异步的序列到序列模式
前面我们学习了机器学习任务之同步的序列到序列模式:循环神经网络 - 机器学习任务之同步的序列到序列模式-CSDN博客 本文我们来学习循环神经网络应用中的第三种模式:异步的序列到序列模式! 一、基本概述: 异步的序列到序列模式…...
什么是检索增强生成(RAG)
1、什么是检索增强生成(RAG) 1.1 检索增强生成的概念 检索增强生成(Retrieval-Augmented Generation, RAG)是一种结合了信息检索和文本生成技术的新型自然语言处理方法。这种方法增强了模型的理解和生成能力。 相较于经典生成…...
MATLAB 控制系统设计与仿真 - 33
状态反馈控制系统 -全维状态观测器的实现 状态观测器的建立解决了受控系统不能测量的状态重构问题,使得状态反馈的工程实现成为可能。 考虑到系统的状态方程表达式,如果{A,B}可控,{A,C}可观,且安装系统的性能指标,可…...
PM2 在 Node.js 项目中的使用与部署指南
一、PM2 简介 PM2 是一个带有负载均衡功能的 Node.js 应用程序的进程管理器。它可以让你的 Node.js 应用程序始终保持运行状态,即使出现错误或服务器重启也能自动恢复。同时,它还提供了诸如日志管理、性能监控等实用功能,极大地简化了 Nod…...
