mybatisplus学习笔记(3)-乐观锁、逻辑删除,分页查询,条件查询,性能分析

以下内容参考尚硅谷的https://www.bilibili.com/video/BV1y7411y7am视频

1.乐观锁

1.1 数据库中添加version字段

ALTER TABLE USER ADD COLUMN version INT;

1.2 实体类添加对应属性

同时要添加@Version注解

这里同时使用了@TableField,等会在插入数据时,给其版本赋予初值

@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;

1.3 Config配置乐观锁插件

注意添加 @Bean注解,否则插件不会生效

@Configuration
@MapperScan("com.nslt.mpdemo10101.mapper")
public class MyConfig {
    //乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }
}

1.4 在Handler配置version自动填充

给version赋予初值1

this.setFieldValByName("version",1,metaObject);

1.5 测试

执行下面插入语句

@Test
public void insertUser3(){
    User user = new User();
    user.setName("曹操");
    user.setAge(42);
    user.setEmail("[email protected]");
    int insert = userMapper.insert(user);
    if (insert>0){
        System.out.println("插入成功");
    }else {
        System.out.println("插入失败");
    }
}

可以看到数据库表中多了一条数据,版本为1

2.根据id查询

@Test
public void select(){
    User user = userMapper.selectById(1280481107959287809L);
    System.out.println(user);
}

3.多个id批量查询

@Test
public void selectBatch(){
    List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L));
    System.out.println(users);
}

4.分页查询

4.1 配置分页插件

@Bean
public PaginationInterceptor paginationInterceptor(){
    return new PaginationInterceptor();
}

4.2 测试

运行下面语句

@Test
public void selectPage(){
    Page<User> page = new Page<>(1,3);  //填写第几页和每页几条数据
    userMapper.selectPage(page,null);

    System.out.println(page.getCurrent());  //当前页
    System.out.println(page.getRecords());  //当前页数据
    System.out.println(page.getPages());    //总页数
    System.out.println(page.getTotal());    //总记录数
    System.out.println(page.getSize());     //当前页记录数

    System.out.println(page.hasPrevious()); //上一页
    System.out.println(page.hasNext()); //下一页
}

结果如下

5.物理删除

@Test
public void delete(){
    int result = userMapper.deleteById(5L);
    if (result>0){
        System.out.println("删除成功");
    }else {
        System.out.println("删除失败");
    }
}

6.批量删除

@Test
public void deleteBatch(){
    int result = userMapper.deleteBatchIds(Arrays.asList(1L, 2L, 3L));
    if (result>0){
        System.out.println("删除成功");
    }else {
        System.out.println("删除失败");
    }
}

7.逻辑删除

7.1 表中添加deleted字段

deleted默认值为0,也可以在此处不设置默认值,使用自动填充在插入数据时赋予初值

ALTER TABLE USER ADD COLUMN deleted TINYINT(1) DEFAULT 0;

7.2 实体类中添加对应属性

注意添加@TableLogic注解

@TableLogic
private Integer deleted;

7.3 配置逻辑删除插件

如果想修改逻辑删除时的默认值,可以在application.properties文件中设置

//逻辑删除插件
//在3.1.1之后省略此步骤
@Bean
public ISqlInjector sqlInjector(){
    return new LogicSqlInjector();
}

7.4 测试

运行下面语句

@Test
public void deleteLogic(){
    int result = userMapper.deleteById(1280481107959287809L);
    if (result>0){
        System.out.println("删除成功");
    }else {
        System.out.println("删除失败");
    }
}

运行结果如下

可以发现deleted字段的值为1

8.性能分析插件

8.1 在Config类配置插件

//性能分析插件
@Bean
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor(){
    PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
    performanceInterceptor.setMaxTime(500); //ms,超过此处设置的ms则sql不执行
    performanceInterceptor.setFormat(true); //SQL 是否格式化
    return performanceInterceptor;
}

8.2 在application.properties配置环境

#环境设置:dev、test、prod
spring.profiles.active=dev

8.3 测试

运行下面语句

@Test
public void insertUser4(){
    User user = new User();
    user.setName("曹休");
    user.setAge(36);
    user.setEmail("[email protected]");
    int insert = userMapper.insert(user);
    if (insert>0){
        System.out.println("插入成功");
    }else {
        System.out.println("插入失败");
    }
}

运行结果如下

可以看到运行时间为55ms

9.条件查询wrapper

9.1 ge 大于等于; gt 大于; le 小于等于; lt 小于;

@Test
public void selectWrapper(){
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //ge 大于等于; gt 大于; le 小于等于; lt 小于;
    wrapper.le("age",60);	//表中的列,对应的值
    List<User> users = userMapper.selectList(wrapper);
    System.out.println(users);
}

9.2 eq 等于;ne 不等于;

wrapper.eq("name","曹操");	//表中的列,对应的值

9.3 like模糊查询

wrapper.like("name","张");	//表中的列,对应的值

9.4 desc 倒序;asc 正序

wrapper.orderByDesc("age");		//表中的列

9.5 last 拼接到sql语句最后

wrapper.last("limit 2");		//添加要追加的sql语句

9.6 between 范围查询

注意查询是闭区间,包含起始值和结束值

wrapper.between("age",42,70);   //表中的列,起始值,结束值

9.7 select 指定要查询的列

wrapper.select("name","age");   //表中的列1,列2,,,
c("age");		//表中的列

9.5 last 拼接到sql语句最后

wrapper.last("limit 2");		//添加要追加的sql语句

9.6 between 范围查询

注意查询是闭区间,包含起始值和结束值

wrapper.between("age",42,70);   //表中的列,起始值,结束值

9.7 select 指定要查询的列

wrapper.select("name","age");   //表中的列1,列2,,,

你可能感兴趣的:(mybatisplus)