MyBatis-Plus MyBatis-Plus
首页
  • 快速入门
  • 核心功能
  • 扩展
  • 插件
  • 使用配置
  • 代码生成器配置新
  • 代码生成器配置旧
生态
问答
💖支持
  • 数据处理模块
  • 单体开发平台
  • 微服务开发平台
  • 插件式一体化开发平台
更新日志 (opens new window)
GitHub (opens new window)
首页
  • 快速入门
  • 核心功能
  • 扩展
  • 插件
  • 使用配置
  • 代码生成器配置新
  • 代码生成器配置旧
生态
问答
💖支持
  • 数据处理模块
  • 单体开发平台
  • 微服务开发平台
  • 插件式一体化开发平台
更新日志 (opens new window)
GitHub (opens new window)
  • 快速入门

    • 简介
    • 快速开始
    • 安装
    • 配置
    • 注解
    • 快速测试
  • 核心功能

    • 代码生成器(新)
    • 代码生成器(旧)
    • CRUD 接口
    • 条件构造器
    • 主键策略
    • 自定义ID生成器
  • 扩展

    • 逻辑删除
    • 通用枚举
    • 字段类型处理器
    • 自动填充功能
    • SQL注入器
    • 执行SQL分析打印
    • 数据安全保护
    • 多数据源
    • MybatisX快速开发插件
    • 企业高级特性
      • 数据审计(对账)
      • 数据敏感词过滤
      • 数据范围(数据权限)
      • 表结构自动维护
      • 字段数据绑定(字典回写)
      • 虚拟属性绑定
      • 字段加密解密
      • 字段脱敏
      • 多数据源分库分表(读写分离)
      • 多数据源动态加载卸载
      • 多数据源事务( jta atomikos)
    • 脚本自动维护
  • 插件

    • 插件主体
    • 分页插件
    • 乐观锁插件
    • 多租户插件
    • 防全表更新与删除插件
    • 动态表名插件
目录

企业高级特性

👉 免费视频教程 (opens new window)

提示

mybatis-mate 为 mp 企业级模块,旨在更敏捷优雅处理数据。

  • mybatis-mate 示例 :传送门 (opens new window)

  • 联系作者确认后微信公众号发文介绍 mybatis-mate 的软文,可免费获得永久个人授权证书

  • 该模块属于 mybatis (MP) 的扩展库,非 mp 的收费版本,任何问题由 青苗 个人负责。

👉 免费视频教程 (opens new window)

# 数据审计(对账)

👉 mybatis-mate-audit (opens new window)

  • 对比两对象属性差异,例如:银行流水对账。

// 1,异步回调,注意 @EnableAsync 开启异步
 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()));
    }
}));

// 2,手动调用对比
DataAuditor.compare(obj1, obj2);
1
2
3
4
5
6
7
8
9
10
11
12

# 数据敏感词过滤

👉 mybatis-mate-sensitive-words (opens new window)

  • 数据敏感词过滤(AC 算法)配置完处理器,框架自动处理请求的所有字符串敏感词过滤,支持嵌套关键词让敏感词无处遁形。
  • 数据库自维护敏感词库(免费、可控),默认加载缓存词根支持指定重新加载词库。

# 数据范围(数据权限)

👉 mybatis-mate-datascope (opens new window)

  • 注解 @DataScope
属性 类型 必须指定 默认值 描述
type String 否 "" 范围类型,用于区分对于业务分类,默认空
value DataColumn[] 否 {} 数据权限字段,支持多字段组合
ignore boolean 否 false 忽略权限处理逻辑 true 是 false 否
  • 注解 @DataColumn
属性 类型 必须指定 默认值 描述
alias String 否 "" 关联表别名
name String 是 字段名
  • 行级粒度权限控制,例如:上级部门可以查看子部门信息。
// 测试 test 类型数据权限范围,混合分页模式
@DataScope(type = "test", value = {
        // 关联表 user 别名 u 指定部门字段权限
        @DataColumn(alias = "u", name = "department_id"),
        // 关联表 user 别名 u 指定手机号字段(自己判断处理)
        @DataColumn(alias = "u", name = "mobile")
})
@Select("select u.* from user u")
List<User> selectTestList(IPage<User> page, Long id, @Param("name") String username);

// 测试数据权限,最终执行 SQL 语句
SELECT u.* FROM user u WHERE (u.department_id IN ('1', '2', '3', '5')) AND u.mobile LIKE '%1533%' LIMIT 1,10
1
2
3
4
5
6
7
8
9
10
11
12

关于`IDataScopeProvider`的说明:

请注意必须注入 IDataScopeProvider 实现类处理数据权限,关于数据传参支持 2 种方式: 1,自定义 mapper 方法通过方法参数传递,在 setWhere 方法 Object[] args 参数中获取 2,利用 ThreadLocal 传递参数,你可以拦截 controller 层或者 service 层设置数据权限处理参数,更多可以 👉参考 (opens new window)

# 表结构自动维护

👉 mybatis-mate-ddl-mysql (opens new window) 👉 mybatis-mate-ddl-postgres (opens new window)

  • 数据库 Schema 初始化,升级 SQL 自动维护,区别于 flyway 支持分表库、可控制代码执行 SQL 脚本
  • 首次会在数据库中生成 ddl_history 表,每次执行SQL脚本会自动维护版本信息。
@Component
public class MysqlDdl implements IDdl {

    /**
     * 执行 SQL 脚本方式
     */
    @Override
    public List<String> getSqlFiles() {
        return Arrays.asList(
                "db/tag-schema.sql",
                "D:\\db\\tag-data.sql"
        );
    }
}

