Mybatis 优雅的数据处理方案,不信就算了!
共 4887字,需浏览 10分钟
·
2021-07-30 23:00
mybatis-plus 企业版 mybats-mate 强悍来袭!支持分库分表,字段加密,字典回写,表结构自动生成 SQL 维护 等。
mybatis-plus 企业版 mybats-mate 发布 1.0.1
该模块为了解决企业级数据敏捷优雅处理而设计,采用注解及各种设计模式,简化复杂的数据处理逻辑,在框架层面处理封装屏蔽,解脱开发者。
当前版本主要功能:
字典绑定
字段加密
数据脱敏
表结构动态维护
多数据源分库分表
未来计划:
数据审计记录
优雅的多表处理方案
更加强大的可视化代码生成器模块
其它(留言告诉我!)
字典绑定
@FieldDict(type = "user_sex", target = "sexText")
private Integer sex;
private String sexText;
例如 user_sex 类型 sex 字典结果映射到 sexText 属性
@Component
public class DataDict implements IDataDict {
/**
* 从数据库或缓存中获取
*/
private Map<String, String> SEX_MAP = new ConcurrentHashMap<String, String>() {{
put("0", "女");
put("1", "男");
}};
@Override
public String getNameByCode(FieldDict fieldDict, String code) {
System.err.println("字段类型:" + fieldDict.type() + ",编码:" + code);
return SEX_MAP.get(code);
}
}
实现 IDataDict 接口提供字典数据源,注入到 Spring 容器即可。
字段加密
@FieldEncrypt(algorithm = Algorithm.PBEWithMD5AndDES)
private String password;
属性 @FieldEncrypt 注解即可加密存储,会自动解密查询结果,支持全局配置加密密钥算法,及注解密钥算法,可以实现 IEncryptor 注入自定义算法。
数据脱敏
@FieldSensitive(type = "testStrategy")
private String username;
@FieldSensitive(type = SensitiveType.mobile)
private String mobile;
属性 @FieldSensitive 注解即可自动按照预设策略对源数据进行脱敏处理,默认 SensitiveType 内置 9 种常用脱敏策略例如:中文名、银行卡账号、手机号码、固话号码、邮寄地址、电子邮箱、身份证号码、密码、车牌号 脱敏策略,也可以自定义策略如下:
@Configuration
public class SensitiveStrategyConfig {
/**
* 注入脱敏策略
*/
@Bean
public ISensitiveStrategy sensitiveStrategy() {
// 自定义 testStrategy 类型脱敏处理
return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***");
}
}
自定义脱敏策略 testStrategy 添加到默认策略中注入 Spring 容器即可。
DDL 数据结构自动维护
解决升级表结构初始化,版本发布更新 SQL 维护问题。
public class PostgresDdl implements IDdl {
/**
* 执行 SQL 脚本方式
*/
public List<String> getSqlFiles() {
return Arrays.asList(
// 内置包方式
"db/tag-schema.sql",
// 文件绝对路径方式
"D:\\db\\tag-data.sql"
);
}
}
目前支持 MySql 、PostgreSQL 其它库需要支持可以留言!!
不仅仅可以固定执行,也可以动态执行!!
ddlScript.run(new StringReader("DELETE FROM user;\n" +
"INSERT INTO user (id, username, password, sex, email) VALUES\n" +
"(20, 'Duo', '123456', 0, 'Duo@baomidou.com');"));
这样就完了吗??当然没有,它还指出多数据源执行!!
@Component
public class MysqlDdl implements IDdl {
@Override
public void sharding(Consumer<IDdl> consumer) {
// 多数据源指定,主库初始化从库自动同步
String group = "mysql";
ShardingGroupProperty sgp = ShardingKey.getDbGroupProperty(group);
if (null != sgp) {
// 主库
sgp.getMasterKeys().forEach(key -> {
ShardingKey.change(group + key);
consumer.accept(this);
});
// 从库
sgp.getSlaveKeys().forEach(key -> {
ShardingKey.change(group + key);
consumer.accept(this);
});
}
}
/**
* 执行 SQL 脚本方式
*/
@Override
public List<String> getSqlFiles() {
return Arrays.asList(
"db/user-mysql.sql"
// ,"db/user-data.sql"
);
}
}
动态多数据源主从自由切换
这个 sharding 支持一句话就是数据源不限制随意使用切换,你可以在 mapper 层通过注解随心所欲的指哪打哪!!
public interface UserMapper extends BaseMapper<User> {
Long selectByUsername(String username);
}
你也可以自定义策略统一调兵遣将
public class MyShardingStrategy extends RandomShardingStrategy {
/**
* 决定切换数据源 key {@link ShardingDatasource}
*
* @param group 动态数据库组
* @param invocation {@link Invocation}
* @param sqlCommandType {@link SqlCommandType}
*/
public void determineDatasourceKey(String group, Invocation invocation, SqlCommandType sqlCommandType) {
// 数据源组 group 自定义选择即可, keys 为数据源组内主从多节点,可随机选择或者自己控制
this.changeDatabaseKey(group, sqlCommandType, keys -> chooseKey(keys, invocation));
}
}
可以开启主从策略,当然也是可以开启健康检查!!更多特性支持等你来用,需要什么告诉我,你说我来写。
源码示例: https://gitee.com/baomidou/mybatis-mate-examples
Spring Boot 引入自动依赖注解包
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-mate-starter</artifactId>
<version>1.0.1</version>
</dependency>
注解(实体分包使用)
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-mate-annotation</artifactId>
<version>1.0.1</version>
</dependency>
mybatis-mate-ddl-mysql :表结构自动维护 Mysql 示例
mybatis-mate-ddl-postgres :表结构自动维护 PostgreSQL 示例
mybatis-mate-dict :字段数据字典自动映射示例
mybatis-mate-encrypt :字段加密解密示例
mybatis-mate-sensitive-jackson :字段脱敏 jackson 实现示例
mybatis-mate-sharding :数据库分库分表、动态据源、读写分离、数据库健康检查自动切换示例