MyBatis-Plus 擴展-企業(yè)高級特性

2022-03-25 14:16 更新

mybatis-mate? 為 mp 企業(yè)級模塊,旨在更敏捷優(yōu)雅處理數(shù)據(jù)。

mybatis-mate 示例 :傳送門

數(shù)據(jù)審計(對賬)

mybatis-mate-audit

  • 對比兩對象屬性差異,例如:銀行流水對賬。

// 1,異步回調(diào),注意 @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,手動調(diào)用對比
DataAuditor.compare(obj1, obj2);

數(shù)據(jù)敏感詞過濾

mybatis-mate-sensitive-words

  • 數(shù)據(jù)敏感詞過濾(AC 算法)配置完處理器,框架自動處理請求的所有字符串敏感詞過濾,支持嵌套關(guān)鍵詞讓敏感詞無處遁形。
  • 數(shù)據(jù)庫自維護敏感詞庫(免費、可控),默認(rèn)加載緩存詞根支持指定重新加載詞庫。

數(shù)據(jù)范圍(數(shù)據(jù)權(quán)限)

mybatis-mate-datascope

  • 注解 ?@DataScope?
 屬性  類型   必須指定  默認(rèn)值  描述
 ?type?  String  否  ""  范圍類型,用于區(qū)分對于業(yè)務(wù)分類,默認(rèn)空
 ?value?  DataColumn[]  否  {}  數(shù)據(jù)權(quán)限字段,支持多字段組合
 ?ignore?  boolean  否  false  忽略權(quán)限處理邏輯 true 是 false 否
  • 注解 ?@DataColumn?
 屬性  類型  必須指定  默認(rèn)值  描述
 alias  String  否  ""  關(guān)聯(lián)表別名
 name  String  是    字段名
  • 行級粒度權(quán)限控制,例如:上級部門可以查看子部門信息。
// 測試 test 類型數(shù)據(jù)權(quán)限范圍,混合分頁模式
@DataScope(type = "test", value = {
        // 關(guān)聯(lián)表 user 別名 u 指定部門字段權(quán)限
        @DataColumn(alias = "u", name = "department_id"),
        // 關(guān)聯(lián)表 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);

// 測試數(shù)據(jù)權(quán)限,最終執(zhí)行 SQL 語句
SELECT u.* FROM user u WHERE (u.department_id IN ('1', '2', '3', '5')) AND u.mobile LIKE '%1533%' LIMIT 1,10

關(guān)于IDataScopeProvider的說明

請注意必須注入 ?IDataScopeProvider實現(xiàn)類處理數(shù)據(jù)權(quán)限,關(guān)于數(shù)據(jù)傳參支持 2 種方式:

  • 自定義 ?mapper方法通過方法參數(shù)傳遞,在 ?setWhere方法 ?Object[] args 參數(shù)中獲取 
  • 利用 ?ThreadLocal傳遞參數(shù),你可以攔截 ?controller層或者 ?service層設(shè)置數(shù)據(jù)權(quán)限處理參數(shù),更多可以參考

表結(jié)構(gòu)自動維護

mybatis-mate-ddl-mysql,mybatis-mate-ddl-postgres

  • 數(shù)據(jù)庫 ?Schema初始化,升級 SQL 自動維護,區(qū)別于 ?flyway支持分表庫、可控制代碼執(zhí)行 SQL 腳本
  • 首次會在數(shù)據(jù)庫中生成 ?ddl_history表,每次執(zhí)行SQL腳本會自動維護版本信息。
@Component
public class MysqlDdl implements IDdl {

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

// 切換到 mysql 從庫,執(zhí)行 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');"));

字段數(shù)據(jù)綁定(字典回寫)

mybatis-mate-dict

  • 注解 ?@FieldBind?
 屬性  類型  必須指定  默認(rèn)值  描述
 ?sharding?  String  否  ""  分庫分表數(shù)據(jù)源指定
 ?type?  String  是    類型(用于區(qū)分不同業(yè)務(wù))
 ?target?  String  是    目標(biāo)顯示屬性(待綁定屬性,注意非數(shù)據(jù)庫字段請排除)
  • 數(shù)據(jù)庫 sex 值 0、1 自動映射為 男、女
  • 可以綁定映射為對象,例如:根據(jù)訂單 ID 映射 訂單對象或者編號
@FieldBind(type = "user_sex", target = "sexText")
private Integer sex;
// 綁定顯示屬性,非表字典(排除)
@TableField(exist = false)
private String sexText;

  • 綁定業(yè)務(wù)處理類需要實現(xiàn) ?IDataBind接口,注入 spring 容器
@Component
public class DataBind implements IDataBind {
  ...
}

虛擬屬性綁定

mybatis-mate-jsonbind

  • 注解 ?@JsonBind?
@JsonBind("綁定類型")
public class User {
    ...
}
  • 返回 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) {
            {
                // 注入虛擬節(jié)點
                put(Type.departmentRole, (obj) -> new HashMap(2) {{
                    User user = (User) obj;
                    // 枚舉類型轉(zhuǎn)換
                    put("statusText", StatusEnum.get(user.getStatus()).getDesc());
                    // 可調(diào)用數(shù)據(jù)庫查詢角色信息
                    put("roleName", "經(jīng)理");
                }});
            }
        };
    }
}

