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)
    • 脚本自动维护
  • 插件

    • 插件主体
    • 分页插件
    • 乐观锁插件
    • 多租户插件
    • 防全表更新与删除插件
    • 动态表名插件
    • 数据权限插件
    • 数据变动记录插件
    • 非法SQL拦截插件
目录

企业高级特性

👉 免费视频教程 (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)
上次更新: 2023/04/12, 10:13:13
MybatisX快速开发插件
脚本自动维护

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

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

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

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