mybatisPlus常用的4大插件(乐观锁、分页、逻辑删除、SQL 执行性能分析插件)

一、源码

1、配置类

package com.atguigu.mpdemo1010.config;

import com.baomidou.mybatisplus.core.injector.ISqlInjector;
import com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@MapperScan("com.atguigu.mpdemo1010.mapper")
public class MpConfig {

    //乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

    //逻辑删除插件
    @Bean
    public ISqlInjector sqlInjector() {
        return new LogicSqlInjector();
    }

    /**
     * SQL 执行性能分析插件
     * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长
     *
     * 三种环境
     *      * dev:开发环境
     *      * test:测试环境
     *      * prod:生产环境
     */
    @Bean
    @Profile({"dev","test"})// 设置 dev test 环境开启
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
        performanceInterceptor.setMaxTime(500);//ms,超过此处设置的ms则sql不执行
        performanceInterceptor.setFormat(true);
        return performanceInterceptor;
    }
}

2、实体类

package com.atguigu.mpdemo1010.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

@Data
public class User {

    //@TableId(type = IdType.ID_WORKER) //mp自带策略,生成19位值,数字类型使用这种策略,比如long
    //@TableId(type = IdType.ID_WORKER_STR) //mp自带策略,生成19位值,字符串类型使用这种策略
    private Long id;

    private String name;
    private Integer age;
    private String email;

    //create_time
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    //update_time
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    @Version
    @TableField(fill = FieldFill.INSERT)
    private Integer version;//版本号

    @TableLogic
    private Integer deleted;
}

二、乐观锁插件

1、乐观锁主要实现的功能

  • 多线程的情况下,实现最基本的CAS操作
  • 当数据库中存在version字段的时候,修改的时候会自动把该字段的verison的值加1
  • 如果无version字段,或者version字段的值为null,都不会有影响,不会导致程序报错

2、mybatisplus实现原理

  • 当user对象中有version字段,但是version无值,则修改请求的sql为,不对version操作
UPDATE user SET age=120  WHERE id=1 
  • 如果version有值,假设原来的version的值为100,则执行
UPDATE user SET age=120, version=101  WHERE id=1 AND version=100
  • 如果数据被其他线程改过,version则不会为100,那么上面的sql语句where 中 version=100 为false,则不会修改数据

三、分页插件

  • 为方法提供分页实现

四、逻辑删除插件

1、实现步骤

  • 向容器中加入ISqlInjector类
  • 数据库增加字段deleted
  • entity 增加字段deleted
  • 配置文件增加(默认值为下面的,可写可不写)
mybatis-plus.global-config.db-config.logic-delete-value=1			#表示1为被删除了
mybatis-plus.global-config.db-config.logic-not-delete-value=0   	#表示0位未被删除

2、实现效果

  • 任何都查询会自动加上 where deleted=0 。

3、几种常见的情况

  • 不加逻辑删除插件
    逻辑删除失败,不会实现自动添加 deleted=0。不过也可以自己写条件实现,但是比较麻烦。
  • entity中的User没有deleted字段
    不会自动添加 deleted=0
  • 数据库没有 deleted 字段
    sql语句直接报错

五、SQL 执行性能分析插件

在这里插入图片描述

其他

1、@TableField注解

  • @TableField(fill = FieldFill.INSERT) 在插入的时候自动赋值
  • @TableField(fill = FieldFill.INSERT_UPDATE) 表示在插入或者是更新的时候自动赋值
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
  • 需要配合handle
package com.atguigu.mpdemo1010.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    //使用mp实现添加操作,这个方法执行
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime",new Date(),metaObject);
        this.setFieldValByName("updateTime",new Date(),metaObject);
        this.setFieldValByName("version",1,metaObject);
        this.setFieldValByName("deleted",0,metaObject);
    }

    //使用mp实现修改操作,这个方法执行
    @Override
    public void updateFill(MetaObject metaObject)  {
        this.setFieldValByName("updateTime",new Date(),metaObject);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值