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
 