// 切换到 mysql 从库,执行 SQL 脚本
ShardingKey.change("mysqlt2");
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');"));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 字段数据绑定(字典回写)

👉 mybatis-mate-dict (opens new window)

  • 注解 @FieldBind
属性 类型 必须指定 默认值 描述
sharding String 否 "" 分库分表数据源指定
type String 是 类型(用于区分不同业务)
target String 是 目标显示属性(待绑定属性,注意非数据库字段请排除)
  • 数据库 sex 值 0、1 自动映射为 男、女
  • 可以绑定映射为对象,例如:根据订单 ID 映射 订单对象或者编号
@FieldBind(type = "user_sex", target = "sexText")
private Integer sex;
// 绑定显示属性,非表字典(排除)
@TableField(exist = false)
private String sexText;

1
2
3
4
5
6
  • 绑定业务处理类需要实现 IDataBind 接口,注入 spring 容器
@Component
public class DataBind implements IDataBind {
  ...
}
1
2
3
4

# 虚拟属性绑定

👉 mybatis-mate-jsonbind (opens new window)

  • 注解 @JsonBind
@JsonBind("绑定类型")
public class User {
    ...
}
1
2
3
4
  • 返回 Json 虚拟属性绑定策略
@Component
public class JsonBindStrategy implements IJsonBindStrategy {

    @Override
    public Map<String, Function<Object, Map<String, Object>>> getStrategyFunctionMap() {
        return new HashMap<String, Function<Object, Map<String, Object>>>(16) {
            {
                // 注入虚拟节点
                put(Type.departmentRole, (obj) -> new HashMap(2) {{
                    User user = (User) obj;
                    // 枚举类型转换
                    put("statusText", StatusEnum.get(user.getStatus()).getDesc());
                    // 可调用数据库查询角色信息
                    put("roleName", "经理");
                }});
            }
        };
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 字段加密解密

👉 mybatis-mate-encrypt (opens new window)

  • 注解 @FieldEncrypt
属性 类型 必须指定 默认值 描述
password String 否 "" 加密密码
algorithm Algorithm 否 PBEWithMD5AndDES PBE MD5 DES 混合算法
encryptor Class 否 IEncryptor 加密处理器
  • 算法 Algorithm
算法 描述
MD5_32 32 位 md5 算法
MD5_16 16 位 md5 算法
BASE64 64 个字符来表示任意二进制数据算法
AES AES 对称算法
RSA 非对称加密算法
SM2 国密 SM2 非对称加密算法,基于 ECC
SM3 国密 SM3 消息摘要算法,可以用 MD5 作为对比理解
SM4 国密 SM4 对称加密算法,无线局域网标准的分组数据算法
PBEWithMD5AndDES 混合算法
PBEWithMD5AndTripleDES 混合算法
PBEWithHMACSHA512AndAES_256 混合算法
PBEWithSHA1AndDESede 混合算法
PBEWithSHA1AndRC2_40 混合算法

👉 国密 SM2.3.4 算法使用规范 (opens new window)

注意

MD5 算法为不可逆算法,存储数据库及查询结果都是密文 SM4 算法必须依赖 bouncycastle 加密库 混合算法必须依赖 jasypt 加密库 【注意】查询返回加密对象必须包含加密注解信息,单纯的返回某个 String 或者 List 某个集合是无法解密的。

  • 注解 FieldEncrypt 实现数据加解密,支持多种加密算法
@FieldEncrypt
private String email;

1
2
3

# 字段脱敏

👉 mybatis-mate-sensitive-jackson (opens new window)

  • 注解 @FieldSensitive

  • 注解 FieldSensitive 实现数据脱敏,内置 手机号、邮箱、银行卡号 等 9 种常用脱敏规则

@FieldSensitive("testStrategy")
private String username;

@Configuration
public class SensitiveStrategyConfig {

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

// 跳过脱密处理,用于编辑场景
RequestDataTransfer.skipSensitive();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 多数据源分库分表(读写分离)

👉 mybatis-mate-sharding (opens new window)

  • 注解 @Sharding
属性 类型 必须指定 默认值 描述
value String 是 "" 分库组名,空使用默认主数据源
strategy Class 否 RandomShardingStrategy 分库&分表策略
  • 配置
mybatis-mate:
  sharding:
    health: true # 健康检测
    primary: mysql # 默认选择数据源
    datasource:
      mysql: # 数据库组
        - key: node1
          ...
        - key: node2
          cluster: slave # 从库读写分离时候负责 sql 查询操作,主库 master 默认可以不写
          ...
      postgres:
        - key: node1 # 数据节点
          ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • 注解 Sharding 切换数据源,组内节点默认随机选择(查从写主)
@Mapper
@Sharding("mysql")
public interface UserMapper extends BaseMapper<User> {

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

}
1
2
3
4
5
6
7
8
  • 切换指定数据库节点
// 切换到 mysql 从库 node2 节点
ShardingKey.change("mysqlnode2");
1
2

# 多数据源动态加载卸载

👉 mybatis-mate-sharding-dynamic (opens new window)

# 多数据源事务( jta atomikos)

👉 mybatis-mate-sharding-jta-atomikos (opens new window)

帮助我们改善此页面! (opens new window)
上次更新: 2022/12/25, 11:30:06
MybatisX快速开发插件
脚本自动维护

← MybatisX快速开发插件 脚本自动维护→

Theme by Vdoing | Copyright © 2016-2023 Team Baomidou | Sponsored by JetBrains | 渝ICP备2021000141号-1

友情链接:AiZuDa | D.Yang | NanCheung | apidocsBlog

  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×