MyBatis 系列2 -- 增加、删除、修改操作

news2024/11/26 16:30:07

1. 前言

        上一系列介绍了MyBatis的背景,以及为什么我们使用MyBatis进行操作数据库,还实现了使用MyBatis进行查询数据库的,接下来我们继续将使用MyBatis操作数据库的其他三种基本操作进行总结.

目录

1. 前言

2. 增加用户操作

3. 修改用户操作

4. 删除用户操作

5. 多表查询操作(重点)

5.1 占位符(${} VS #{})

5.2 select标签返回值类型 resultType VS resultMap

5.2.1 resultType

5.2.2 resultMap 

5.2.3 使用别名处理不一致问题

5.3 多表查询

6. 复杂情况:动态SQL使用

6.1 if 标签

6.2 trim标签

6.3 where 标签

6.4 set标签

6.5 foreach标签

总结


2. 增加用户操作

 在UserMapper中实现接口方法add,传入的参数为用户对象,代码如下:

在XML文件中进行构造sql语句,插入操作使用insert标签

不为空的字段必须传值.

这里面进行替换参数的时候我们一般使用#{},有的时候也需要使用${}进行替换.具体后面会详细讲解.

我们接下来为了验证的方便,不在一一写Service层以及Controller层了,我们使用单元测试进行测试我们的代码.

1. 什么是单元测试呢?

 

        单元测试是后端程序人员测试自己小部分代码正确性写的测试代码,当我们最后对称程序进行打包的时候,我们写的单元测试必须全部通过才能打包成功.而且我们的单元测试使用起来很方便,并且不会污染数据库中的数据.

 

SpringBoot项目创建的时候默认会使用单元测试框架spring-boot-test,而这个单元测试框架式依靠另一个注明的测试框架JUnit进行实现的.在pom.xml中就可以看见相关的依赖.

2. 那么如何使用单元测试呢?

2.1 首先我们得生成单元测试的类,在我们要进行测试的类点击generate

 

 

 最终生成的代码

 2.2 给测试类添加注解,表明这个类是用在什么环境下,我们此项目是在SpringBoot项目下,就添加注解SpringBootTest注解

 2.3 在测试方法中进行构造自己的测试代码

2.4 点击运行按钮进行测试 

我们对以上添加操作进行测试,结果如下: 

如果我相反插入用户信息的自增ID,我们需要再xml文件构造sql语句的时候,对id,进行设置.

3.  修改用户操作

还是要按照上述的操作进行,先在UserMapper接口中实现相应的方法,然后在xml文件中使用户Update tablename set where 进行构造sql语句,最后在单元测试中进行测试.

 单元测试结果:

4. 删除用户操作

继续使用上述操作流程,在xml文件中使用delete标签进行构造sql语句.

 单元测试结果:

5. 多表查询操作(重点)

我们之前讲解过了,使用单表查询的操作.但是在实际的工作中并不是操作一张表这么简单的,我们设计到的一定是多表查询.

在总结多表查询之前我们,先把之前残留的一个问题先解决一下.就是占位符问题.

5.1 占位符(${} VS #{})

什么叫预处理编译呢: MyBatis 在处理#{}时,会将 SQL 中的 #{} 替换为?号,使用 PreparedStatement的 set 方法来赋值。

什么叫字符直接替换呢:MyBatis 在处理 ${} 时,就是把 ${} 替换成变量的值。

那么问题来了,这两种占位符我们应该怎么使用呢?

 

1. 当我们传入的是一个sql的关键字的时候,考虑使用${};

 

举例: 我们在淘宝中购买商品的时候,可以选择按照类型,价格等进行升序或者降序,那么前端传递给后端的英爱是一个desc或者asc的指令,我们拿到这个指令去进行构造sql语句.这是时候我们必须将该关键字进行替换,才能构造出正确的sql语句,如果使用#{},那么最后select * from userinfo group by id "desc";这样就是一个错误的sql语句了.还有一个关键的思想,我们在使用${}占位符的时候,传入的变量一定得是可预测的,或者说是可以竟枚举的,不然就会引起sql注入的问题.比如我们使用占位符在拼接"select * userinfo where usename =  '${username}' and 'password=${password}'"的时候传入:password的值为' or 1='1,那么最后拼接成的就是:select * userinfo where usename ='张三' and password='' or 1='1'; 那么这个语句就可以获取用户表的所有信息数据,这就及其不安全,所以使用${}一定要考虑sql注入的问题. 

 

2. 在使用like 的时候使用 #{} 报错.

上述进行构造之后: select * from userinfo where username like '%'username'%';

我们此时也不要使用${},我们可以使用MySQL自带的连接函数进行构造:

我们建议还是使用 #{} , 在真正不能使用 #{} 的时候再考虑使用 ${} .

5.2 select标签返回值类型 resultType VS resultMap

在使用select标签的时候,我们必须设置两个参数,id='对应接口方法的名称'  +  返回值类型  

5.2.1 resultType

我们之前设置的返回值类型是resultType,这中方式在绝大数场景下都可以使用到,使用起来很简洁,直接定义到某个实体类.但是当我们的数据库字段名称和程序中字段名称不相同时就访问不到了.

数据库表结构如下:

程序对应如下: 

 

 我们可以很清晰的看出两个密码的字段是不匹配的,当我们还是按照之前的方法进行构造sql 的时候就不可以了

 postman构造请求进行访问:

 此时我们就需要进行使用resultMap了

5.2.2 resultMap 

 

 在xml文件的首部添加

 再进行设置sql语句

 查询结果

5.2.3 使用别名处理不一致问题

字段和属性不一致的简单方案:

书写sql的时候,给不一致的字段使用别名

select id,username as name,password,photo,createtime,updatatime from userinfo

5.3 多表查询

        这一块只使用resultType是不可能将另外一个表的属性进行显示出来的.我们可以使用resultMap将关系进行一一映射,但是使用起来特别麻烦,我们未来的表字段有可能太多,所以不建议使用.

我们使用继承的方式进行实现

1. 我们在model文件夹下创建一个vo目录,用来存放给前端进行展示的类.

2.  实现一个类,继承文章表,并将文章表中没有的作者名字字段添加到新的展示类,并且实现序列化接口Serializable接口.

 我们将返回值类型修改成我们自己的展示类类型

 我们可以看出, 虽然我们继承了父类文章表,但是文章表的属性我们还是没有获取到,这是时候我们就要考虑我们使用的注解了,我们使用了@Data注解,他帮我们重写了tostring方法,我们要看一看这个ToString方法具体是怎么重写的,我们只需要去找到target文件下的Class目录.

我们看看字节码文件是怎么样实现的.

我们看到@Data注解生成的toString方法和我们预期的ToString方法不太一致,它只包含了两个属性,所以我们要自己进行重写toString方法.使其包含父类的属性. 

 最后ToString方法如下:

再进行运行测试代码,就可以得到我们想要的:

6. 复杂情况:动态SQL使用

6.1 if 标签

在注册用户的时候,可能会有这样⼀个问题,如下图所示: 

这个时候就需要使用户动态标签 <if> 来判断了,比如筛选的时候name 和 password为非必填字段,具体实现如下:

 注意test 中的username 和 password 属性,是传入对象的属性名,而不是字段名.

那如果我们进行添加操作呢?

上述进行构造的sql能正常运行,但是如果非必填选项在最后呢?

有可能构造的sql语句为:insert intousername(username,photo,) values("haha","img.png",);这就不行了,是不合法的.所以就有了trim标签.

6.2 trim标签

 改造之后就是:

6.3 where 标签

 直接省略了where关键字,可以将语句中前面的and进行去除

以上<where>标签也可以使用<trim prefix="where" prefixOverrides="and"> 替换 

6.4 set标签

根据多个参数进行更新数据,可以去除最后面的逗号.

 <set>标签也可以使用<trim prefix="set" suffixOverrides=","> 替换。

6.5 foreach标签

 传入一个集合列表 

 具体的参数对应如下:

总结

        MyBatis的系列到此就结束了,基础的增删改查数据库就是这些内容,后续会根据项目实际使用MyBatis.

希望多多关注,谢谢❤️❤️❤️❤️ 

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

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

相关文章

unity背景缓动动效

这算是一个很常见的小功能&#xff0c;比如我们在玩横版游戏的时候&#xff0c;背景动画会以一定的频率运动&#xff0c;其实现方式也有很多种。 比如&#xff0c;使用UGUI的imageanimtion动画的方式&#xff0c;自己k桢实现。 还可以使用材质球本身的功能来实现&#xff0c;关…

datatables.editor 2.2 for PHP/JS/NodeJS Crack

使用数据表编辑器在几分钟内创建自定义、完全可编辑的表 编辑器添加了三种编辑模式&#xff0c;以适应任何类型的应用程序 新增功能 编辑 删除 搜索&#xff1a; 名字位置办公室开始日期工资名字位置办公室开始日期工资佐藤爱里会计东京2008-11-28$162&#xff0c;700安吉莉卡拉…

linux服务器中安装java JDK1.8版本

我们远程连接自己的linux服务器 然后 我们先执行 sudo yum update更新一下软件包 然后 有个需要选择的地方 按y 然后 我们可以直接用 yum 来安装Java 1.8版本 执行 sudo yum install java-1.8.0-openjdk然后 问你是否选择按 y即可 搞完之后 我们检查一下 输入 java -vers…

Elasticsearch:什么是矢量搜索以及它如何改进搜索结果

释放矢量搜索的力量&#xff1a;提高搜索结果效率 想象一下这样一个世界&#xff1a;搜索引擎不仅能理解你输入的单词&#xff0c;还能理解它们背后的上下文和含义。 这就是矢量搜索发挥作用的地方&#xff0c;它彻底改变了我们查找信息的方式并改善了用户的搜索体验。 在本文…

Erdas专题图制作

1.导入需要做图的数据 2.在新建一个地图view 3.绘制图框 出现以下对话框&#xff0c;在已打开的Viewer中图象上任意位置点一下 框选需要绘制的区域 框选完成后&#xff0c;回到窗口&#xff0c;再次确定输出地图所包含的实际区域&#xff0c;点击ok即可完成框选 得到如下图像框…

【Python】数据可视化利器PyCharts在测试工作中的应用

点击跳转原文&#xff1a;【Python】数据可视化利器PyCharts在测试工作中的应用 实际应用&#xff1a;常态化性能压测数据统计 import random from pyecharts.charts import Line, Bar, Grid, Pie, Page from pyecharts import options as opts # 查询过去 8 次数据 time_rang…

序列模型学习

1、序列模型的应用场景&#xff08;RNN&#xff09; &#xff08;1&#xff09;、在进行语音识别时&#xff0c;给定了一个输入音频片段 &#x1d465;&#xff0c;并要求输出对应的文字记录 &#x1d466;。这个 例子里输入和输出数据都是序列模型&#xff0c;因为 &#x1…

动态规划——买卖股票的最佳时机含手续费

题目链接 leetcode在线oj题——买卖股票的最佳时机含手续费 题目描述 给定一个整数数组 prices&#xff0c;其中 prices[i]表示第 i 天的股票价格 &#xff1b;整数 fee 代表了交易股票的手续费用。 你可以无限次地完成交易&#xff0c;但是你每笔交易都需要付手续费。如果…

美的代工厂雪祺电气过会:拟募资6亿元,产能利用率下滑仍要扩产

撰稿|行星 来源|贝多财经 近日&#xff0c;深圳证券交易所主板披露的信息显示&#xff0c;合肥雪祺电气股份有限公司&#xff08;以下简称“雪祺电气”&#xff09;获得上市委会议通过。据贝多财经了解&#xff0c;雪祺电气的上市申请材料于2023年2月28日获得受理。 天眼查信…

Ceph 块存储系统 RBD 接口

-创建 Ceph 块存储系统 RBD 接口- 1、创建一个名为 rbd-demo 的专门用于 RBD 的存储池 ceph osd pool create rbd-demo 64 642、将存储池转换为 RBD 模式 ceph osd pool application enable rbd-demo rbd3、初始化存储池 rbd pool init -p rbd-demo # -p 等同于 --pool4、…

前端多行文本省略号

.title {height: 4rem;line-height: 2rem;// 多行文本省略号overflow: hidden;font-size: 1.4rem;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2;}

Rancher 系列文章-Rancher 升级

概述 之前在 天翼云上用 4 台机器安装了一个 1 master&#xff08;及 etcd) 3 node 的 K3S 集群&#xff0c;并在其上使用 Helm 安装了 Rancher 2.6.3 版本。 前几天发现 Rancher 官方推荐的最新版为&#xff1a;v2.6.4 所以决定先后对 Rancher 和 K3S 集群进行升级。 根据…

迁移到强化学习的 6 个理由

胡巴雷拉 从 https://en.wikipedia.org/wiki/Reinforcement_learning 一、说明 强化学习&#xff08;RL&#xff09;是机器学习的一个领域&#xff0c;涉及智能体应该如何在环境中采取行动&#xff0c;以最大化累积奖励的概念。强化学习是三种基本的机器学习范式之一&#xff…

RHCSA/RHCE考试模拟环境搭建

RHCSA/RHCE考试模拟环境搭建 1. 使用VMware workstation部署2. 使用U盘通过物理服务器部署1. 使用VMware workstation部署 RHCSA环境内存至少16G,RHCE环境内存至少12G,处理器配置8核   网络适配器选择NAT方式   取消显示器的“加速3D图形”:   另外添加一块硬…

Time Series Classification

时间序列分类 我第一次遇到时间序列分类的概念时&#xff0c;我最初的想法是&#xff1a;我们如何对时间序列进行分类&#xff1f;时间序列分类的数据是什么样子的&#xff1f; 可以想象&#xff0c;时间序列分类数据不同于常规分类问题&#xff0c;因为属性具有有序的序列。…

【业务功能篇47】 idea自动生成代码插件EasyCode

业务越来越多需求的情况下&#xff0c;对应的表也是逐渐增多&#xff0c;许多的文件都是一些重复操作&#xff0c;比如表的实体类&#xff0c;mapper接口类&#xff0c;xml映射文件&#xff0c;业务层接口&#xff0c;接口实现类等。亟需一个自动化生成固定代码文件的工具&…

【24】SCI易中期刊推荐——计算机人工智能(中科院4区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

【Java从0到1学习】02 Java 开发环境配置

1. 安装 1、方式一&#xff1a;进入官网https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html下载JDK 方式二&#xff1a;博主提供的百度网盘版本下载&#xff1a;https://pan.baidu.com/s/1liNHej2hGXJU_L8yQNRZmQ?pwd9w3f 2、下载后双击即可安装…

4、VScode、WAMP、Xdebug调试

1、查看Xdebug的版本 Xdebug是随WAMP一起安装的&#xff0c;版本号可以通过PHP扩展菜单下查看&#xff0c;为3.1.6 2、配置系统环境变量 将PHP的安装目录&#xff0c;添加到系统的环境变量中&#xff0c;配置完成后&#xff0c;通过命令行 输入命令 PHP -V&#xff0c;查看是…

33. bio和nio

文章目录 一、bio网络模型1.1 bio网络模型示意图1.2 bio网络模型缺点 二、NIO网络模型2.1 nio网络模型示意图2.2 nio网络模型的改进 三、NIO核心- Channel&#xff08;通道&#xff09;3.1 Channel 简介3.2 Channel 实现类3.3 bio的socket 和 nio的channel代码实现 四、NIO核心…