MyBatis的增删改查操作

MyBatis的增删改查操作_第1张图片

⭐️前言⭐️

这篇文章,我们就来完成MyBatis的增删改查操作,体会高级框架带来的灵活与简便。

用于进行操作的数据库数据表:

-- 创建数据库
drop database if exists mycnblog;
create database mycnblog DEFAULT CHARACTER SET utf8mb4;

-- 使用数据数据
use mycnblog;

-- 创建表[用户表]
drop table if exists  userinfo;
create table userinfo(
    id int primary key auto_increment,
    username varchar(100) not null,
    password varchar(32) not null,
    photo varchar(500) default 'default.png',
    createtime datetime default now(),
    updatetime datetime default now(),
    `state` int default 1
) default charset 'utf8mb4';

-- 创建文章表
drop table if exists  articleinfo;
create table articleinfo(
    id int primary key auto_increment,
    title varchar(100) not null,
    content text not null,
    createtime datetime default now(),
    updatetime datetime default now(),
    uid int not null,
    rcount int not null default 1,
    `state` int default 1
)default charset 'utf8mb4';

-- 创建视频表
drop table if exists videoinfo;
create table videoinfo(
  	vid int primary key,
  	`title` varchar(250),
  	`url` varchar(1000),
		createtime datetime default now(),
		updatetime datetime default now(),
  	uid int
)default charset 'utf8mb4';

-- 添加一个用户信息
INSERT INTO `mycnblog`.`userinfo` (`id`, `username`, `password`, `photo`, `createtime`, `updatetime`, `state`) VALUES 
(1, 'admin', 'admin', '', '2021-12-06 17:10:48', '2021-12-06 17:10:48', 1);

-- 文章添加测试数据
insert into articleinfo(title,content,uid)
    values('Java','Java正文',1);
    
-- 添加视频
insert into videoinfo(vid,title,url,uid) values(1,'java title','http://www.baidu.com',1);


欢迎点赞 收藏留言评论 私信必回哟

博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

博客中涉及源码及博主日常练习代码均已上传GitHub


请添加图片描述

内容导读

  • 1.增加操作
    • 1.1 添加用户并返回受影响的行数
    • 1.2 添加用户并返回自增ID
  • 2.删除操作
  • 3.修改操作
  • 4.查找操作
    • 4.1 单表查询
      • 4.1.1 参数占位符#{}和${}
      • 4.1.2 ${}的使用场景
      • 4.1.3 SQL注入问题
      • 4.1.4 like模糊查询
    • 4.2 多表查询
      • 4.2.1 返回类型:resultType
      • 4.2.2 返回字典映射:resultMap
      • 4.2.3 多表查询
        • 一对一的表映射
        • 一对多的表映射
  • 5.动态SQL
    • 5.1 < if >标签
    • 5.2 < trim >标签
    • 5.3 < where >标签
    • 5.4 < set >标签
    • 5.5 < foreach >标签

在MyBatis中,不同的操作对应使用不同的标签,具体标签如下:

  • < insert >标签:插入语句
  • < update >标签:修改语句
  • < delete >标签:删除语句
  • < select >标签:查询语句

具体实现如下:

1.增加操作

1.1 添加用户并返回受影响的行数

1、 在mapper包下(interface)添加方法声明.
在这里插入图片描述

2、在xml实现添加业务
MyBatis的增删改查操作_第2张图片

3、 单元测试
MyBatis的增删改查操作_第3张图片

测试结果:
MyBatis的增删改查操作_第4张图片
MyBatis的增删改查操作_第5张图片

1.2 添加用户并返回自增ID

1、添加方法声明
在这里插入图片描述