字段加密解密

mybatis-mate-encrypt

  • 注解 ?@FieldEncrypt?
 屬性  類型  必須指定  默認(rèn)值  描述
 ?password?  String  否  ""  加密密碼
 ?algorithm?  Algorithm  否  PBEWithMD5AndDES  PBE MD5 DES 混合算法
 ?encryptor?  Class  否  IEncryptor  加密處理器
  • 算法 ?Algorithm?
 算法  描述
 ?MD5_32?  32 位 md5 算法
 ?MD5_16?  16 位 md5 算法
 ?BASE64?  64 個字符來表示任意二進制數(shù)據(jù)算法
 ?AES?  AES 對稱算法
 ?RSA?  非對稱加密算法
 ?SM2?  國密 SM2 非對稱加密算法,基于 ECC
 ?SM3?  國密 SM3 消息摘要算法,可以用 MD5 作為對比理解
 ?SM4?  國密 SM4 對稱加密算法,無線局域網(wǎng)標(biāo)準(zhǔn)的分組數(shù)據(jù)算法
 ?PBEWithMD5AndDES?  混合算法
 ?PBEWithMD5AndTripleDES?  混合算法
 ?PBEWithHMACSHA512AndAES_256?  混合算法
 ?PBEWithSHA1AndDESede?  混合算法
 ?PBEWithSHA1AndRC2_40?  混合算法

注意

?MD5算法為不可逆算法,存儲數(shù)據(jù)庫及查詢結(jié)果都是密文 ?SM4算法必須依賴 ?bouncycastle加密庫 混合算法必須依賴 ?jasypt加密庫 【注意】查詢返回加密對象必須包含加密注解信息,單純的返回某個 ?String或者 ?List某個集合是無法解密的。

  • 注解 ?FieldEncrypt實現(xiàn)數(shù)據(jù)加解密,支持多種加密算法
@FieldEncrypt
private String email;

字段脫敏

mybatis-mate-sensitive-jackson

  • 注解 ?@FieldSensitive ?
  • 注解 ?FieldSensitive實現(xiàn)數(shù)據(jù)脫敏,內(nèi)置 手機號、郵箱、銀行卡號 等 9 種常用脫敏規(guī)則
@FieldSensitive("testStrategy")
private String username;

@Configuration
public class SensitiveStrategyConfig {

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

// 跳過脫密處理,用于編輯場景
RequestDataTransfer.skipSensitive();

多數(shù)據(jù)源分庫分表(讀寫分離)

mybatis-mate-sharding

  • 注解 ?@Sharding?
 屬性  類型  必須指定  默認(rèn)值  描述
 value  String  是   ""  分庫組名,空使用默認(rèn)主數(shù)據(jù)源
 strategy  Class  否  RandomShardingStrategy  分庫&分表策略

  • 配置

mybatis-mate:
  sharding:
    health: true # 健康檢測
    primary: mysql # 默認(rèn)選擇數(shù)據(jù)源
    datasource:
      mysql: # 數(shù)據(jù)庫組
        - key: node1
          ...
        - key: node2
          cluster: slave # 從庫讀寫分離時候負(fù)責(zé) sql 查詢操作,主庫 master 默認(rèn)可以不寫
          ...
      postgres:
        - key: node1 # 數(shù)據(jù)節(jié)點
          ...

  • 注解 ?Sharding切換數(shù)據(jù)源,組內(nèi)節(jié)點默認(rèn)隨機選擇(查從寫主)

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

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

}

  • 切換指定數(shù)據(jù)庫節(jié)點

// 切換到 mysql 從庫 node2 節(jié)點
ShardingKey.change("mysqlnode2");

多數(shù)據(jù)源動態(tài)加載卸載

mybatis-mate-sharding-dynamic

多數(shù)據(jù)源事務(wù)( jta atomikos)

mybatis-mate-sharding-jta-atomikos


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號