コンテンツにスキップ

高度な機能

Mybatis-Mate は MyBatis-Plus 向けのエンタープライズ級モジュールであり、データ処理をより迅速かつエレガントに行うことを目的としています。

  • 使用例 :サンプルコード
  • 作者に連絡確認後、公式 WeChat アカウントで Mybatis-Mate を紹介する記事を掲載すると、無料で永久個人ライセンス証明書を取得できます。
  • このモジュールは MyBatis-Plus の拡張ライブラリであり、MyBatis-Plus の有料版ではありません。問題が発生した場合は 青苗 が個人として責任を負います。

データ監査(照合)

  • 使用例:👉 mybatis-mate-audit
  • 2つのオブジェクトのプロパティ差異を比較します。例:銀行取引明細の照合。
    // 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);

データ機密語フィルタリング

  • 使用例👉 mybatis-mate-sensitive-words
  • データ機密語フィルタリング(ACアルゴリズム)は、ハンドラの設定が完了すると、フレームワークが自動的にすべてのリクエスト文字列の機密語フィルタリングを処理します。ネストされたキーワードをサポートし、機密語を見逃しません。
  • データベース自体で機密語辞書をメンテナンス(無料、管理可能)します。デフォルトでキャッシュされた語根をロードし、辞書の再ロードを指定することができます。

データ範囲(データ権限)

  • 使用例:mybatis-mate-datascope
  • アノテーション @DataScope
    属性必須指定デフォルト値説明
    typeString""範囲タイプ、業務分類を区別するために使用、デフォルトは空
    valueDataColumn[]データ権限フィールド、複数フィールドの組み合わせをサポート
    ignorebooleanfalse権限処理ロジックを無視する true は無効化 false は有効化
  • アノテーション @DataColumn
    属性必須指定デフォルト値説明
    aliasString""関連テーブルのエイリアス
    nameStringフィールド名
  • 行レベル粒度の権限制御。例:上位部門は子部門の情報を閲覧可能。
    // 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

テーブル構造の自動メンテナンス

  • 使用例:
  • データベース 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');"));

フィールドデータバインディング(辞書書き戻し)

  • 使用例:👉 mybatis-mate-dict
  • アノテーション @FieldBind
    属性必須指定デフォルト値説明
    shardingString""シャーディングデータソース指定
    typeStringタイプ(異なる業務を区別するために使用)
    targetStringターゲット表示属性(バインド対象属性、データベースフィールドでない場合は除外してください)
  • データベース sex の値 01 を自動的に にマッピングします
  • オブジェクトへのマッピングとしてバインドできます。例:注文 ID に基づいて注文オブジェクトまたは番号にマッピング
    @FieldBind(type = "user_sex", target = "sexText")
    private Integer sex;
    // バインド表示属性、テーブル辞書ではありません(除外)
    @TableField(exist = false)
    private String sexText;
  • バインド業務処理クラスは 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) {
    {
    // 仮想ノードを注入
    put(Type.departmentRole, (obj) -> new HashMap(2) {{
    User user = (User) obj;
    // 列挙型変換
    put("statusText", StatusEnum.get(user.getStatus()).getDesc());
    // データベースクエリを呼び出して役割情報を取得可能
    put("roleName", "マネージャー");
    }});
    }
    };
    }
    }

フィールド暗号化・復号

  • 使用例:👉 mybatis-mate-encrypt

  • アノテーション @FieldEncrypt

    属性必須指定既定値説明
    passwordString""暗号化パスワード
    algorithmAlgorithmPBEWithMD5AndDESPBE MD5 DES 混合アルゴリズム
    encryptorClassIEncryptor暗号化プロセッサ
  • アルゴリズム Algorithm

    アルゴリズム説明
    MD5_3232 ビット MD5 アルゴリズム
    MD5_1616 ビット MD5 アルゴリズム
    BASE64任意のバイナリデータを表す64文字のアルゴリズム
    AESAES 対称アルゴリズム 【あいまい検索が必要な場合は必ずこのアルゴリズムを使用してください】
    RSA非対称暗号アルゴリズム
    SM2国密 SM2 非対称暗号アルゴリズム、ECC ベース
    SM3国密 SM3 メッセージダイジェストアルゴリズム、MD5 と比較して理解できます
    SM4国密 SM4 対称暗号アルゴリズム、無線 LAN 標準のブロックデータアルゴリズム
    PBEWithMD5AndDES混合アルゴリズム
    PBEWithMD5AndTripleDES混合アルゴリズム
    PBEWithHMACSHA512AndAES_256混合アルゴリズム
    PBEWithSHA1AndDESede混合アルゴリズム
    PBEWithSHA1AndRC2_40混合アルゴリズム
  • 👉 国密 SM2.3.4 アルゴリズム使用規範

  • アノテーション FieldEncrypt はデータの暗号化と復号を実装し、様々な暗号化アルゴリズムをサポートします

    @FieldEncrypt
    private String email;

フィールドマスキング

  • 使用例:👉 mybatis-mate-sensitive-jackson
  • アノテーション @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();

多データソース・シャーディング(読み書き分離)

  • 使用例:👉 mybatis-mate-sharding
  • アノテーション @Sharding
    属性必須指定デフォルト値説明
    valueString""シャーディンググループ名、空の場合はデフォルトのプライマリデータソースを使用
    strategyClassRandomShardingStrategyシャーディング(データベース&テーブル)戦略
  • 設定
    mybatis-mate:
    sharding:
    health: true # ヘルスチェック
    primary: mysql # デフォルト選択データソース
    datasource:
    mysql: # データベースグループ
    - key: node1
    ...
    - key: node2
    cluster: slave # 読み書き分離時にSQLクエリ操作を担当するスレーブデータベース、マスターデータベースはデフォルトで記述不要
    ...
    postgres:
    - key: node1 # データノード
    ...
  • アノテーション Sharding によるデータソース切り替え、グループ内ノードはデフォルトでランダム選択(読み取りはスレーブ、書き込みはマスター)
    @Mapper
    @Sharding("mysql")
    public interface UserMapper extends BaseMapper<User> {
    @Sharding("postgres")
    Long selectByUsername(String username);
    }
  • 指定したデータベースノードへの切り替え
    // mysql スレーブデータベース node2 ノードに切り替え
    ShardingKey.change("mysqlnode2");

複数データソースの動的ロード/アンロード

多データソーストランザクション(JTA Atomikos)

Baomidou

© 2016-2025 Baomidou™. All Rights Reserved.

Power by Astro Starlight | Sponsored by JetBrains

渝ICP备2021000141号-1 | 渝公网安备50011302222097