あまりに抽象的な話なので、もう少し補足します。
例えば、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で解決されます:
- 詳しくは別の記事で取り上げています。
- 多言語対応については、別の記事で詳しく説明しています。
- ネーミングスタイル、キャメル、ケース
- 主にテーブル名の設定に使用
- これをfalseに設定すると、余分な15 attrがsqlで使用されなくなります。
- 属性に使うと特に汎用性が高いのですが、テストしてみたところうまくいかないようなので、後日追記を続けます
- jdbcTypeもテストされていません。
- 属性の設定には、"ASC "と "DES "の2つのオプションがあります。
- UUID"、"JDBC"、"SEQUENCE"、"IDENTITY "の4種類があります。
- idを設定する行での動作
もうひとつ特筆すべきは whereAllIfColumns() メソッドです。
渡されたパラメータに基づき、ワイルドカードやファジーなクエリを、前述の条件アノテーションで制御しながら、whereステートメントをつなぎ合わせています。もし興味があれば、これら2つのクラスのコードを見てみてください。
**
1、common.baseパッケージの下で対応するマッパーを呼び出します。
2. マッパーは、プロバイダーパッケージの下にある対応するプロバイダーを指します。