什么是MyBatis

MyBatis是⼀款优秀的 持久层 框架,⽤于简化JDBC的开发。

MyBatis本是 Apache的⼀个开源项⽬iBatis,2010年这个项⽬由apache迁移到了google code,并

且改名为MyBatis 。2013年11⽉迁移到Github

创建项目时添加依赖

上面有提到⼀个词:持久层

持久层:指的就是持久化操作的层, 通常指数据访问层(dao), 是⽤来操作数据库的.

简单来说 MyBatis 是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库工具

MyBatis⼊⻔

Mybatis操作数据库的步骤:

准备⼯作

创建⼯程

创建springboot⼯程,并导⼊ mybatis的起步依赖、mysql的驱动包

Mybatis 是⼀个持久层框架, 具体的数据存储和数据操作还是在MySQL中操作的, 所以需要添加

MySQL驱动

项⽬⼯程创建完成后,⾃动在pom.xml⽂件中,导⼊Mybatis依赖和MySQL驱动依赖

版本会随着SpringBoot 版本发⽣变化

SpringBoot 3.X对⽤MyBatis版本为3.X

对应关系参考: https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/

 

数据准备

创建⽤⼾表, 并创建对应的实体类User
创建对应的实体类 UserInfo
实体类的属性名与表中的字段名⼀⼀对应,一模一样

配置数据库连接字符串

注意事项:

如果使⽤ MySQL 是 5.x 之前的使⽤的是"com.mysql.jdbc.Driver",如果是⼤于 5.x 使⽤的 是“com.mysql.cj.jdbc.Driver”.

写持久层代码

单元测试

@SpringBootTest就是一个将运行环境交给这个测试类的注解,没有这个注解,就没法注入依赖这些操作,因为被管理的依赖都是在运行环境里的。

MyBatis的基础操作

上⾯使用了Mybatis的查询操作, 接下来学习MyBatis的增, 删, 改操作

在学习这些操作之前, 我们先来学习MyBatis⽇志打印

打印⽇志

在Mybatis当中我们可以借助⽇志, 查看到sql语句的执⾏、执⾏传递的参数以及执⾏结果
在配置⽂件中进⾏配置即可

重新运⾏程序, 可以看到SQL执⾏内容, 以及传递参数和执⾏结果

参数传递

需求: 查找id=4的⽤⼾,对应的SQL就是: select * from user_info where id=4

但是这样的话, 只能查找id=4 的数据, 所以SQL语句中的id值不能写成固定数值,需要变为动态的数值

解决⽅案:在queryById⽅法中添加⼀个参数(id),将⽅法中的参数,传给SQL语句

使⽤ #{} 的⽅式获取⽅法中的参数

如果mapper接⼝⽅法形参只有⼀个普通类型的参数,#{…} ⾥⾯的属性名可以随便写,如:#{id}、# {value}。需要和参数名保持一样,不然没法成功传参,或者使用注解标识参数名。顺序不重要,参数名对的上就行。但是如果只传递一个参数,参数名就不需要对上,因为只有一个参数也没得选,但是最好还是参数名和#{}里的名称对上。

不建议使用方法:

使用paramN在#{}里,这个代值第n个参数。

如果只查询0-1个表当中的数据来赋值给实体类,那么返回值为实体类就行了,没查询到会返回null。如果返回多个数据却用实体类接收会报异常。

如果是查询0-n个数据,就需要将返回值设置为List<T>T是实体类,没查询到会返回null。

如果返回值为基础类型,不是包装类没有查询到数据,返回值可能会有逻辑错误,所以只查询一个基础类型的话推荐使用包装类,包装了的话没有查询到返回null。

list来接受数据库给的返回值是因为,这样就不需要关心数据库具体返回的类型是什么arraylist 还是linklist,只需要知道是一个list类型,来通过多态就可以调用list通用的方法了。

增(Insert)

也可以将传递的参数直接改成传递对象,对象里的属性名和类型也是要一一对应的。

返回主键

Insert 语句默认返回的是受影响的⾏数,这些mysql语句的返回值和在数据库直接调用的返回值是一样的。

但有些情况下, 数据插⼊之后, 还需要有后续的关联操作, 需要获取到新插⼊数据的id

⽐如订单系统

当我们下完订单之后, 需要通知物流系统, 库存系统, 结算系统等, 这时候就需要拿到订单ID

如果想要拿到⾃增id, 需要在Mapper接⼝的⽅法上添加⼀个Options的注解

这个自增id会被赋值到传递的对象里面,通过getid来获得。

删(Delete)

改(Update)

查(Select)

可以看到,mysql的属性写法是下划线写法,而java类当中的写法是小驼峰写法。

起别名

结果映射

