04. Springboot は Mybatis-flex を統合します (2)

1 はじめに

前回の記事「Springboot による Mybatis-flex の統合 (1)」では、 Mybatis Flex と Spring Boot の事前統合と基本的な使用方法について説明しました。今日は、Mybatis Flex の他の機能の使用方法を検討します。

2. データ入力

データ充填とは、エンティティ データが挿入または更新されるときに、フィールドに対していくつかのデフォルトのデータ設定が行われることを意味します。これは非常に便利で、たとえば、エンティティが挿入されると、データ挿入時間、データ挿入ユーザー ID が設定され、マルチテナント シナリオでは現在のテナント情報が設定されます。

MyBatis-Flex は、開発者がデータを入力できるようにする 2 つの方法を提供します。

  • @Table アノテーションが付けられた onInsert および onUpdate 構成を通じて操作します。 
  • @Column アノテーションが付けられた onInsertValue および onUpdateValue 構成を通じて操作します。 

2.1. @Table の onInsert 埋め込み

エンティティ クラスに適用される @Table アノテーションは、InsertListener リスナーを受け取る onInsert fill 属性を提供します。

/**
 * 数据库表信息注解。
 *
 * @author Michael Yang
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Table {

    /**
     * 显式指定表名称。
     */
    String value();

    /**
     * 数据库的 schema(模式)。
     */
    String schema() default "";

    /**
     * 默认为 驼峰属性 转换为 下划线字段。
     */
    boolean camelToUnderline() default true;

    /**
     * 默认使用哪个数据源,若系统找不到该指定的数据源时,默认使用第一个数据源。
     */
    String dataSource() default "";

    /**
     * 监听 entity 的 insert 行为。
     */
    Class<? extends InsertListener>[] onInsert() default {};

    /**
     * 监听 entity 的 update 行为。
     */
    Class<? extends UpdateListener>[] onUpdate() default {};

    /**
     * 监听 entity 的查询数据的 set 行为,用户主动 set 不会触发。
     */
    Class<? extends SetListener>[] onSet() default {};

    /**
     * 在某些场景下,我们需要手动编写 Mapper,可以通过这个注解来关闭 APT 的 Mapper 生成。
     */
    boolean mapperGenerateEnable() default true;

}

2.1.1. 使用例

調整するには、前のコード例を使用してください。t_user テーブルにはフィールド拡張があり、このフィールドを使用して充填テストを実行します。

1) @Table アノテーションを User エンティティ クラスに追加し、OnInsert を指定してリスナーを埋めます。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(value = "t_user", onInsert = UserEntityOnInsertListener.class)
public class User implements Serializable { 
    ...
}

2) リスナー UserEntityOnInsertListener を作成します。

UserEntityOnInsertListener は、InsertListener インターフェイスを実装し、onInsert メソッドを実装します。

package org.shamee.demo.listener;

import com.mybatisflex.annotation.InsertListener;
import org.shamee.demo.entity.User;

public class UserEntityOnInsertListener implements InsertListener {

    /**
     * 重写该方法,自动填充extension字段
     * @param entity 实体类
     */
    @Override
    public void onInsert(Object entity) {
        User user = (User) entity;
        user.setExtension("我是通过@Table注解的OnInsert监听器填充内容");
    }
}

3) コントローラー層の方法。

/**
 * 新增
 * @return
 */
@GetMapping("insert")
public Boolean insert(){
    User user = User.builder().userId("zhangsan").userName("张三").atk(100).battleNum(200).build();
    userService.insert(user);
    return Boolean.TRUE;
}

4) 実行後にデータの入力を確認します。

onInsert モニタリング中に、mybatis の XML マッパーを介してデータを挿入したり、Db + Row を介してデータを挿入したりしても onInsert 動作はトリガーされず、UserMapper を介してデータを挿入した場合のみトリガーされることに注意してください。

@Table アノテーションの onUpdate 属性は onInsert と一致しており、onUpdate が更新シナリオに適用されます。

2.2. @Column の onInsertValue の埋め込み

フィールドに適用される @Column アノテーションは、フィールドのデフォルト値を設定できる onInsertValue 属性を提供します。挿入では、onInsertValue 構成の内容は、JDBC の Statement パラメーターを設定するのではなく、SQL スプライシングに直接参加します。開発者は onInsertValue の内容に注意する必要があり、そうしないと SQL エラーが発生する可能性があります。

@Table アノテーションと @Column アノテーションの塗りつぶしの違いは何ですか?

@Table アノテーションが付けられた onInsert は、主に Java アプリケーション レベルでデータを設定するために使用されます。 

@Column アノテーションが付けられた onInsertValue は、データベース レベルでデータを設定します。

2.2.1. 使用例

1) @Column アノテーションを User エンティティ クラス拡張フィールドに追加します。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(value = "t_user")
public class User implements Serializable {
    /**
     * 由于这里会直接拼接成为sql的一部分,因此这里字符串必须添加引号,不然sql执行会出错
     */
    @Column(onInsertValue = "'我是通过@Column注解的onInsertValue属性填充内容'")
    private String extension;
}

