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 属性


@Componentpublic 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 种常用脱敏策略例如:中文名、银行卡账号、手机号码、固话号码、邮寄地址、电子邮箱、身份证号码、密码、车牌号 脱敏策略,也可以自定义策略如下:


@Configurationpublic class SensitiveStrategyConfig {
/** * 注入脱敏策略 */ @Bean public ISensitiveStrategy sensitiveStrategy() { // 自定义 testStrategy 类型脱敏处理 return new SensitiveStrategy().addStrategy("testStrategy", t -> t + "***test***"); }}


自定义脱敏策略 testStrategy 添加到默认策略中注入 Spring 容器即可。



  • DDL 数据结构自动维护

解决升级表结构初始化,版本发布更新 SQL 维护问题。

@Componentpublic class PostgresDdl implements IDdl {
/** * 执行 SQL 脚本方式 */ @Override 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');"));


这样就完了吗??当然没有,它还指出多数据源执行!!

@Componentpublic 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 层通过注解随心所欲的指哪打哪!!

@Mapper@Sharding("mysql")public interface UserMapper extends BaseMapper<User> {
@Sharding("postgres")    Long selectByUsername(String username);}

你也可以自定义策略统一调兵遣将

@Componentpublic class MyShardingStrategy extends RandomShardingStrategy {
/** * 决定切换数据源 key {@link ShardingDatasource} * * @param group 动态数据库组 * @param invocation {@link Invocation} * @param sqlCommandType {@link SqlCommandType} */ @Override 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 :数据库分库分表、动态据源、读写分离、数据库健康检查自动切换示例

浏览 51
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报