开启驼峰命名

mybatis:
        configuration:
                map-underscore-to-camel-case: true # 配置驼峰⾃动转换

MyBatis XML配置文件

Mybatis的开发有两种⽅式:

注解

XML

上⾯学习了注解的⽅式, 接下来我们学习XML的⽅式

使⽤Mybatis的注解⽅式,主要是来完成⼀些简单的增删改查功能. 如果需要实现复杂的SQL功能,建议使⽤XML来配置映射语句,也就是将SQL语句写在XML配置⽂件中.

MyBatis XML的⽅式需要以下两步:

配置数据库连接字符串和MyBatis

写持久层代码

配置连接字符串和MyBatis和写持久层代码的⽅法定义 Interface和使用注解来完成数据库交互的步骤是一样的,除了还要设置MyBatis的XML的文件设置,配置xml文件的扫描路径。

配置连接字符串和MyBatis

# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
10 mybatis.mapper-locations = classpath:mapper/**Mapper.xml
mybatis:
10 mapper-locations: classpath:mapper/**Mapper.xml

 

写持久层代码

 

添加 mapper 接口

注解和xml定义的接口不需要另外实现,用注解和xml就自动实现了。

添加 UserInfoXMLMapper.xml

数据持久成的实现,MyBatis 的固定 xml 格式

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.demo.mapper.UserInfoMapper">//这个定义的是要实//现的类的路径

</mapper>

<?xml version="1.0" encoding="UTF-8"?>

- 作用:这是 XML 文件的声明部分,用于定义 XML 的版本和字符编码。
 
- 解释:
 
-  version="1.0" :指定 XML 文档遵循的 XML 1.0 规范,是目前最基础、通用的 XML 版本。
 
-  encoding="UTF-8" :设置 XML 文件的字符编码为 UTF-8,确保文件能正确解析中文字符等特殊字符,避免乱码问题。 

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

- 作用:定义 XML 的文档类型(DTD,Document Type Definition),用于约束 Mapper XML 的结构和语法。
 
- 解释:
 
-  <!DOCTYPE mapper ... > :声明这是一个 MyBatis 的  mapper  类型文档。
 
-  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" :表示这是 MyBatis 官方定义的公共 DTD, 3.0  是 DTD 的版本, EN  表示语言为英文。
 
-  http://mybatis.org/dtd/mybatis-3-mapper.dtd :指定 DTD 文件的位置,MyBatis 解析器会通过该 URL 验证 XML 内容是否符合 Mapper 文件的语法规则(如标签、属性是否合法)。

 <mapper namespace="com.example.demo.mapper.UserInfoMapper">

 - 作用:定义 Mapper 的命名空间(namespace),是 MyBatis 中非常关键的配置。
 
- 解释:
 
-  namespace  的值通常与对应的 Mapper 接口全类名一致(如这里的  com.example.demo.mapper.UserInfoMapper  ,假设存在同名 Java 接口)。
 
- 作用:
 
- 绑定接口:MyBatis 会通过命名空间关联对应的 Mapper 接口,接口中的方法与 XML 中  <select> 、 <insert>  等标签的  id  一一映射,实现接口方法到 SQL 的关联。
 
- 避免 SQL 冲突:不同 Mapper XML 中即使有相同  id  的 SQL 标签,只要命名空间不同,就不会冲突,保证 SQL 定义的唯一性。

返回的数据类型是实体类的类型,而不是List<T>这样的,要的是返回所包含的类型。 

增(Insert)

UserInfoMapper接⼝:

xml格式,可以随意的换行,还是视为同一条指令的。

删(Delete)

改(Update)

查(Select)

resultType换成了resultMap

这个映射可以多次使用

其他查询操作

多表查询

多表查询和单表查询类似, 只是SQL不同⽽已
准备⼯作
上⾯建了⼀张⽤⼾表, 我们再来建⼀张⽂章表, 进⾏多表关联查询.
⽂章表的uid, 对应⽤⼾表的id.

 

多表查询实际上和单表查询没有区别,需要的是创建另外的实体类,能够接收查询到的数据,虽然可以直接包含其他的实体类,但建议还是另外加上基础类型。

多表查询的问题

实际开发中最好不要用多表查询,因为这会导致一种慢查询的现象,在mysql查询中,每一个查询都需要mysql线程池中的一个线程,多表查询的时间必然比单表查询要慢,那么就会导致占有线程的时间过长,导致其他业务不能及时的得到处理,这是非常致命的。所以建议还是将多表查询细分为单表查询,再通过程序员自身将单表查询到的数据串联起来,能够有效的提升查询效率,并且还能通过索引优化。

 

就像这里一样,多表查询是同时查询两张表并且将两张表的数据段进行比较,而两个单表查询就可以先查询出其中一张表的id,再通过这张表的id作为另外一张表的关联字段 user_id这种作为where的查询条件,就可以加快查询速度。

#{} 和 ${}

MyBatis 参数赋值有两种⽅式, 咱们前⾯使⽤了 #{} 进⾏赋值, 接下来我们看下⼆者的区别

#{} 和 ${}区别

结果依然被正确查询出来了, 其中参数 or被当做了SQL语句的⼀部分,这是一种很危险的情况,代表了不需要密码就可以直接访问数据库的数据。

排序功能

${}可以在那些参数较少,受限制,能够校验的场景下使用。

此之外, 还有表名作为参数时, 也只能使⽤ ${}。

因为有时会有数据量过大,从而导致需要分表分库的情况。 

like 查询

数据库连接池

在上⾯Mybatis的讲解中, 我们使⽤了数据库连接池技术, 避免频繁的创建连接, 销毁连接
下⾯我们来了解下数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个
学习⽂档: https://github.com/alibaba/druid/wiki/%E9%A6%96%E9%A1%B5

总结

 MySQL 开发企业规范

#{} 和${} 区别 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一次jvm机器问题定位经历

背景 开发过程中发现机器指标异常&#xff0c;端口也hang住无响应&#xff0c;端口返回为timeout&#xff0c;对应探活检测也失败了。 现象 在st测试环节&#xff0c;突然每隔一段时间新接口就hang住无响应&#xff0c;观察机器监控也发现端口探活失败&#xff0c;看机器指标…

【机器学习深度学习】张量基本操作

目录 一、张量基本操作 1.1 执行代码 1.2 运行结果 1.3 代码解析 ✅ 1. 创建张量&#xff08;tensor、randn、zeros&#xff09; ✅ 2. 索引与切片&#xff08;类似 NumPy&#xff09; ✅ 3. 形状变换&#xff08;reshape、转置、压缩&#xff09; ✅ 4. 数学运算&#x…

【微信小程序】8、获取用户当前的地理位置

1、获取当前的地理位置 获取当前的地理位置、速度。当用户离开小程序后&#xff0c;此接口无法调用。开启高精度定位&#xff0c;接口耗时会增加&#xff0c;可指定 highAccuracyExpireTime 作为超时时间。 注意&#xff1a; 地图相关使用的坐标格式应为 gcj02。高频率调用会…

Jenkins 常用定时构建脚本

Jenkins 常用定时构建脚本 Jenkins 使用 cron 风格的语法来配置定时构建任务&#xff0c;以下是常用的定时构建脚本示例和说明&#xff1a; 基本语法 Jenkins 定时构建使用五个字段表示时间&#xff0c;格式为&#xff1a; MINUTE HOUR DOM MONTH DOWMINUTE - 分钟 (0-59)H…

ActiveMQ漏洞复现

以下内容均在nextcyber靶场环境中完成&#xff0c;请勿用于非法途径&#xff01; ActiveMQ 反序列化漏洞&#xff08;CVE-2015-5254&#xff09; Apache ActiveMQ是美国阿帕奇&#xff08;Apache&#xff09;软件基金会所研发的一套开源的消息中间件&#xff0c;它支持Java消息…

环保处理设备远程运维管理解决方案

在环保产业蓬勃发展的当下&#xff0c;环保处理设备厂商面临着愈发激烈的市场竞争。为助力环保处理设备厂商在竞争中脱颖而出&#xff0c;御控工业智能网关打造了一套完善的PLC数据采集设备运维管理平台解决方案。此方案凭借其独特优势&#xff0c;能为环保处理设备厂商带来显著…

嵌入式学习笔记DAY43(ARM架构)

一、RAM分类 sram&#xff08;静态随机存取存储器&#xff09;&#xff1a; 原理&#xff1a;使用晶体管来存储二进制数据0和1&#xff0c;通过双稳态电路&#xff08;由多个晶体管组成&#xff09;来保持数据状态&#xff0c;只要持续供电&#xff0c;数据就能稳定保存。数据读…

2025国际无人机应用及防控大会四大技术专题深度解析

2025国际无人机应用及防控大会四大技术专题深度解析 2025国际无人机应用及防控大会四大技术专题深度解析1 无人机系统技术专题技术特点与应用领域国内领军企业及案例风险挑战与发展方向 2 测控与通信导航技术专题技术创新与应用突破领先企业及解决方案现存问题与发展趋势 3 任务…

DD3118S:USB3.0+Type-c双头TF/SD二合一高速0TG多功能手机读卡器ic

DD3118S封装是QFN42, GL3224封装是QFN32 &#xff0c;设计同样一款3.0读卡方案&#xff0c;GL3213S需要电容、电阻外围器件一起要29颗&#xff0c;而DD3118S只需要13颗&#xff0c;方案精简且设计简单 DD3118S支持USB3.0Type-c双头TF/SD二合一 &#xff0c;高速0TG多功能手机读…

如何在FastAPI中玩转GitHub认证,让用户一键登录?

title: 如何在FastAPI中玩转GitHub认证,让用户一键登录? date: 2025/06/22 09:11:47 updated: 2025/06/22 09:11:47 author: cmdragon excerpt: GitHub第三方认证集成通过OAuth2.0授权码流程实现,包含用户跳转GitHub认证、获取授权码、交换访问令牌及调用API获取用户信息四…

深入JVM:从零到实战,解锁Java性能与调优的终极武器

“什么&#xff1f;你还在写CRUD&#xff1f;面试官问个JVM调优直接哑火&#xff1f;线上服务OOM了只能重启大法&#xff1f;” —— 别慌&#xff0c;掌握JVM&#xff0c;你也能成为团队里的“定海神针”&#xff01; 作为一名Java开发者&#xff0c;无论你是刚入行的新人还是…

MyBatis 中的 resultType 与 resultMap:区别、使用场景及示例详解

目录 一、什么是 resultType 1. 定义 2. 特点 3. 使用场景 4. 示例 示例 1&#xff1a;返回一个实体类对象 对应的 Java 类&#xff1a; 示例 2&#xff1a;返回 Map 集合 返回的每个记录是一个 Map&#xff0c;例如&#xff1a; 二、什么是 resultMap 1. 定义 2. …

Mac安装Apache CXF的时候报错:/Library/Internet: No such file or directory

该问题的原因因为配置的JAVA_HOME环境变量路径中的包括空格字符导致的错误。 一、问题排查 输出当前环境变量 $JAVA_HOME的路径地址&#xff0c;观察路径中是否存在空格 echo $JAVA_HOME二、问题解决 将JAVA_HOME路径改为你安装的jdk路径&#xff0c;注意你的版本号可能与我的会…

npm(或pnpm)时报:证书过期 certificate has expired问题

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 首先安装pnpm npm install -g pnpm //检查安装成功的版本 pnpm -v 在拉芋道管理系统&#xff0c;安装依赖pnpm i 时报证书过期 更改了镜像也一样 解决方案&#xff1a; 提示&#xff1a;这里填写该…

回归预测 | Matlab实现KAN神经网络多输入单输出回归预测模型

回归预测 | Matlab实现KAN神经网络多输入单输出回归预测模型 目录 回归预测 | Matlab实现KAN神经网络多输入单输出回归预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 KAN作为这两年最新提出的机制&#xff0c;目前很少人用&#xff0c;很适合作为预测的创新点&…

人生笔记Real:记录生活点滴,守护珍贵记忆

在快节奏的现代生活中&#xff0c;我们常常会有一些瞬间的灵感、难忘的经历或者需要记录的重要事项。然而&#xff0c;如何高效地记录这些内容&#xff0c;并确保它们不会随着时间的流逝而丢失&#xff0c;成为了一个值得思考的问题。《人生笔记Real》正是这样一款简单好用的笔…

自动驾驶数据特征提取实战:用Python打开智能驾驶的新视角

自动驾驶数据特征提取实战:用Python打开智能驾驶的新视角 聊起自动驾驶,很多朋友第一时间想到的可能是“车上的摄像头多牛,传感器多先进”,但让我告诉你,真正决定自动驾驶“大脑”能不能跑得顺畅、跑得准的,是数据的“骨头”—特征。 没错,机器学习、深度学习的基础都…

从零搭建共享棋牌室物联网系统:硬件选型与避坑指南!

近来&#xff0c;24小时共享棋牌室凭借“低成本、无人化、高坪效”的特点成为创业热点。但许多项目在硬件选型阶段就踩坑不断——设备不兼容、安装返工、售后无门等问题频发。本文将结合实战经验&#xff0c;手把手教你从零搭建稳定可靠的棋牌室物联网硬件系统&#xff0c;并附…

NPM 依赖包版本号 `~` 和 `^` 的区别及最佳实践

本文将深入浅出地解释 ~ 与 ^ 在 package.json 中的含义&#xff0c;并结合实际开发流程给出团队协作与发布上线的最佳版本管理策略。 一、版本号的基本结构 NPM 依赖的版本号遵循 SemVer&#xff08;语义化版本&#xff09; 标准&#xff1a; 主版本号.次版本号.补丁号Major…

uniapp报错Cannot read property ‘dataset‘ of null

如果你引入的组件在uniapp分包路径中&#xff0c;就会报错