2) コントローラー層の方法。

/**
 * 新增
 * @return
 */
@GetMapping("insert")
public Boolean insert(){
    User user = User.builder().userId("zhangsan").userName("张三").atk(100).battleNum(200).build();
    userService.insert(user);
    return Boolean.TRUE;
}

3) 実行後にデータの入力を確認します。

3. データの非感作

データの非感作とは、機密の個人データを確実に保護するために、感作の解除ルールを通じて特定の機密情報を変形することを指します。顧客のセキュリティデータや商業上の機密データが含まれる場合、ID 番号、携帯電話番号、カード番号、顧客番号などの個人情報は、システム規則に違反しない範囲で実際のデータを変換して提供する必要があります。データの感度を下げる。

Mybatis Flex は @ColumnMask() アノテーションを提供し、次の組み込みの感度解除ルールを備えています。

カスタムルールもサポートしています。

3.1. 使用例

t_user テーブルの userName フィールドは、組み込みの中国語名の感度解除ルールを使用して、中国語の名前に対する感度が解除されます。

/**
 * @Table 注解自动映射实体类和表字段
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Table(value = "t_user")
public class User implements Serializable {
    ...
    
    @Column(value = "userName")
    @ColumnMask(Masks.CHINESE_NAME)
    private String userName;
    
    ...
}

インターフェイス クエリを通じて、userName フィールドの感度が解除されていることがわかります。

4. 複数のデータソース

MyBaits-Flex には、完全な機能を備えたマルチ データ ソース サポート ^ 1.0.6 が組み込まれています。サードパーティのプラグインや依存関係は必要ありません。すぐに使用できます。ドルイド、ドルイド、 hikaricp、dbcp2、および beecp.Mybatis-Flex の複数のデータ ソース構成を使用する場合は次のとおりです。

mybatis-flex:
  datasource:
    ds1:
      url: jdbc:mysql://127.0.0.1:3306/db
      username: root
      password: 123456
    ds2:
      url: jdbc:mysql://127.0.0.1:3306/db2
      username: root
      password: 123456

このうち、ds1 と ds2 はユーザー定義のデータ ソース名で、次のように使用されます。

List<Row> rows =  DataSourceKey.use("ds2", () -> Db.selectAll("t_user"));

ただし、通常は Spring Boot のマルチデータ ソース構成メソッドを直接使用します。

5. 読み書きの分離

MyBatis-Flexの読み書き分離機能は、マルチデータソース機能をベースに実装されています。読み取りと書き込みを分離する機能では、現在の環境が複数のデータベース (複数のデータ ソースとしても理解できます) である必要があります。原理は、マスター データベース (マスター) に、追加、削除、追加などのトランザクション操作を処理させることです。変更 (INSERT、DELETE、UPDATE) およびクエリ (SELECT) 操作はデータベース (スレーブ) から処理されます。

たとえば、データ ソース構成は次のようになります。

mybatis-flex:
  datasource:
    master:
      type: druid
      url: jdbc:mysql://127.0.0.1:3306/master-db
      username: root
      password: 123456
    slave1:
      type: com.your.datasource.type2
      url: jdbc:mysql://127.0.0.1:3306/slave1
      username: root
      password: 123456
    slave2:
      type: com.your.datasource.type2
      url: jdbc:mysql://127.0.0.1:3306/slave2
      username: root
      password: 123456
    other:
      type: com.your.datasource.type2
      url: jdbc:mysql://127.0.0.1:3306/other
      username: root
      password: 123456

上記の構成では、マスター、スレーブ 1、スレーブ 2、その他の合計 4 つのデータ ソースがあります。私たちの要件は、追加、削除、または変更する場合はマスター データ ソースを使用し、クエリを実行する場合は負荷分散のためにスレーブ 1 およびスレーブ 2 データ ソースをランダムかつ自動的に使用することです。

次に、シャーディング戦略のコードは次のとおりです。

public class MyStrategy implements DataSourceShardingStrategy {

    public String doSharding(String currentDataSourceKey
        , Object mapper, Method mapperMethod, Object[] methodArgs){

        // 不管 other 数据源的情况
        if ("other".equals(currentDataSourceKey)){
            return currentDataSourceKey;
        }

        // 如果 mapper 的方法属于 增删改,使用 master 数据源
        if (StringUtil.startWithAny(mapperMethod.getName(),
            "insert", "delete", "update")){
            return "master";
        }

        //其他场景,使用 slave1 或者 slave2 进行负载均衡
        return "slave*";
    }
}

6.その他の機能

さらに、SQL 監査、SQL 印刷、データ ソース暗号化、動的テーブル名などの機能が追加されています。公式 Web サイトも非常に詳細に説明されています。この記事の多くは公式 Web サイトからの抜粋であり、単に組み合わせただけです私自身の実践的なデモも含まれており、理解しやすく使いこなすのが簡単です。その他の機能については、 Quick Start-MyBatis-Flex 公式 Web サイトをご覧ください。

おすすめ

転載: blog.csdn.net/p793049488/article/details/133463275