MyBatis基础之自动映射、映射类型、文件注解双配置

文章目录
- 自动映射原理
- jdbcType
- 同时启用配置文件和注解两种配置方式
自动映射原理
在 MyBatis 的配置文件(settings 元素部分)中,有一个 autoMappingBehavior 配置,其默认值为 PARTIAL ,表示 MyBatis 会自动映射(简单的,没有嵌套关系的)结果集。
有三种自动映射等级:
NONE - 禁用自动映射。仅对手动映射的属性进行映射。
PARTIAL - 对除在内部定义了嵌套结果映射(也就是连接的属性)以外的属性进行映射
FULL - 自动映射所有属性。`
"PARTIAL"也 表示设置自动映射的行为为部分匹配模式。具体来说,当实体类中存在与查询结果列相同的属性时,MyBatis 会将它们进行自动映射,而对于没有匹配的列,则会忽略它们。这样可以避免在实体类中定义过多无用的属性。
需要注意的是,如果设置了全局的自动映射行为(通过 标签中的 autoMappingBehavior 属性),则该项设置会被覆盖。此外,还可以在映射语句(Mapper)级别或者方法级别上进行自定义的自动映射行为设置,其他可以参考官方文档Auto-Mapping。
<configuration><properties>....</properties><settings>....<setting name="autoMappingBehavior" value="PARTIAL"/>....</settings><typeAliases>....</typeAliases> ....</configuration>
如果你的类的属性名与表的字段名一致,那么 MyBatis 会自动将结果集的一行封装成一个 JavaBean 。
一般而言,数据库表和字段的命名风格是以下划线为分隔符,而 Java 中命名风格是驼峰命风格。
如果,PO 类的属性名和 Table 的列名仅仅是命名风格的不同,那么此时你可以使用 mapUnderscoreToCamelCase 进行控制,以便于自动转换或不转换。
<configuration><properties>....</properties><settings>....<setting name="mapUnderscoreToCamelCase" value="false"/>....</settings><typeAliases>....</typeAliases> ....</configuration>
jdbcType
将 ResultSet 数据映射成对象时,会涉及到两种数据类型:数据库类型(varchar) 和 Java 类型(String)。MyBatis 使用 类型转换器(typeHandler)来处理两种类型数据的转换问题。
[!attention]注意,
不同的数据库对于同一个数据类型的概念可能会使用不同的『单词』。
例如:整型,在 MySQL 中是 INT ,在 Oracle 中是 INTEGER 。
在 Java 的 JDBC 中,对不同数据库的各种类型的『称呼』进行了统一:JDBC 类型 。例如:
『整型』的 JDBC Type 表示为 INTEGER ,即表示 MySQL 中的 INT ,又表示 Oracle 中的 INTEGER 。
常见的有:
| JDBC Type | Mysql Type | Java Type |
|---|---|---|
| SMALLINT | SMALLINT | short java.lang.Short |
| INTEGER | INTEGER | int java.lang.Integer |
| BIGINT | BIGINT | long java.lang.Long |
| FLOAT | FLOAT | float java.lang.Float |
| DOUBLE | DOUBLE | double java.lang.Double |
| DECIMAL | DECIMAL | java.math.BigDecimal |
| CHAR | CHAR | java.lang.String |
| VARCHAR | VARCHAR | java.lang.String |
| DATE | DATE | java.util.Date |
| TIME | TIME | java.util.Date |
| TIMESTAMP | TIMESTAMP | java.util.Date |
注意:对于 java.lang.Date 和 java.sql.Date ,是两种不同的类型。在写 JavaBean 一定要确认你所使用的是哪个 Date 类型(一般都是使用 java.lang.Date)。
同时启用配置文件和注解两种配置方式
虽然通过 mapper.xml 配置文件和注解都可以拿到 mapper 对象,进而操作数据库,不过,有意思地是,Mybatis 居然支持同时使用 mapper.xml 和注解。
虽然这个特性看起来有些多余,但是实际上它极具价值,因为,注解配置虽然万般皆好,唯独有一个功能它实现不了,在这个功能上注解是取代不了 mapper.xml 配置文件的(不知道这个问题在 MyBatis 的未来的发展中会不会解决掉)。所以,MyBatis 允许两种配置方式同时使用,我们就可以同时「享受」注解和配置文件的全部优点的同时,又避免各自的缺点。
同时使用两种配置方式本质上是让 mapper.xml 和注解两者进行分工,你要做的操作和工作分配如下:
- “退回”到早期 mapper.xml 的使用方式:在核心配置文件中指定 mapper.xml 配置文件的路径名(而不是指定接口所在) ;
- 在 mapper.xml 配置文件中只配置 “<resultMap>” 指定映射规则,不配置 SQL 语句。SQL 语句在接口中通过 @Select 等注解指定;
- 在注解中使用 “@ResultMap” 注解引用 mapper.xml 配置文件中的映射规则。
[!attention] 注意
映射文件中的映射规则 “<resultMap>” 可以有多个,他们之间通过 id 来进行区分。
另外,注解是哪一点功能实现不了,反而不如 mapper.xml 配置文件,我们在复杂映射关系之后讲解。其实就是 @Results 注解没有 100% 实现 <resultMap> 的全部功能。
相关文章:
MyBatis基础之自动映射、映射类型、文件注解双配置
文章目录 自动映射原理jdbcType同时启用配置文件和注解两种配置方式 自动映射原理 在 MyBatis 的配置文件(settings 元素部分)中,有一个 autoMappingBehavior 配置,其默认值为 PARTIAL ,表示 MyBatis 会自动映射&…...
8、docker 安装 nginx
1、下载镜像 docker pull nginx 2、本机创建目录 1)创建nginx挂载目录 mkdir /usr/local/nginx 2)进入nginx目录 cd /usr/local/nginx 3)创建 www和logs目录 mkdir -p www logs 3、创建nginx容器 此容器用于复制配置文件,复…...
关于Skywalking Agent customize-enhance-trace对应用复杂参数类型取值
对于Skywalking Agent customize-enhance-trace 大家应该不陌生了,主要支持以非入侵的方式按用户自定义的Span跟踪对应的应用方法,并获取数据。 参考https://skywalking.apache.org/docs/skywalking-java/v9.0.0/en/setup/service-agent/java-agent/cust…...
手机路径、Windows路径知识及delphiXE跨设备APP自动下载和升级
手机路径、Windows路径知识 及delphiXE跨设备APP自动下载和升级 一、APP安装程序文件版本和权限信息 1、运行时动态调用Android apk的AndroidManifest.xml获取versionName 2、运行时动态调用IOS ipa的info.plist获取CFBundleVersion (和entitlements)…...
GitLab 502问题解决方案
由于最近 gitlab 切换到另一台服务器上部署的 gitlab 后,经常出现 502。平时重启 gitlab 后都能解决,今天突然重启多次后都还是 502(重启日志是正常的),遂通过 gitlab-ctl tail 查看日志进行排查。 gitlab-ctl tail通…...
selenium打开火狐浏览器
项目上需求为:甲方OA 系统是IE系统,需要从IE系统点个按钮打开火狐浏览器单点登录跳转到我们的系统 前期解决方案为:打开浏览器就行了,然后就用的是打开本地浏览器,但是由于B/S架构,有别人远程访问我的ip来…...
多标签分类论文笔记 | ML-Decoder: Scalable and Versatile Classification Head
个人论文精读笔记,主要是翻译心得,欢迎旁观,如果有兴趣可以在评论区留言,我们一起探讨。 Paper: https://arxiv.org/pdf/2111.12933.pdf Code: https://github.com/Alibaba-MIIL/ML_Decoder 文章目录 0. 摘要1. 介绍2. 方法2.1 Ba…...
修改http_charfinder.py使能在python311环境中运行
需要修改两个函数,第一个是init函数,修改如下: async def init(loop, address, port): # <1> # app web.Application(looploop) # <2> # app.router.add_route(GET, /, home) # <3> app web.Application(…...
蓝桥杯(跳跃 C++)
思路: 1、根据题目很容易知道可以用深度搜索、广度搜索、动态规划的思想解题。 2、这里利用深度搜素,由题目可知,可以往九个方向走。 3、这里的判断边界就是走到终点。 #include<iostream> using namespace std; int max1 0; int …...
08 | Jackson 注解在实体里面如何应用?常见的死循环问题如何解决?
我们用 Spring Boot 里面默认集成的 fasterxml.jackson 加以说明,这看似和 JPA 没什么关系,但是一旦我们和 Entity 一起使用的时候,就会遇到一些问题,特别是新手同学,我们这一课时详细介绍一下用法。先来跟着我了解一下…...
JavaScript—获取当前时间 并转化为yyyy-MM-dd hh:mm:ss格式
JavaScript—获取当前时间 并转化为yyyy-MM-dd hh:mm:ss格式 每次项目都需要用到时间戳格式,可以封装成一个方法 下次直接CV过去 const timestampPadStart=(str)=>{str=String(str);return str.padStart(2,0)...
OpenHarmony创新赛丨报名倒计时,超强秘籍带你直通大奖!
OpenHarmony创新赛报名倒计时开始啦! 设于开放原子全球开源大赛下的OpenHarmony创新赛,目前正在如火如荼地进行赛事招募中!这次大赛围绕创新应用、商显行业、金融行业三大赛题,邀请来自企业、个人、高校师生等各界群体的优秀开发者…...
Linux高性能服务器编程 学习笔记 第十四章 进程池和线程池
动态创建子进程或子线程的缺点: 1.动态创建进程或线程比较耗时,这将导致较慢的客户响应。 2.动态创建的子进程或子线程通常只用来为一个客户服务(除非我们做特殊处理),这将导致系统上产生大量的进程或线程,…...
微信小程序/vue3/uview-plus form兜底校验
效果图 代码 <template><u-form :model"form" ref"formRole" :rules"rules"><u-form-item prop"nickname"><u-input v-model"form.nickname" placeholder"姓名" border"none" /&…...
Photoshop 2024正式发布!内置最新PS AI,创意填充等功能无限制使用!
PS正式版目前更新到了2024,版本为25.0。 安装教程 1、下载得到安装包后,先解压。鼠标右键,【解压到当前文件夹】 2、双击 Set-up 开始安装 3、这里可以更改安装位置。如果C盘空间不够大,可以把它安装到C盘以外。更改好后&#x…...
芯片学习记录TLP184
TLP184 芯片介绍 TLP184是一款光耦隔离器,它的主要特点包括:高电压耐受能力、高传输速度、高共模隔离能力、低功耗等。它可以用于工业自动化、通信设备、家用电器等领域的电气隔离应用。由一个光电晶体管组成,光学耦合到两个红外发射二极管…...
C++ 重载运算符和重载函数
前言 C 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 当您调用一个…...
Linux:mongodb数据库基础操作(3.4版本)
安装 3.*版本和4.*版本安装都是一样的 Linux:mongodb数据库源码包安装(4.4.25版本)_鲍海超-GNUBHCkalitarro的博客-CSDN博客https://blog.csdn.net/w14768855/article/details/133826626?spm1001.2014.3001.5501 mysql和mongodb对比 登录…...
nginx实现灰度上线(InsCode AI 创作助手)
要基于Nginx实现灰度上线,有以下三种方法: 权重分发:使用Nginx的upstream模块来设置不同服务器的权重。将一部分请求分发给新版本服务器,另一部分请求分发给旧版本服务器。这可以通过以下方式实现: http {upstream bac…...
记:apifox 返回 invalid header token 的问题排查思路
背景: 某接口服务使用 springboot 2.x 开发, RestController 、ReqeustBody 在本地(localhost)调用的时候正常、chrome (.cn域名访问)浏览器访问正常。 换成 apifox (.cn域名访问)、postman (.cn域名访问)调用异常返回:invalid header t…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
