Mybatis 优雅的数据处理方案

该模块为了解决企业级数据敏捷优雅处理而设计,采用注解及各种设计模式,简化复杂的数据处理逻辑,在框架层面处理封装屏蔽,解脱开发者。

当前版本主要功能:

源码示例
源码示例: https://gitee.com/baomidou/mybatis-mate-examples

1 准备工作

Spring Boot 引入自动依赖注解包

<!-- 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 :数据库分库分表、动态据源、读写分离、数据库健康检查自动切换示例

2 字典绑定

@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 容器即可。

3 字段加密

@FieldEncrypt(algorithm = Algorithm.PBEWithMD5AndDES)
private String password;

属性 @FieldEncrypt 注解即可加密存储,会自动解密查询结果,支持全局配置加密密钥算法,及注解密钥算法,可以实现 IEncryptor 注入自定义算法

4 数据脱敏

@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 容器即可。

5 DDL数据结构自动维护

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

@Component
public 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');"));

还指出多数据源执行!!

@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"
        );
    }
}

6 动态多数据源主从自由切换

这个 sharding 支持一句话就是数据源不限制随意使用切换,你可以在 mapper 层通过注解随心所欲的指哪打哪!!


@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {

    @Sharding("postgres")
    Long selectByUsername(String username);
}

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

@Component
public 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));
    }
}

可以开启主从策略,当然也是可以开启健康检查

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值