MybatisPlus(二)

目录

扩展功能

代码生成

静态工具

逻辑删除

枚举处理器

JSON处理器

配置加密

插件功能

插件功能

分页插件(通用分页实体)


扩展功能

代码生成

静态工具

逻辑删除

逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据。思路如下:

在表中添加一个字段标记数据是否被删除
当删除数据时把标记置为 1
查询时只查询标记为 0 的数据

例如逻辑删除字段为deleted

删除操作:
UPDATE user SET deleted = 1 WHERE id = 1 AND deleted = 0
查询操作:
SELECT * FROM user WHERE deleted = 0

MybatisPlus提供了逻辑删除功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。我们要做的就是在application.yaml文件中配置逻辑删除的字段名称和值即可:

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: flag # 全局逻辑删除的实体字段名,字段类型可以是boolean、integer
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

逻辑删除本身也有自己的问题,比如:

会导致数据库表垃圾数据越来越多,影响查询效率
SQL 中全都需要对逻辑删除字段做判断,影响查询效率

因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。

枚举处理器

application.yml中配置全局枚举处理器:

mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

如何实现PO类中的枚举类型变量与数据库字段的转换?

给枚举中的与数据库对应 value 值添加 @EnumValue 注解
@Getter
public enum UserStatus {
    NORMAL(1, "正常"),
    FROZEN(2, "冻结");

    @EnumValue
    private final int value;
    @JsonValue
    private final String desc;

    UserStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}

在配置文件中配置统一的枚举处理器,实现类型转换

JSON处理器

@Data
@TableName(value = "tb_user", autoResultMap = true)
public class User {
    @TableField(typeHandler = JacksonTypeHandler.class)
    private UserInfo info;
}

配置加密

MyBatisPlus3.3.2版本开始提供了一个基于AES算法的加密工具,帮助我们对配置中的敏感信息做加密处理。

        //生成 16 位随机 AES 密钥
        String randomKey = AES.generateRandomKey();
        System.out.println("randomKey = " + randomKey);

        //利用密钥对用户名加密
        String username = AES.encrypt("root", randomKey);
        System.out.println("username = " + username);

        //利用密钥对密码加密
        String password = AES.encrypt("1234", randomKey);
        System.out.println("password = " + password);

application.yaml文件中使用刚刚生成的秘钥,代替明文的用户名和密码

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: mpw:QWWVnk1Oal3258x5rVhaeQ== # 密文要以 mpw:开头
    password: mpw:EUFmeH3cNAzdRGdOQcabWg== # 密文要以 mpw:开头

在项目启动的时候,添加AES的秘钥,这样MyBatisPlus就可以解密数据了:

// Jar包启动参数,arguments
--mpw.key=d1104d7c3b616f0b 

单元测试时,可以通过@SpringBootTest来指定秘钥

插件功能

插件功能

MyBatisPlus基于MyBatisInterceptor实现了一个基础拦截器,并在内部保存了MyBatisPlus的内置拦截器的集合

MyBatisPlus提供的内置拦截器有下面这些:

序号

拦截器

描述

1

TenantLineInnerInterceptor

多租户插件

2

DynamicTableNameInnerInterceptor

动态表名插件

3

PaginationInnerInterceptor

分页插件

4

OptimisticLockerInnerInterceptor

乐观锁插件

5

IllegalSQLInnerInterceptor

SQL性能规范插件,检测并拦截垃圾SQL

6

BlockAttackInnerInterceptor

防止全表更新和删除的插件

分页插件(通用分页实体)

首先,要在配置类中注册MyBatisPlus的核心插件,同时添加分页插件: 

@Configuration
public class MybatisConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // 1.初始化核心插件
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 2.添加分页插件
        PaginationInnerInterceptor pageInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        pageInterceptor.setMaxLimit(1000L); // 设置分页上限
        interceptor.addInnerInterceptor(pageInterceptor);
        return interceptor;
    }
}

接着,就可以使用分页的API了:

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值