コンテンツにスキップ

高度な機能

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暗号化プロセッサ
  • アルゴリズム

    アルゴリズム説明
    MD5_3232ビット MD5 アルゴリズム
    MD5_1616ビット MD5 アルゴリズム
    BASE6464文字で任意のバイナリデータを表現するアルゴリズム
    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 のクエリ操作を担当。プライマリのmasterはデフォルトで記述不要
    ...
    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