blog

[MyBatis] SQLスプライシングプロシージャ

抽象的すぎるので、完全なポイントを追加します。 最後に、クラスをパラメータとして受け取る selectOne() メソッドで、sql 文をつなぎ合わせて返します。 エンティティ・クラスと別のデータベー...

Jul 17, 2020 · 3 min. read
シェア

あまりに抽象的な話なので、もう少し補足します。



例えば、baseSelectMapper は、より特殊な select メソッドを持つ他のマッパーを継承しています。

public interface BaseSelectMapper<T> extends SelectOneMapper<T>, SelectMapper<T>, SelectAllMapper<T>, SelectCountMapper<T>, SelectByPrimaryKeyMapper<T> {
}
public interface SelectOneMapper<T> {
 @SelectProvider(
 type = BaseSelectProvider.class,
 method = "dynamicSQL"
 )
 T selectOne(T var1);
}

SelectProvider アノテーションは、クエリの SQL 文を生成するために使用されます。 Select アノテーションとは異なり、@SelectProvide ではクラスとそのメソッドが指定され、SQL 文はクラスでこのメソッドを呼び出すことで取得されます。



最後に、クラスをパラメータとして受け取る BaseSelectProvider の selectOne() メソッドを sql 文に継ぎ合わせて返します。

public String selectOne(MappedStatement ms) {
 Class entityClass = this.getEntityClass(ms);
 boolean isMl = EntityHelper.getEntityTable(entityClass).isSupportMultiLanguage();
 this.setResultType(ms, entityClass);
 StringBuilder sql = new StringBuilder();
 if(isMl) { //フィールドが多言語かどうかを判断する
 sql.append(SqlHelper.selectAllColumns_TL(entityClass));
 sql.append(SqlHelper.fromTable_TL(entityClass, this.tableName(entityClass)));
 sql.append(SqlHelper.whereAllIfColumns_TL(entityClass, this.isNotEmpty()));
 } else {
 sql.append(SqlHelper.selectAllColumns(entityClass));
 sql.append(SqlHelper.fromTable(entityClass, this.tableName(entityClass)));
 sql.append(SqlHelper.whereAllIfColumns(entityClass, this.isNotEmpty())); //dtoパラメータがある場合、それはwhere条件として解析される。
 }
 return sql.toString();
}

エンティティ・クラスとデータベース・テーブル間の変換として使用される、別の条件アノテーションで言及されている、多言語アノテーションなどは、このクラスで解析されることに注意してください。

すべてのアノテーションはEntityHelperで解決されます:

  1. 詳しくは別の記事で取り上げています。
  2. 多言語対応については、別の記事で詳しく説明しています。
  3. ネーミングスタイル、キャメル、ケース
  4. 主にテーブル名の設定に使用
  5. これをfalseに設定すると、余分な15 attrがsqlで使用されなくなります。
  6. 属性に使うと特に汎用性が高いのですが、テストしてみたところうまくいかないようなので、後日追記を続けます
  7. jdbcTypeもテストされていません。
  8. 属性の設定には、"ASC "と "DES "の2つのオプションがあります。
  9. UUID"、"JDBC"、"SEQUENCE"、"IDENTITY "の4種類があります。
  10. idを設定する行での動作

もうひとつ特筆すべきは whereAllIfColumns() メソッドです。

渡されたパラメータに基づき、ワイルドカードやファジーなクエリを、前述の条件アノテーションで制御しながら、whereステートメントをつなぎ合わせています。もし興味があれば、これら2つのクラスのコードを見てみてください。

**



1、common.baseパッケージの下で対応するマッパーを呼び出します。



2. マッパーは、プロバイダーパッケージの下にある対応するプロバイダーを指します。







Read next

Vue2.x-ソース学習 - 仮想DOM - 考える質問

A. 仮想 DOM を使うことで、DOM を手動で操作する必要がなくなります。 B. 仮想 DOM を使用すると、手動で DOM を操作する必要がないため、開発効率が大幅に向上します。 C. 仮想DOMはアプリケーションの状態を保持し、2つの状態の違いを比較することで実DOMを更新します。 D. 仮想DOMは本質的にJavaScri...

Jul 16, 2020 · 2 min read