Spring Boot学习篇(六)
mybatis-plus使用篇(二)
1 新增
1.1 示例代码
@Autowired
ISongsService songsService;
@Test
public 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 语法
boolean updateById ( T entity) ;
2.1.2 示例代码
@Autowired
ISongsService songsService;
@Test
public void updateOne ( ) {
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 语法
boolean updateBatchById ( Collection < T > entityList) ;
2.2.2 示例代码
@Test
public void updateMore ( ) {
List < Songs > 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 语法
boolean removeById ( Serializable id) ;
3.1.2 示例代码
@Test
public 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 语法
boolean removeBatchByIds ( Collection < ? > list)
3.2.2 示例代码
@Test
public void deleteMore ( ) {
List < Integer > 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 需要添加的内容
@TableLogic
private 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. * ;
@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;
@TableLogic
private Integer del;
}
4.4 测试
4.4.1 示例代码
@Test
public 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 示例代码
@Test
public void updateOne ( ) {
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 需要添加的内容
@Version
private 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. * ;
@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;
@Version
private 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" )
public class PlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor ( ) {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor ( ) ;
PaginationInnerInterceptor pi = new PaginationInnerInterceptor ( ) ;
pi. setDbType ( DbType . MYSQL ) ;
pi. setOverflow ( 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 ( "光年之外" ) ;
boolean 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