目录
扩展功能
代码生成
静态工具
逻辑删除
逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据。思路如下:
例如逻辑删除字段为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)
逻辑删除本身也有自己的问题,比如:
因此,我不太推荐采用逻辑删除功能,如果数据不能删除,可以采用把数据迁移到其它表的办法。
枚举处理器
在application.yml中配置全局枚举处理器:
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
如何实现PO类中的枚举类型变量与数据库字段的转换?
@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;
}
配置加密
MyBatisPlus从3.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基于MyBatis的Interceptor实现了一个基础拦截器,并在内部保存了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了: