Mybatis-Plus 中的使用技巧

发布时间 2023-10-16 14:36:36作者: ayiZzzz

什么是 Mybatis-Plus

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官网链接:https://baomidou.com/

Mybati-Plus 常用配置信息

####################  mybatis-plus配置  ###################
mybatis-plus:
  #外部化xml配置
  #config-location: classpath:mybatis-config.xml
  #指定外部化 MyBatis Properties 配置,通过该配置可以抽离配置,实现不同环境的配置部署
  #configuration-properties: classpath:mybatis/config/properties
  #xml扫描,多个目录用逗号或者分号分割(告诉 Mapper 所对应的 XML 文件位置)
  mapper-locations: classpath*:com/wongoing/sys/mapper/xml/*.xml
  #MyBatis 别名包扫描路径,通过该属性可以给包中的类注册别名,多个路径用逗号分割
  type-aliases-package: com.wongoing.sys.model
  #如果配置了该属性,则仅仅会扫描路径下以该类作为父类的域对象
  type-aliases-super-type: java.lang.Object
  #枚举类 扫描路径,如果配置了该属性,会将路径下的枚举类进行注入,让实体类字段能够简单快捷的使用枚举属性
  #type-enums-package: com.wongoing.sys.model
  #项目启动会检查xml配置存在(只在开发时打开)
  check-config-location: true
  #SIMPLE:该执行器类型不做特殊的事情,为每个语句的执行创建一个新的预处理语句,REUSE:改执行器类会复用预处理语句,BATCH:该执行器类型会批量执行所有的更新语句
  default-executor-type: REUSE
  configuration:
    # 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
    map-underscore-to-camel-case: true
    # 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true
    cache-enabled: true
    #懒加载
    aggressive-lazy-loading: true
    #none:不启用自动映射 partial:只对非嵌套的 resultMap 进行自动映射 full:对所有的 resultMap 都进行自动映射
    auto-mapping-behavior: partial
    #none:不做任何处理 (默认值)warning:以日志的形式打印相关警告信息 failing:当作映射失败处理,并抛出异常和详细信息
    auto-mapping-unknown-column-behavior: none
    #如果查询结果中包含空值的列,则 MyBatis 在映射的时候,会不会映射这个字段
    call-setters-on-nulls: true   #允许在resultType="map"时映射null值
    #这个配置会将执行的sql打印出来,在开发或测试的时候可以用
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #是否允许映射结果为多个数据集
    multiple-result-sets-enabled: false
  global-config:
    db-config:
      logic-delete-field: delFlag
      #表名下划线命名默认为true
      table-underline: false
      #id类型: 0  # 0:数据库ID自增   1:用户输入id  2:全局唯一id(IdWorker)  3:全局唯一ID(uuid)
      id-type: auto
      #是否开启大写命名,默认不开启
      capital-mode: false
      #逻辑已删除值,(逻辑删除下有效) 需要注入逻辑策略LogicSqlInjector 以@Bean方式注入
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
      #逻辑未删除值,(逻辑删除下有效)
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)

封装基础 DO 类

@Data
public class BaseDO {

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 修改时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 删除标志
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer delFlag;

    @Version//标识乐观锁版本号字段
    private Integer version;

    @TableFild(fill = FieldFill.INSERT)
    private String createBy;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateBy;
}

六个基础的字段:修改时间,创建时间、创建人、修改人、逻辑删除标识、乐观锁标识

Mybatis-Plus 乐观锁

作用:乐观锁是一种并发控制机制,用于解决多个用户同时对同一数据进行修改时可能出现的数据冲突问题。 在 MyBatis-Plus中,乐观锁可以通过在实体类的字段上添加@Version注解来实现。
特殊情况下也可以考虑使用 Mysql 悲观锁的方式,只不过这种方式会降低数据库的并发能力,但是却可以减少业务层面的代码修改

Mybatis-Plus 枚举类的使用

1、@EnumValue 注解
2、定义枚举类

@Getter
public enum SexEnum {
 
    MAN(1,"男"),
    WOMAN(2,"女");

    @EnumValue
    private int code;

    @JsonValue
    private String value;
 
    SexEnum(Integer code, String value){
        this.code = code;
        this.value = value;
    }
}

通过@EnumValue 标识数据库存储的值,通过@JsoValue 标识前端需要展示的值
3、在 application.yml 里面配置枚举包

mybatis-plus:
  #type-enums-package: com.wongoing.sys.model

Mybatis-Plus 对接 p6spy 跟踪数据库操作

1、什么是 p6spy
p6spy是一个开源项目,通常使用它来跟踪数据库操作,查看程序运行过程中执行的sql语句。
2、ps6spy 配置
spy.properties

module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
#logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat
#customLogMessageFormat=%(currentTime) | SQL耗时: %(executionTime) ms | 连接信息: %(category)-%(connectionId) | 执行语句: %(sql)
# 使用控制台记录sql
appender=com.p6spy.engine.spy.appender.StdoutLogger
## 配置记录Log例外
excludecategories=info,debug,result,batc,resultset
# 设置使用p6spy driver来做代理
deregisterdrivers=true
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动
driverlist=com.mysql.jdbc.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 秒
outagedetectioninterval=2

Mybatis-plus 字段脱敏

1、使用企业级模块

<dependency><!--MyBatis-Plus 企业级模块-->
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-mate-starter</artifactId>
    <version>1.2.8</version>
</dependency>

进行字段脱敏
2、@FieldSensitive(type = SensitiveType.chineseName)

public interface SensitiveType {
    String chineseName = "chineseName";
    String idCard = "idCard";
    String phone = "phone";
    String mobile = "mobile";
    String address = "address";
    String email = "email";
    String bankCard = "bankCard";
    String password = "password";
    String carNumber = "carNumber";
}

选择合适的字段脱敏策略

Mybatis-Plus 分页插件

/**
 * MybatisPlus 配置文件
 */
public class MybatisPlusAutoConfiguration {

    /**
     * 分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

在配置文件中配置分页插件

数据填充配置

public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     * 数据新增时填充
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject,"createTime", Date.class, new Date());
        this.strictInsertFill(metaObject,"updateTime", Date.class, new Date());
        this.strictInsertFill(metaObject,"delFlag", Integer.class, DelEnum.NORMAL.code());
    }

    /**
     * 数据修改时填充
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.strictInsertFill(metaObject, "updateTime", Date.class, new Date());
    }
}

配置填充字段,分为两种策略:添加时填充、修改时填充;在对应的方法添加相应的字段即可