浅谈 Mybatis 框架

news2024/11/16 16:44:00

文章目录

  • 一、什么是MyBatis?
    • 1.2、JDBC
  • 二、使用Mybatis
    • 2.1、配置MyBatis开发环境
      • 2.1.1、配置连接字符串
      • 2.1.2、配置MyBatis中的XML路径
    • 2.2、使用MyBatis模式和语法操作数据库
  • 三、使用 Mybatis 进行增删改查操作的要点
    • 3.1、ResultMap的用法
  • 四、Mybatis操作难点
    • 4.1、#{ } 和 ${ } 的区别
      • 4.1.1、SQL注入问题
    • 4.2、like 模糊查询
    • 4.3、多表查询、联合查询
    • 4.3、动态 sql 的使用
      • 4.3.1、if 标签
      • 4.3.2、trim 标签
      • 4.3.3、where 标签
      • 4.3.4、set 标签
      • 4.3.5、foreach 标签

一、什么是MyBatis?

MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程(多条SQL语句的集合)以及高级映射。MyBatis 去除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的XML或注解来配置和映射原始类型、接口和Java POJO (Plain Old Java Objects,普通老式Java对象)为数据库中的记录。

存储过程:
在这里插入图片描述
高级映射:程序中的类对应数据库中的表,程序中的类里的属性对应数据库的表中的字段。ORM把数据库映射为对象:数据库表(table) -->类(class)、
记录(record, 行数据) -->对象(object)、字段(field) -->对象的属性(attribute)

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

1.2、JDBC

我们之前使用JDBC连接数据库,那为什么还要学习MyBatis?这是因为JDBC操作十分繁琐。以下是JDBC的操作流程:
(1)、创建数据库连接池DataSource
(2)、通过DataSource获取数据库连接Connection
(3)、编写要执行带 ?占位符的SQL语句
(4)、通过Connection及SQL创建操作命令对象Statement
(5)、替换占位符:指定要替换的数据库字段类型,占位符索引及要替换的值
(6)、使用Statement执行SQL语句
(7)、查询操作:返回结果集ResultSet,更新操作:返回更新的数量
(8)、处理结果集
(9)、释放资源

JDBC代码例子的链接

二、使用Mybatis

在这里插入图片描述

学会使用Mybatis需要掌握两个步骤:

2.1、配置MyBatis开发环境

在项目中添加MyBatis:
在这里插入图片描述
注意:框架 framework 和 框架 Driver 必须成对出现。
在这里插入图片描述
当项目中添加了数据库框架后,启动项目是失败的也不要慌张,这是正常现象。

因为项目中添加了数据库框架之后,却没有配置数据库的路径,所以项目启动报错。(一台机器上可以安装很多个数据库,想要连接哪个数据库就需要指定那个数据库的路径,才能够连接成功。)

2.1.1、配置连接字符串

那怎么指定呢??此时就需要配置连接字符串和MyBatis。需要进行两项设置,数据库连接字符串设置和MyBatis的XML文件配置。
(1)、配置连接字符串(4项)
如果是application.yml配置文件,则添加如下内容(系统配置项):(给的是模板,具体内容以自己的数据库为准)
#数据库连接配置

spring:
	datasource:
		url: jdbc :mysql://localhost:3306/mycnblogcharacterEncoding=utf8&useSSL=false
		username: root
		password: root
		driver-class-name: com.mysql.cj.jdbc.Driver

在这里插入图片描述

2.1.2、配置MyBatis中的XML路径

MyBatis中有两种实现数据库增删改查的方式,分别是:1、使用 XML 的范式。2、一种是使用注解的方式。

虽然使用注解的方式来写sql语句去实现数据库的增删改查功能一开始会比较容易,但是这是假象,只适合简单的sql语句以及简单的功能,但是当业务复杂起来的时候,使用注解的方式就十分不方便,同时使用注解的方式还容易将代码与sql语句混杂在一起,不容易实现代码的复用性、简洁性。因此我们通常会使用XML文件来实现数据库的增删改查。

只放个注解的例子图,不推荐使用这种方式,现在很少有人用了。
在这里插入图片描述
这是使用XML的方式:

因为Mybatis由2部分组成:
1、接口 ( interface ) :接口里会声明所有操作方法。这些方法是给程序里的其他类来调用。
2、使用 XML 实现接口。即XML里需要写具体的SQL语句。

