最近看 mybatis - Plus 官方发布的神器:mybatis-mate ,功能十分强大,我简单给大家说下
1.mybatis-mate能做什么?
mybatis-mate 为mybatis-plus企业级模块,支持分库分表,数据审计、数据敏感词过滤(AC 算法),字段加密,字典回写(数据绑定),数据权限,表结构自动生成 SQL 维护等
2.具体使用
Spring Boot 引入自动依赖注解包 :
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-mate-starter</artifactId>
<version>1.0.8</version>
</dependency>
-
<dependency>
-
<groupId>com.baomidou</groupId>
-
<artifactId>mybatis-mate-starter</artifactId>
-
<version>1.0.8</version>
-
</dependency>
注解(实体分包使用):
主要功能介绍
-
字段脱敏
-
数据敏感词过滤
-
字段加密解密
-
数据审计(对账)
-
数据库分库分表、动态据源、读写分离、数据库健康检查自动切换。
-
字典绑定
-
表结构动态维护
-
数据范围(数据权限)
(1)字段脱敏
注解 @FieldSensitive
即可实现数据脱敏,内置 手机号
、邮箱
、银行卡号
等 9 种常用脱敏规则
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
type | String | 是 | "" | 脱敏类型 |
@FieldEncrypt(algorithm = Algorithm.PBEWithMD5AndDES)
private String password;
(2)数据敏感词过滤
数据敏感词过滤(AC 算法)配置完处理器,框架自动处理请求的所有字符串敏感词过滤
@Configuration
public class ParamsConfig {
@Resource
private SensitiveWordsMapper sensitiveWordsMapper;
@Bean
public IParamsProcessor paramsProcessor() {
return new SensitiveWordsProcessor() {
/**
// 可以指定你需要拦截处理的请求地址,默认 /* 所有请求
@Override public Collection<String> getUrlPatterns() {
return super.getUrlPatterns();
}
*/
@Override
public List<String> loadSensitiveWords() {
// 这里的敏感词可以从数据库中读取,也可以本文方式获取,加载只会执行一次
return sensitiveWordsMapper.selectList(Wrappers.<SensitiveWords>lambdaQuery().select(SensitiveWords::getWord))
.stream().map(t -> t.getWord()).collect(Collectors.toList());
}
@Override
public String handle(String fieldName, String fieldValue, Collection<Emit> emits) {
if (CollectionUtils.isNotEmpty(emits)) {
try {
// 这里可以过滤直接删除敏感词,也可以返回错误,提示界面删除敏感词
System.err.println("发现敏感词(" + fieldName + " = " + fieldValue + ")" +
"存在敏感词:" + toJson(emits));
String fv = fieldValue;
for (Emit emit : emits) {
fv = fv.replaceAll(emit.getKeyword(), "");
}
return fv;
} catch (Exception e) {
e.printStackTrace();
}
}
return fieldValue;
}
};
}
(3)字段加密解密
注解 @FieldEncrypt
即可实现对字段的加密解密,支持 MD5_32、MD5_16、AES、RSA 等算法。
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
password | String | 否 | "" | 加密密码 |
algorithm | Algorithm | 否 | PBEWithMD5AndDES | PBE MD5 DES 混合算法 |
encryptor | Class | 否 | IEncryptor | 加密处理器 |
@FieldEncrypt
private String email;
(4)数据审计(对账)
applicationEventPublisher.publishEvent(new DataAuditEvent((t) -> {
// 异步回调
List<Change> changes = t.apply(newVersion, oldVersion);
for (Change valueChange : changes) {
ValueChange change = (ValueChange) valueChange;
System.err.println(String.format("%s不匹配,期望值 %s 实际值 %s", change.getPropertyName(), change.getLeft(), change.getRight()));
}
}));
(5)多数据源分库分表(读写分离)
-
注解 @Sharding
属性 | 类型 | 必须指定 | 默认值 | 描述 |
---|---|---|---|---|
value | String | 是 | "" | 分库组名,空使用默认主数据源 |
strategy | Class | 否 | RandomShardingStrategy | 分库&分表策略 |
-
配置
-
spring: datasource: dynamic: primary: master strict: false datasource: master: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://rm-xxxx.mysql.rds.aliyuncs.com:3306/xxx?autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8 username: xxxxxx password: xxxx! slave_1: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://rm-xxxxx.mysql.rds.aliyuncs.com:3306/xxx?autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8 username: xxxx password: xxxx!
-
数据源切换
-
/** * 查询四个软件事件详情 * @param id * @return */ @DS("slave_1") Map<String, Object> getFourInfo(@Param("id") String id);