Spring Boot学习篇(六)
创始人
2024-05-06 12:21:49
0

Spring Boot学习篇(六)

mybatis-plus使用篇(二)

1 新增

1.1 示例代码

@AutowiredISongsService songsService;
@Testpublic void add(){Songs s=new Songs(null,"11","xx",null,"xx歌曲","2020-02-12");songsService.save(s);System.out.println(s);}

1.2 运行截图

在这里插入图片描述

2 修改

2.1 单条修改updateById

2.1.1 语法
// 根据 ID 选择修改,entity指的是实体类的意思,
//注意:①仅会根据主键id修改实体类中不为null的非主键字段。
//②若使用的数据库是MySQL,那么实体类的主键字段前必须加上@TableId注解
boolean updateById(T entity);
2.1.2 示例代码
@AutowiredISongsService songsService;
@Testpublic void updateOne(){// 根据 ID来修改Songs songs = new Songs(1002, "凤凰传奇", null, null, "策马奔腾", null);boolean b = songsService.updateById(songs);System.out.println("更新结果:"+b);}
2.1.3 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

2.1.4 单条修改前后数据对比
a.1 单条修改前

在这里插入图片描述

a.2 单条 修改后

在这里插入图片描述

2.2 批量修改updateBatchById

2.2.1 语法
// 根据ID 批量更新, entityList传的是集合Collection的实现类,可以是ArrayList
//注意:①仅会根据主键id批量修改实体类中不为null的非主键字段。
//②若使用的数据库是MySQL,那么实体类的主键字段前必须加上@TableId注解
boolean updateBatchById(Collection entityList);
2.2.2 示例代码
@Testpublic void updateMore(){// 根据 ID来批量更新,也是不为null的非主键字段都会更新List list=new ArrayList<>();list.add(new Songs(1002, "周杰伦", null, null, "七里香", null));list.add(new Songs(1004, "汪苏泷", null, null, "三国杀", null));list.add(new Songs(1005, "凤凰传奇", null, null, "荷塘月色", null));boolean b = songsService.updateBatchById(list);System.out.println("批量更新结果:"+b);}
2.2.3 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

2.2.4 批量修改前后数据对比
a.1 批量修改前

在这里插入图片描述

a.2 批量修改后

在这里插入图片描述

3 删除

3.1 单条删除

3.1.1 语法
// 根据 ID 删除,可以传Integer或者String类型的数据,因为都实现了java.io.Serializable接口
boolean removeById(Serializable id);
3.1.2 示例代码
//常规删除:删除单条@Testpublic void deleteOne(){boolean b = songsService.removeById(1004);System.out.println("删除单条结果:"+b);}
3.1.3 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

3.1.4 单条删除前后数据对比
a.1 单条删除前

在这里插入图片描述

a.2 单条删除后

在这里插入图片描述

3.2 批量删除

3.2.1 语法
// 删除(根据ID 批量删除)
boolean removeBatchByIds(Collection list)
3.2.2 示例代码
 //常规删除:批量删除@Testpublic void deleteMore(){List list=new ArrayList<>();list.add(1002);list.add(1005);boolean b = songsService.removeBatchByIds(list);System.out.println("结果:"+b);}
3.2.3 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

3.2.4 批量删除前后数据对比
a.1 批量删除前

在这里插入图片描述

a.2 批量删除后

在这里插入图片描述

4 逻辑删除

4.1 含义&&使用注意点

并不是真正的从数据表删除这条数据,而是将表中的逻辑删除字段的值变更为1(此时就代表逻辑删除成功了)
注意:①若是自定义sql,就需要自己写where子句②默认是以0表示未删除,1表示已删除③逻辑删除本质就是更改表的某个字段,在查询和更新的时候给定规则去进行筛选

4.2 更新表结构(增加逻辑删除字段)

4.2.1 右键设计表

在这里插入图片描述

4.2.2 在表中添加字段del

在这里插入图片描述

4.3 更新实体类(加上逻辑删除属性)

4.3.1 需要添加的内容
 @TableLogicprivate Integer del;
4.3.2 完整的实体类代码
package com.zlz.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.Date;import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.*;/*** 

* *

** @author zlz* @since 2023-01-02*/ //①改动地方1 @AllArgsConstructor @NoArgsConstructor @Data public class Songs implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "id", type = IdType.AUTO)private Integer id;private String singerName;private String album;private String albumImg;private String name;//②改动地方2,调成String形式,就不用转型了private String releaseDate;//需要加上属性名 @TableLogic表示逻辑删除@TableLogicprivate Integer del; }

4.4 测试

4.4.1 示例代码
@Testpublic void remove(){boolean b = songsService.removeById(1006);System.out.println("逻辑删除结果: "+b);}
4.4.2 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

4.4.3 逻辑删除前后数据对比
a.1 逻辑删除前

在这里插入图片描述

a.2 逻辑删除后

在这里插入图片描述

4.5 演示加了逻辑删除后,查询的变化

4.5.1 示例代码
@Test
public void find(){Songs s=songsService.getById(1006);System.out.println("逻辑删除后再查该数据的结果:"+s);
}
4.5.2 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

4.6 演示加了逻辑删除后,更新的变化

4.6.1 示例代码
@Testpublic void updateOne(){// 根据 ID来修改Songs songs = new Songs(1006, "凤凰传奇", null, null, "策马奔腾", null,null);boolean b = songsService.updateById(songs);System.out.println("配置了逻辑删除后,更新的结果为:"+b);}
4.6.2 运行截图
a sql日志信息

在这里插入图片描述

b 打印结果

在这里插入图片描述

4.6.3 配置了逻辑删除后更新,前后数据的对比情况
a.1 更新前

在这里插入图片描述

a.2 更新后

在这里插入图片描述

6 乐观锁

6.1 简要说明

① 当要更新一条记录的时候,希望这条记录没有被别人更新
② 为了解决多个用户同时修改相同的数据时的冲突问题
③ 乐观锁是业务的实现(代码不加锁)
④ 修改时,会根据版本修改,修改成功后会递增版本
⑤ 乐观锁只是修改的时候起作用,支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime

6.2 更新表结构(增加版本字段)

6.2.1 右键设计表

在这里插入图片描述

6.2.2 在表中添加字段v

在这里插入图片描述

6.3 更新实体类(加上版本属性)

6.3.1 需要添加的内容
@Versionprivate Integer v;
6.3.2 完整的实体类代码
package com.zlz.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.util.Date;import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.*;/*** 

* *

** @author zlz* @since 2023-01-02*/ //①改动地方1 @AllArgsConstructor @NoArgsConstructor @Data public class Songs implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "id", type = IdType.AUTO)private Integer id;private String singerName;private String album;private String albumImg;private String name;private String releaseDate;//② 乐观锁配置@Versionprivate Integer v; }

6.4 变更PlusConfig类

6.4.1 需要加入的内容
//加上乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
6.4.2 完整的PlusConfig代码
package com.zlz.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@MapperScan("com.zlz.mapper")//mapper接口扫描,@MapperScan也可以放在启动类PlusStart上面(启动类也算配置类)
public class PlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();//设置分页插件,别的拦截器也是addInnerInterceptor加入进去PaginationInnerInterceptor pi = new PaginationInnerInterceptor();pi.setDbType(DbType.MYSQL);//设置数据库类型为MySQLpi.setOverflow(true);//溢出分页处理,默认是false不处理,需要设置成true,保证分页合理化interceptor.addInnerInterceptor(pi);//加上乐观锁插件interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}
}

6.5 自己写代码模拟测试

6.5.1 示例代码
@Test
public void positiveLock(){//查询到的版本都是一样的Songs s1 = songsService.getById(1006);Songs s2 = songsService.getById(1006);//模拟修改s1.setName("光年之外");//第一个用户修改成功后,版本会加1boolean b1 = songsService.updateById(s1);System.out.println("第一个用户修改的结果: "+b1);//第二个用户并发修改时 版本就会查询不到,就会修改失败boolean b2 = songsService.updateById(s2);System.out.println("第二个用户修改的结果: "+b2);
}
6.5.2 运行结果
a 第一个用户修改结果

在这里插入图片描述

b 第二个用户修改结果

在这里插入图片描述

6.5.3 数据表数据变化情况
a 模拟前

在这里插入图片描述

b 模拟后

在这里插入图片描述

6.6 使用压力测试工具jmeter测试

6.6.1 在SongsController类加入如下内容
@RequestMapping("update")
@ResponseBody
public boolean update(){Songs s = songsService.getById(2);return songsService.updateById(s);
}
6.6.2 添加线程组

在这里插入图片描述

6.6.3 添加HTTP请求

在这里插入图片描述

6.6.4 添加结果树

在这里插入图片描述

6.6.5 此时左侧目录结构如下所示

在这里插入图片描述

6.6.6 配置HTTP请求信息

在这里插入图片描述

6.6.7 配置线程组

在这里插入图片描述

6.6.8 测试
a 启动测试

在这里插入图片描述

b.运行截图1

在这里插入图片描述

c 运行截图2

在这里插入图片描述

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...