想要使用 XML 的方式实现数据库的增删改查,还需要在配置文件中配置如下内容:(这些配置信息是告诉Mybatis要使用哪些文件)
在这里插入图片描述

#设置mybatis的xml保存路径
mybatis:
	mapper-locations: classpath:mapper/*Mapper.xml

2.2、使用MyBatis模式和语法操作数据库

这一步就是遵循MyBatis的写法在项目中构建相应的业务实现即可。

项目的业务交互图:
在这里插入图片描述

此处是一个项目例子来使用MyBatis模式和语法操作数据库:

一、基础准备
(1)、首先需要创建一个ssm的项目,项目需要准备好Mybatis Framework以及 MySQL Driver ,创建好后将配置文件中的配置信息先配置好:
在这里插入图片描述

(2)、然后在项目中依次创建好 controller层(控制器层)、service层(服务层)、mapper层(数据库持久层)、entity层(实体类)。

(3)、然后需要准备一个数据库,数据库中含有一张表,将表与程序中的类映射起来。

在这里插入图片描述
在这里插入图片描述
二、构建 Mapper 层的代码实现

(1)、在mapper层定义一个接口:
接口中可以含有多个方法,这些方法就对应你项目的增删改查或者其他的功能模块。

在这里插入图片描述
(2)、创建 XML 实现
在这里插入图片描述
在mapper包下创建一个 xml 文件:
在这里插入图片描述
在这里插入图片描述
三、实现服务层代码
在这里插入图片描述
四、实现控制器层代码
在这里插入图片描述
写完代码后,启动项目,在浏览器上输入URL,获取数据库中的数据:
在这里插入图片描述

三、使用 Mybatis 进行增删改查操作的要点

(1)、使用Mybatis进行查询操作
在这里插入图片描述
查询操作的两个必备属性中,第一个属性是id;第二个属性写法可以是 ResultType,也可以是 ResultMap。

使用ResultType,是因为程序中的实体类里的属性名称都和数据库中表的字段名称一致,所以可以使用ResultType。

使用ResultMap,是因为一般在公司,数据库是专门由DB负责的,而程序代码的书写由程序员负责,一般开始项目大家都是同时开工,程序员不知道DB设计出的数据库里面会用什么表名、字段名,因此此时想要让程序与表映射,需要用到ResultMap。(即ResultMap 用在当程序中的属性名与数据库表中的字段名不一致时)。

举个例子:
在这里插入图片描述
这是因为在查询的过程中,如果数据库表的字段名能够与程序中的属性名对应上,那就将数据库中的数据赋值给程序中的属性,如果数据库表中的字段名和程序中的属性名对应不上,那程序中的属性值就是null。

插入、删除、修改操作时也有这样的情况,但是和查询时相反的。若程序中的属性名与数据库表中的字段名匹配,可以赋值,操作成功,否则反之。

ResultMap(返回字典映射) 应用场景
(1)、字段名称和程序中的属性名不同的情况,可使用resultMap配置映射;
(2)、一对一和一对多关系可以使用resultMap映射并查询数据。

3.1、ResultMap的用法

(1)、先声明
在这里插入图片描述
(2)、再使用
在这里插入图片描述
除了使用 resultMap 的方法,还有另一种更加简单的方法:
使用数据库别名 as 重命名。
在这里插入图片描述

(2)、使用Mybatis进行添加操作
在这里插入图片描述

因为我们的IDEA是默认隐藏Mybatis生成sql的执行细节,因此如果想要让控制台打印我们所执行的sql语句,可以在配置文件中进行配置。配置后,可利用sql语句排查问题。
在这里插入图片描述
配置文件:
在这里插入图片描述
在这里插入图片描述

(3)、使用Mybatis进行删除操作
在这里插入图片描述

(4)、使用Mybatis进行修改操作
在这里插入图片描述

Mybatis项目例子,这个链接是上面所写的项目例子与数据库所进行的增删改查的操作的具体代码,大家可以跟着动手写一写,熟能生巧。

四、Mybatis操作难点

前面在项目例子中演示的增删改查操作,是最基本最简单的操作,但其实在实际项目中,远比这些难得多,不仅仅涉及到对一个表的增删改查,还会涉及到多表查询操作、联合查询、条件查询…这个时候的sql语句就会比较难了。

4.1、#{ } 和 ${ } 的区别

在.xml文件里书写sql语句时,其实我们一般见到的都是 #{ } 类型的:
在这里插入图片描述

但是其实 ${ } 也可以实现和 #{ } 一样的功能,但是为什么现在常见的都是使用#{ },而 ${ }却很少见呢?他们有什么区别?

#{ } 的sql语句时使用的是预编译处理,即sql语句中先使用占位符?。这样的好处就是先占了才赋值,可以适配多种情况,不管是整型还是字符串…
在这里插入图片描述
在这里插入图片描述
而 ${ } 的sql语句是直接赋值,直接赋值的话整型的情况下没有问题,但是字符串的情况下就会有问题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
但是,${ } 有一个 #{ }不具备的重要功能:能够传递一些关键字。(但是在使用 ${ } 传递关键字时,我们还必须确定这个传递的值能够穷举:就是需要先在 controller 层对这个值进行参数校验,比如传的是一个order值,这个order变量它的取值是否是desc或者asc,如果都不是,不给传值,避免 ${ } 的sql注入问题)
在这里插入图片描述
代码实现:
在这里插入图片描述
在这里插入图片描述
单元测试:
在这里插入图片描述
在这里插入图片描述

4.1.1、SQL注入问题

我们上面说了,传关键字是 ${ } 的唯一应用场景(是因为 ${ } 不安全,会产生SQL注入的问题)。但是我们必须保证传的这个参数是可预期的,如果传的是一个不可预期的参数,有可能会产生SQL注入的问题:因为 ${ } 是直接赋值,因此一些有心人会抓住这个漏洞做一些非法的事情。

譬如:当我们进行登陆操作时,当使用 ${ } 进行登陆操作的sql语句书写时(要想测试sql注入现象成功,需要保证数据库里只有一行记录的情况下才可以):
在这里插入图片描述
单元测试1:
在这里插入图片描述
单元测试2(sql注入问题):
在这里插入图片描述

但是使用 #{ } 就没有sql注入这样的问题:
在这里插入图片描述
在这里插入图片描述
那么为什么这样一串字符串:’ or 1='1 就会引起sql注入问题?
在这里插入图片描述

总结:#{ } 和 ${ } 的区别:
(1)、 ${ } 存在 sql注入问题,而 #{ } 不存在。
(2)、 ${ } 是直接赋值,而#{ } 是采用预编译的。

使用 ${ } 的注意事项:
(1)、确保传入的值是可穷举,可预期的。
(2)、需要先在 controller 层进行参数校验。

4.2、like 模糊查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

此时可以采用 mysql 的内置函数 concat() 进行拼接:
在这里插入图片描述
在这里插入图片描述

4.3、多表查询、联合查询

多表查询是非常容易遇到的操作,并且多表查询比单表查询要难。当我们需要进行多表查询,但是实体类却只包含单表查询的实体类,该怎么办??
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

针对上面的问题,有两个解决方法:
(1)、不再继承基础类,直接写全所有属性:
在这里插入图片描述
在这里插入图片描述
(2)、仍旧是继承自基础类,但是需要将lombok生成的toString()覆盖
在这里插入图片描述
因此我们可以在扩展类中自己写一个 toString() 方法,将lombok自动生成的toString() 方法覆盖掉:
在这里插入图片描述
注意:一般我们在写实体类的时候,习惯将类都实现 Serializable 接口并新增一个版本字段。因为我们写的实体类,不可避免后面都会有可能进行序列化/反序列化。

当我们遇到多表联查,直接采用这个解决方案即可:
联表查询语句(left jion / inner join)+XXXVO 解决。

4.3、动态 sql 的使用

动态 sql 是 Mybatis 强大特性之一,能够实现复杂条件下不同的 sql 拼接。
动态sql的应用场景一般在当前界面既含有必填项又含有非必填项,如下图此类:
在这里插入图片描述

4.3.1、if 标签

if标签是一个条件判断,如果if标签里的属性test是true,就执行if标签里的内容,如果属性test是false,就不执行if标签里的内容。if标签一般用于含有较少非必填项的场景。

if标签语法:

<if test = "参数名 != null  and 参数名 != ''">
	...
</if>

例子:
在这里插入图片描述
使用动态sql时:
在这里插入图片描述
在这里插入图片描述

4.3.2、trim 标签

trim标签一般用于含有多个非必填项的场景。trim要求里边必须至少包含一个if标签去配合使用!
trim标签的语法:
在这里插入图片描述
这两标签一般用于插入操作。

4.3.3、where 标签

where 标签的语法:
在这里插入图片描述
在这里插入图片描述

4.3.4、set 标签

set 标签语法:
在这里插入图片描述
以上标签也可以使用 < trim prefix= “set” suffixoverrides=“,”> < /trim>替换。
单元测试成功:
在这里插入图片描述

4.3.5、foreach 标签

foreach标签的应用场景一般是在批量操作上。例如批量删除批量修改批量添加…当系统进行批量操作时,前端传的是一个集合,后端需要对集合进行遍历时就可以使用该标签。

< foreach> 标签有如下属性:
(1)、collection: 绑定方法参数中的集合,如List, Set, Map或数组对象
(2)、item: 遍历时的每一 个对象
(3)、open:语句块开头的字符串
(4)、close: 语句块结束的字符串
(5)、separator:每次遍历之间间隔的字符串

foreach标签语法:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Modbus-TCP详解

目录 Modbus-TCP Modbus TCP协议的帧结构如下&#xff1a; 实现Modbus-Tcp 使用EasyModbusTCP第三方实现Modbus-Tcp EasyModbusTCP的使用 设置IP 设置端口 设置设备地址 开启通讯 读取寄存器 写入寄存器 实例 Modbus-TCP Modbus TCP是Modbus协议的一种变体&#xff0c;它使用T…

Java多线程的单例设计模式 多种实现方法

目录 前言 饿汉式 懒汉式 Double_check volatile double_check Holder方式 枚举 前言 单例设计模式GOF23中设计模式中最常用的设计模式之一, 单例设计模式提供了多线程环境下的保证唯一实例性的解决方案, 虽然简单, 但是实现单例模式的方式多种多样, 因此需要从多个维度去…

【云原生】恰当运用kubernetes中三种探针,确保应用程序在Kubernetes集群中保持健康、可用和可靠

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Unity热更——ILRuntime安装接入

一、ILRuntime相关地址 1、官网文档地址 2、GitHub上开源的ILRuntime项目工程 3、GitHub上的官方ILRuntime-Unity实例工程 4、官方视频教程-Unity中文课堂&#xff08;需付费&#xff09; 5、ILRuntime入门笔记-赵青青-博客园 6、ILRuntime 的学习-简书 二、ILRuntime…

Python | Leetcode Python题解之第324题摆动排序II

题目&#xff1a; 题解&#xff1a; def quickSelect(a: List[int], k: int) -> int:seed(datetime.datetime.now())shuffle(a)l, r 0, len(a) - 1while l < r:pivot a[l]i, j l, r 1while True:i 1while i < r and a[i] < pivot:i 1j - 1while j > l an…

自动生成数据:Navicat 16 让数据测试更高效

文章目录 前言一、Navicat是什么&#xff1f;二、Navicat 16 新功能1. 自动生成数据2. 改进的用户界面3. 云同步 三、 安装指南Windows 版安装macOS 版安装Linux 版安装 四、使用示例&#xff1a;自动生成数据1. 创建连接2. 选择表3. 打开数据生成器4. 设置数据规则5. 生成数据…

top命令实时监测Linux进程

top命令可以动态实时显示Linux进程信息&#xff0c;方便观察频繁换进换出的内存的进程变化。 top命令执行示例如下&#xff1a; 其中&#xff0c;第一行表示系统当前时间、系统的运行时间、登录的用户数目、系统的平均负载&#xff08;最近1分钟&#xff0c;最近5分钟&#xff…

springboot艺体培训机构业务管理系统--论文源码调试讲解

第2章 开发环境与技术 开发艺体培训机构业务管理系统需要搭建编程的环境&#xff0c;也需要通过调查&#xff0c;对各个相关技术进行分析&#xff0c;选取适合本系统开发的技术与工具。 2.1 MySQL数据库 MySQL是一种具有安全系数、安全系数、混合开发性、高效化等特征的轻量…

基于Raft算法的分布式KV数据库:五、剩余部分

github地址&#xff1a;https://github.com/1412771048/Raft CPPRaft系列-剩余部分 首先我们看下第五章的架构图&#xff0c;图中的主要部分我们在前几张讲解完毕了&#xff0c;目前还剩下clerk和k-v数据库&#xff0c;而本篇的重点在于补全版图&#xff0c;完成&#xff1a;…

SQL注入sqli-labs-master关卡一

本文环境搭建使用的是小皮&#xff0c;靶机压缩包&#xff1a;通过百度网盘分享的文件&#xff1a;sqli-labs-php7-master.zip 链接&#xff1a;https://pan.baidu.com/s/1xBfsi2lyrA1QgUWycRsHeQ?pwdqwer 提取码&#xff1a;qwer 下载解压至phpstudy的WWW目录下即可。 第一…

关于Redis的面试题

一、为什么要使用Redis 内存数据库,速度很快工作单线程worker,串行化,原子操作,IO线程是多线程的。避免上下文切换使用 IO模型,天生支撑高并发kv模型,v具有类型结构具有本地方法,计算数据移动二进制安全,value值最大为512MB二、Redis是多线程还是单线程 Redis在6.0版本…

(免费领源码)java#SSM#MYSQL私家车位共享APP 51842-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1 课题的研究背景 1.2研究内容与研究目标 1.3ssm框架 1.4论文结构与章节安排 2 2 私家车位共享APP系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1功能性分析 2…

计算机网络(TCP报文段首部格式中序号和确认号)

TCP首部格式中的序号和确认号并不总是同时出现。 TCP首部的序号和确认号是根据TCP通信的不同阶段和目的来决定的。在建立连接的过程中&#xff0c;序号用于标识发送数据的起始位置&#xff0c;而确认号用于表示接收方期望接收的下一个数据的起始位置。这两个字段在TCP通信的不同…

【vulhub靶场之rsync关】

一、使用nmap模块查看该ip地址有没有Rsync未授权访问漏洞 nmap -p 873 --script rsync-list-modules 加IP地址 查看到是有漏洞的模块的 二、使用rsync命令连接并读取文件 查看src目录里面的信息。 三、对系统中的敏感文件进行下载——/etc/passwd 执行命令&#xff1a; rsy…

【Python】Python中的循环语句

循环语句 导读一、基本概念1.1 循环语句的执行流程1.2 循环语句的分类 二、while语句三、for语句四、break与continue五、死循环六、循环中的else语句七、range()函数结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;&#xff01; 在上一篇内容中我…

《Advanced RAG》-04-深度研究RAG技术Re-ranking

摘要 文章首先介绍了重新排序在RAG中的重要性&#xff0c;它允许对检索到的文档进行重新排序和过滤&#xff0c;以确保最相关的文档能够被优先考虑&#xff0c;从而提高RAG的效率和准确性。 接着&#xff0c;文章详细描述了两种主流的重新排序方法&#xff1a; 一种是使用重新排…

使用Jetbrains.Rider反编译Unity的DLL文件看源码

直接将dll文件的打开方式用Rider打开即可&#xff0c;打开BattleSeqGenertor.dll文件的效果如下&#xff1a;

Redis 的6种回收策略(淘汰策略)详解

Redis 的6种回收策略&#xff08;淘汰策略&#xff09;详解 1、Redis的六种淘汰策略1. volatile-lru2. volatile-ttl3. volatile-random4. allkeys-lru5. allkeys-random6. no-eviction 2、使用策略规则 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&am…

MyIP:强大且简单好用!

在这个数字化的时代&#xff0c;IP地址就像是我们的网络身份证。各位在日常的工作中&#xff0c;肯定会会遇到需要和 IP 地址相关的需求。 今天和大家聊一聊一个非常好用的开源 IP 工具项目 - MyIP。 简介 MyIP一个开源IP工具箱&#xff0c;提供了一系列的网络检测工具&…

适合双11入手的蓝牙耳机推荐?4款开放式耳机测评

2024年也确实快到大家购物疯狂买买买的双11日子了&#xff0c;我相信肯定也有人在购物车攒了一大堆商品就等着双11清空了。那肯定现在还有人在为双11的购物车放什么东西发愁吧&#xff0c;那对于我来说&#xff0c;双11的购物车应该也是要有蓝牙耳机的一席之地的。 因为毕竟在…