2、在xml实现添加业务
在这里插入图片描述

  • useGeneratedKeys:这会令MyBatis使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键(比如:像MySQL和SQL Server这样的关系型数据库管理系统的自动递增字段),默认值:false。
  • keyColumn:设置生成键值在表中的列名,在某些数据库(像PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。
  • keyPropety:指定能够唯一识别对象的属性,MyBatis会使用getGeneratedKeys的返回值或insert语句中的selectKey子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性的名称。

3.单元测试
MyBatis的增删改查操作_第6张图片
注解@Transactional表示该事务在测试完成后会自动回滚,这也是单元测试的优点,不会污染数据库。
测试结果:
MyBatis的增删改查操作_第7张图片

2.删除操作

1、在mapper(interface)里面添加删除的代码声明
在这里插入图片描述
注解@Param中的参数需要与xml中的参数对应。

2.在xml中添加< delete >标签和删除的sql
MyBatis的增删改查操作_第8张图片

3.单元测试
MyBatis的增删改查操作_第9张图片
测试结果:
MyBatis的增删改查操作_第10张图片

3.修改操作

1、在mapper(interface)里面添加修改的代码声明
在这里插入图片描述

2、在xml中添加< update >标签和具体要执行的SQL
MyBatis的增删改查操作_第11张图片
3.单元测试
MyBatis的增删改查操作_第12张图片
测试结果:
MyBatis的增删改查操作_第13张图片

4.查找操作

4.1 单表查询

4.1.1 参数占位符#{}和${}

  • #{}:预编译处理
  • ${}:字符直接替换

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

直接替换是指:MyBatis在处理$ {}时,就直接把${}替换成变量的值。

下边通过几个例子来具体了解一下两者的差别:

针对int类型的参数进行查询
在这里插入图片描述
使用#{},可以在测试结果中发现,就是把#{}替换成了?占位符,进行预编译处理。

在这里插入图片描述
MyBatis的增删改查操作_第14张图片
MyBatis的增删改查操作_第15张图片

使用${},可以在测试结果中发现,就直接把 ${}替换成变量的值。

在这里插入图片描述
MyBatis的增删改查操作_第16张图片
MyBatis的增删改查操作_第17张图片

但是针对int类型的参数两种占位符都完成了查询,下边我们来看
针对String类型的参数进行查询
在这里插入图片描述
使用#{}参数占位符

在这里插入图片描述
MyBatis的增删改查操作_第18张图片
MyBatis的增删改查操作_第19张图片

使用${}参数占位符

在这里插入图片描述
MyBatis的增删改查操作_第20张图片
MyBatis的增删改查操作_第21张图片

发现在使用${}占位符去进行查询时,会发生报错,这是因为通过#{}占位符去进行查询的时候,默认加上了单引号,拼装的SQL就成了select * from userinfo where username='张三',而通过 ${}占位符去进行查询的时候直接替换但并没有加上单引号,拼装的SQL就成了select * from userinfo where username=张三,所以会SQL报错。

总结
#{}和${}的区别

1.定义不同:#{}是预处理;而${}是直接替换
2.使用不同:#{}适用于所有类型的参数匹配;但 ${}只适用于数值类型。
3.安全性不同:#{}安全性能高,没有安全问题;但 ${}存在SQL注入的安全问题。

4.1.2 ${}的使用场景

虽然${}占位符的使用受限,但是其也有它无可替代的使用场景,当传递的是一个SQL关键字(SQL命令)的时候,只能使用 ${},此时如果使用#{}就会认为传递的为一个普通的值,而非SQL命令,所以执行就会报错。

就像下边这个例子,会有价格从低到高或者从高到低的排序,如果想要实现这样的效果,就需要使用到${}占位符
MyBatis的增删改查操作_第22张图片
代码示例:

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

测试:

MyBatis的增删改查操作_第23张图片
MyBatis的增删改查操作_第24张图片

4.1.3 SQL注入问题

下边通过一个登录的案例来引入SQL注入的问题:

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

MyBatis的增删改查操作_第25张图片

在这里插入图片描述

我们可以发现,当我输入的密码为' or 1='1时,经过拼装出来的SQL是select * from userinfo where username='admin' and password='' or 1='1',这样即使不知道密码,也能返回该用户的信息,这就是SQL注入问题。

要想解决${}参数占位符带来的SQL注入问题,就需要在业务层对传递的值进行安全效验,如4.1.2中的排序,就需要规定传入的参数只能为asc或者desc,也就是说想要用 ${}参数占位符,需要该位置的参数是可穷举的,那么这个4.1.3中登录的例子也就不适用了,所以其更适用于用#{}来解决登录的问题。

在这里插入图片描述
在这里插入图片描述
可以发现用#{}参数占位符去搜索时,查询不到结果,也就解决了该安全隐患。

4.1.4 like模糊查询

这是一个特殊的查询,如果使用#{}会报错,但使用${}在业务层的值又不能穷举,就需要通过SQL中的concat函数,将%与模糊字符合并起来,如下所示。
在这里插入图片描述
在这里插入图片描述
MyBatis的增删改查操作_第26张图片

MyBatis的增删改查操作_第27张图片

4.2 多表查询

如果是增、删、改操作,返回受影响的行数,那么在mapper.xml中是可以不设置返回的类型的,如下图所示:

MyBatis的增删改查操作_第28张图片
但即使如果是最简单的查询操作,也需要设置返回类型,否则就会报错。也就是说对于< select >查询标签来说,至少需要两个属性:

  • id属性:用于标识实现接口中的那个方法
  • 结果映射属性:结果映射有两种实现标签;< resultMap >和< resultType >。

4.2.1 返回类型:resultType

绝大多数查询场景可以使用resultType进行返回,如下代码所示:
在这里插入图片描述
其优点是使用方便,直接定义到某个实体类即可。

4.2.2 返回字典映射:resultMap

resultMap使用场景:

  • 字段名称和程序中的属性名不同的情况,可以使用resultMap配置映射;
  • 一对一和一对多关系可以使用resultMap映射并查数据

字段名和属性名不同的情况:
MyBatis的增删改查操作_第29张图片
mapper.xml中的代码:
在这里插入图片描述

单元测试代码:
MyBatis的增删改查操作_第30张图片
单元测试结果:
在这里插入图片描述
查询不到name属性,这时候就需要用到resultMap了,resultMap的使用如下:
MyBatis的增删改查操作_第31张图片
MyBatis的增删改查操作_第32张图片

查询成功:
在这里插入图片描述

4.2.3 多表查询

在多表查询时,如果使用resultType标签,在一个类中包含了另一个对象,是查询不出来被包含的对象的,比如以下实体类:一篇文章对应一个作者,文章实体类中包含对象实体。
MyBatis的增删改查操作_第33张图片

mapper.xml代码如下:
MyBatis的增删改查操作_第34张图片
测试代码如下:
MyBatis的增删改查操作_第35张图片
测试结果:
在这里插入图片描述
此时,我们就需要使用特殊的手段来实现联表查询了。

一对一的表映射

一对一映射要使用< association >标签,具体实现如下(一篇文章只对应一个作者):
MyBatis的增删改查操作_第36张图片

以上使用< association >标签,表示一对一的结果映射:

  • property属性:指定Article中对应的属性,即用户。
  • resultMap属性:指定关联的结果集映射,将基于该映射配置来组织用户数据。
  • columnPrefix属性:如遇多表中有相同字段名时,该属性作为区分不同表中相同字段的前缀。

映射的mapper.xml文件如下:
MyBatis的增删改查操作_第37张图片
测试代码如下:
MyBatis的增删改查操作_第38张图片
测试结果:
在这里插入图片描述

一对多的表映射

一对多需要使用< collection >标签,用法和< association >相同,如下所示:(一个用户对应多篇文章)
MyBatis的增删改查操作_第39张图片
MyBatis的增删改查操作_第40张图片
测试结果:
在这里插入图片描述

5.动态SQL

5.1 < if >标签

我们在进行注册功能时,可能涉及到必填字段和非必填字段两类字段,那如果在添加用户的时候,有不确定的字段传入,程序此时就应该使用动态标签< if >来判断了,该标签的主要作用是判断一个参数是否有值,如果没值,那么会隐藏if中的SQL,如下的photo字段。

MyBatis的增删改查操作_第41张图片
拼装的SQL就会根据是否传入了photo参数来确定是否增添photo字段。
在这里插入图片描述

5.2 < trim >标签

之前的插入用户功能,只有一个photo字段可能是选填项,如果所有字段都是非必填项,就考虑使用< trim >标签结合< if >标签,对多个字段都采取动态生成的方式。最主要的作用就是:去除SQL语句前后多余的某个字符

  • prefix:表示整个语句块,以prefix的值作为前缀
  • suffix:表示整个语句块,以suffix的值作为后缀
  • prefixOverrides:表示整个语句块要去除掉的前缀
  • suffixOverriders:表示整个语句块要去除的后缀

调整UserMapper.xml的插入语句为:
MyBatis的增删改查操作_第42张图片
测试结果:
在这里插入图片描述

5.3 < where >标签

该标签的主要作用是:
实现查询中的where SQL替换,如果没有任何的查询条件,那么它可以隐藏查询查询中的where SQL,但如果存在查询条件,那么就会生成where的SQL查询;并且使用where标签可以自动的去除最前面的一个and字符

mapper.xml中的代码如下:
MyBatis的增删改查操作_第43张图片
测试结果:
MyBatis的增删改查操作_第44张图片
以上< where >标签也可以使用< trim prefix="where" prefixOverrides="and" >替换。

5.4 < set >标签

该标签的主要作用是:
进行修改操作时,配合if来处理非必传参数,它的特点是会自动去除最后一个英文逗号。

mapper中的代码如下
在这里插入图片描述

mapper.xml中的代码如下:
MyBatis的增删改查操作_第45张图片
测试及测试结果如下:
MyBatis的增删改查操作_第46张图片
以上< set >标签也可以使用< trim prefix="set" suffixOverrides="," >替换

5.5 < foreach >标签

对集合进行遍历时可以使用该标签。< foreach >标签有如下属性:

  • collection:绑定方法参数中的集合,如List,Set,Map或数组对象
  • item:遍历时的每一个对象
  • open:语句块开头的字符串
  • close:语句块结束的字符串
  • separator:每次遍历之间间隔的字符串

在这里插入图片描述
mapper.xml中的代码如下:
MyBatis的增删改查操作_第47张图片
测试及测试结果如下:
MyBatis的增删改查操作_第48张图片


⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正

请添加图片描述

你可能感兴趣的:(JavaEE进阶,mybatis,java,数据库)