一、源码
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();
}
@Bean
@Profile({"dev","test"})
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
performanceInterceptor.setMaxTime(500);
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 {
private Long id;
private String name;
private Integer age;
private String email;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@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;
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 {
@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);
}
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}