• MyBatisPlus属性自动填充和乐观锁插件+查询删除操作


    属性字段自动填充

    一、实体类和数据表添加两个字段(属性)

    表:create_tiem/update_time
    实体类:createTime/updateTime

    二、实体类中属性进行注解添加

    @TableField(fill=FieldFill.INSERT)
    private Date createTime;
    
    @TableField(fill=FieldFill.INSERT_UPDATE)
    private Date updateTime;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    三、创建实现MetaObjectHandler接口的类,并实现两个方法
    一个方法添加执行,另一个方法修改执行

    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler{
    	
    	@Override
    	public void insertFill(MetaObject metaObject){
    		//旧版本,字段类型为Date
    		//this.setFieldValByName("createTime",new Date(),metaObject);
    		
    		//新版本,字段类型为LocalDateTime
    		this.strictInsertFilll(metaObject,"createTime",LocalDateTime.class,LocalDateTime.now());
    	
    		//对于其他属性,可以通过判断是否赋值来决定是否自动填充
    		Object age = this.getFieldValByName("age",metaObject);
    		if(age == null){
    			//说明业务层并没有手动填充,则自动填充
    			this.strictInsertFill(metaObject,"age",Integer.class,24);
    		}
    
    		//判断author属性是否被业务代码设值
    		boolean hasAuthor = metaObject.hasSetter("author");
    		if(hasAuthor){
    			this.strictInsertFill(metaObject,"author",String.class,"jordan");
    		}
    	}
    	@Override
    	public void updateFill(MetaObject metaObject){
    		this.setFieldValByName("updateTime",new Date(),metaObject);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    乐观锁

    一、在表中添加version字段,在实体类中添加version字段(Integer)

    二、在实体类进行版本号操作属性上添加注解

    @Version
    private Integer version;
    
    • 1
    • 2

    三、配置乐观锁插件

    在启动类,或者单独新建一个config包下创建一个配置类

    @Configuration
    @MapperScan("com.michael.mapper")
    public class MpConfig{
    	
    	@Bean
    	public OptimisticLockerInterceptor optimisticLockerInterceptor(){
    		return new OptimisticLockerInterceptor();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    或者将其和分页插件配置到同一个配置类下

    @Configuration
    @MapperScan("com.michael.mybatisplus.mapper")
    public class MybatisPusConfig{
    	
    	@Bean
    	public MybatisPlusInterceptor mybatisPlusInterceptor(){
    		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    		
    		//分页插件
    		interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    		//乐观锁插件
    		interceptor.addInnerInterceptor(new OptimisticLockerInterceptor());
    		
    		return interceptor;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    ============================================================

    多个id批量查询

    List<User> users = userMapper.selectBatchIds(Arrays.asList(1,2,3));
    
    • 1

    简单条件查询

    Map<String,Object> columnMap = new HashMap<>();
    columnMap.put("name","Jack");
    columnMap.put("age",20);
    
    List<User> users = userMapper.selectByMap(columnMap);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    分页查询

    ①、配置分页插件配置类

    @Configuration
    @MapperScan("com.michael.mybatisplus.mapper") //可以将此注解从启动类上移过来
    public class MybatisPlusConfig{
    
    	/**
    		旧版本,已经过时!
    	*/
    	@Bean
    	public PaginationInterceptor paginationInterceptor(){
    		PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
    		patinationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
    		return paginationInterceptor;
    	}
    
    	/**
    		新版本
    	*/
    	@Bean
    	public MybatisPlusInterceptor mybatisPlusInterceptor(){
    		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    		interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    		return interceptor;
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    ②、编写分页代码,插件Page对象,传入两个对象,当前页和每页记录数

    Page<User> page = new Page(1,3);
    Page<User> userPage = userMapper.selectPage(page,null);//第二个参数为条件
    
    //直接通过page变量,还可以执行如下操作
    long pages = userPage.getPages();//总页数
    long current = userPage.getCurrent();//当前页
    List<User> records = userPage.getRecords();//查询数据集合
    long tobal = userPage.getTotal();//总记录数
    boolean b = userPage.hasNext(); //当前是否有下一页
    boolean b1 = userPage.hasPrevious();//当前是否有上一页
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    逻辑删除

    ①、数据表添加一个字段boolean类型deleted,实体类添加属性Integer类型deleted

    @TableField(value="is_deleted") //映射数据库字段
    @TableLogic
    private Integer deleted;
    
    • 1
    • 2
    • 3

    mysql数据库is_deleted字段的类型tinyint

    ②、application.properties配置文件中添加

    以下配置为默认值,所以该配置可无

    mybatis-plus.global-config.db-config.logic-delete-value=1
    mybatis-plus.global-config.db-config.logic-not-delete-value=0
    
    #全局设置主键生成策略
    mybatis-plus.global-config.db-cofig.id-type=auto
    
    • 1
    • 2
    • 3
    • 4
    • 5

    条件构造器

    在这里插入图片描述

    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.isNull("name").ge("age",12).isNotNull("email");//构造条件
    int result = userMapper.delete(queryWrapper);
    
    • 1
    • 2
    • 3
    //条件查询+分页
    @PostMapping("findPageHospSet/{current}/{limit}")//参数:当前页,每页数量
    public Result findPageHospSet(@PathVariable long current,@PathVariable long limit,
    	@RequestBody(required=false) HospitalSetQueryVo hospitalSetQueryVo//通过json传递
    ){
    	//创建page对象
    	Page<HospitalSet> page = new Page<>(current,limit);
    	
    	//构建条件
    	QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
    	String hosname = hospitalSetQueryVo.getHosname();
    	String hoscode = hospitalSetQueryVo.getHoscode();
    	if(!StringUtils.isEmpty(hosname)){
    		wrapper.like("hosname",hospitalSetQueryVo.getHosname());
    	}
    	if(!StringUtils.isEmpty(hoscode)){
    		wrapper.eq("hoscode",hosipitalSetQueryVo.getHoscode());
    	}
    	
    	Page<HospitalSet> pageHospitalSet = hospitalSetService.page(page,wrapper);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

    将控制方法的get改为post
    参数添加注解@RequestBody
    在这里插入图片描述

    ====================================================================

    SpringBoot+MyBatisPlus常见问题

    一、启动时,报出找不到mapper的问题

    因为mapper包下是一个是实现了BaseMapper接口的接口,其实现类需要动态创建

    方式一:需要在启动类上添加@MapperScan(“指定mapper包位置”)

    方式二:配置类

    @Configuration
    @MapperScan("com.michael.mapper")
    public class myConfig{
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    EXCEL day 02 公式和函数
    JavaScript面试题整理(一)
    工程项目进度控制的主要措施有哪些?
    【Qt图形视图框架】QGraphicsScene分析
    android 刷机时缺少驱动无法识别
    Hadoop作业篇(一)
    知识图谱从入门到应用——知识图谱的应用
    贪心算法: 奶牛做题
    QUIC 与 防火墙
    03.操作系统内存管理
  • 原文地址:https://blog.csdn.net/usa_washington/article/details/133699378