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 サイトをご覧ください。