浅谈 Mybatis 框架

文章目录

  • 一、什么是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=falseusername: rootpassword: rootdriver-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.rhkb.cn/news/392681.html

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

相关文章

JavaWeb基础1:HTML/CSS/JS/HTTP

JavaWeb基础1&#xff1a;HTML/CSS/JS/HTTP (qq.com)

FPGA知识基础之--clocking wizard ip核的使用以及modelsim与vivado联合仿真

目录 前言一、ip核是什么&#xff1f;1.1 定义1.2 分类 二、为什么使用ip核2.1 ip核的优点2.2 ip核的缺点 三、如何使用ip核&#xff08;vivado&#xff09;四、举例&#xff08;clocking wizard ip核&#xff09;4.1 简介4.2 实验任务4.3 程序设计4.3.1 系统模块4.3.2 波形绘制…

连接数据库报错bad handshake

堡垒机账号没有授权访问权限

2024最新最全面的Selenium 3.0 + Python自动化测试框架

文档说明 Selenium是一个用于Web应用程序自动化测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 Selenium测试的主要功能包括&#xff1a; 测试与浏览器的兼容性&#xff1a;测试应用程序是否能很好的工作在不同的浏览器和操作系统之上。…

云计算学习——5G网络技术

系列文章目录 提示&#xff1a;仅用于个人学习&#xff0c;进行查漏补缺使用。 Day1 网络参考模型 Day2 网络综合布线与应用 Day3 IP地址 Day4 华为eNSP网络设备模拟器的基础安装及简单使用 Day5 交换机的基本原理与配置 Day6 路由器的原理与配置 Day7 网络层协议介绍一 Day8 …

Jpa-多表关联-OneToOne

Jpa-多表关联-OneToOne 准备JoinColumnOneToOne属性targetEntitycascade*PERSISTMERGEREMOVEREFRESH orphanRemovalfetchoptionalMappedBy* OneToOne在 hibernate中用于对表与表之间进行维护关联 准备 import com.alibaba.fastjson.JSON; import jakarta.persistence.*; impor…

AI8-文本检测

文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务,目标检测不仅要解决定位问题,还要 解决目标分类问题。 文本在图像中的表现形式可以视为一种‘目标‘,通用的目标检测的方法也适用于文本检测,从任务本身上来 看: • 目标检测:给定图像或者视频,找出目…

本地部署 faster-whisper

本地部署 faster-whisper 1. 创建虚拟环境2. 安装依赖模块3. 创建 Web UI4. 启动 Web UI5. 访问 Web UI 1. 创建虚拟环境 conda create -n faster-whisper python3.11 -y conda activate faster-whisper2. 安装依赖模块 pip install torch2.2.2 torchvision0.17.2 torchaudio…

bilibili实习生一面0625

OSI七层模型 物理层&#xff1a;将帧中的比特传送到下一个节点&#xff08;比特&#xff09; 数据链路层&#xff1a;将数据包装成帧并传送到路径上下一个节点&#xff0c;将相邻节点间不可靠的物理链路变成可靠的逻辑链路&#xff08;帧&#xff09; 网络层&#xff1a;路由寻…

Qt 5.14安装(配置MSVC 2017)

Qt 5.14安装&#xff08;配置MSVC 2017&#xff09; 记录一下自己安装配置Qt的步骤。 我需要安装Qt&#xff0c;并使用MSVC编译&#xff0c;所以才写了这篇文章。 一、环境 操作系统&#xff1a;windows 11 &#xff08;64位&#xff09; Qt&#xff1a;Qt 5.14.2 vs&…

怎么读取FRM、MYD、MYI数据文件

一、介绍frm、MYD、MYI文件 在MySQL中&#xff0c;使用MyISAM存储引擎时&#xff0c;数据库表会被分割成几个不同的文件文件描述功能扩展名FRM 文件表结构定义文件存储表的结构信息&#xff0c;字段、索引等.FRMMYD 文件数据文件包含表的实际数据.MYD&#xff08;MYData&#x…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-04 IP层程序设计

软件版本&#xff1a;Anlogic -TD5.9.1-DR1_ES1.1 操作系统&#xff1a;WIN10 64bit 硬件平台&#xff1a;适用安路(Anlogic)FPGA 实验平台&#xff1a;米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台&#xff1a;https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

学习笔记-MYSQL 事务

目录 一、什么是事务&#xff1f; 二、事务的四个特征&#xff08;ACID&#xff09;【面试常考项】 原子性&#xff08;Atomicity&#xff09; 一致性&#xff08;Consistency&#xff09; 隔离性&#xff08;Isolation&#xff09; 持久性&#xff08;Durability&#x…

Linux-理解shell

文章目录 5. 理解shell5.1 shell的类型5.2 交互shell和系统默认shell5.3 安装zsh shell程序5.4 shell的父子关系5.5 命令列表5.6 命令分组5.7 使用命令分组创建子shell5.8 子shell用法5.9 shell的非内建命令和内建命令5.9.1 非内建命令5.9.2 内建命令5.9.3 history和alias命令介…

AI9-文本识别

本章主要介绍文本识别算法的理论知识,包括背景介绍、算法分类和部分经典论文思路。 通过本章的学习,你可以掌握: 1. 文本识别的目标 2. 文本识别算法的分类 3. 各类算法的典型思想 1 背景介绍 文本识别是OCR(Optical Character Recognition)的一个子任务,其任务为识别一个…

基于 Redis 的分布式信号量 Spring Boot 集成 Redisson 使用 Semaphore 控制并发访问数量

目录 前言 pom yml Controller 演示 注意 前言 工作中开发过一个服务&#xff0c;这里记作A服务&#xff0c;主要功能是配置&#xff0c;部署以及调用云函数。其中配置云函数的功能里&#xff0c;有一个配置项是并发数&#xff0c;意思是同一时间最多能有多少个请求调用…

【MATLAB源码】数学建模基础教程(2)--层次分析法(评价类算法)

系列文章目录在最后面&#xff0c;各位同仁感兴趣可以看看&#xff01; 层次分析法 引言一、层次分析法的特点二、模型的建立求解过程 (1)问题的提出&#xff1a;实际问题的转化(2)建立层次结构模型(3)构造判断(成对比较)矩阵(4)一致性检验&#xff1a;三、层次分析法的优点与…

Codeforces Round 871 (Div. 4)(A~H)

比赛链接 Dashboard - Codeforces Round 871 (Div. 4) - Codeforces A. Love Story 找到与codeforces 有多少个不同的字符。 #include<bits/stdc.h> #define int long long #define TEST int T; cin >> T; while (T--) #define ios ios::sync_with_stdio(fals…

前端常用的性能优化方案

目录 性能分析工具lighthouseWebpack Bundle分析 开发阶段按需引入路由懒加载 打包阶段打包配置减少包体积配置压缩分包 资源预加载/预请求 部署阶段开启http2静态资源缓存gzip压缩 性能优化主要在三个阶段进行&#xff1a;开发阶段、开发结束后的打包阶段、项目部署上线阶段 首…

提升生产效率:APS高级计划排程系统在车间工序级排程的革命性应用

在制造业的数字化转型浪潮中&#xff0c;APS高级计划排程系统以凭借自身卓越的排程运算能力和应用灵活性&#xff0c;已经成为中大型制造业提升生产效率的关键工具。APS系统的介入&#xff0c;打通了传统ERP和MES等各类业务系统运营平台&#xff0c;并且通过产能均衡规划&#…