SQLプロセッサ

SQLテンプレートで組み立てられたSQLをアプリケーションで扱うには、 @SqlProcessor をDaoのメソッドに注釈します。

@Config(config = AppConfig.class)
public interface EmployeeDao {
    @SqlProcessor
    <R> R process(Integer id, BiFunction<Config, PreparedSql, R> handler);
    ...
}

メソッドに対応する SQL が必須です。

警告

SQLプロセッサを使ってSQLを組み立て実行する場合、潜在的には常にSQLインジェクションのリスクがあります。 まずは、他のクエリもしくはクエリビルダを使う方法を検討してください。 また、SQLプロセッサでは信頼できない値をSQLの組み立てに使わないように注意してください。

戻り値

メソッドの戻り値は任意の型にできます。 ただし、 BiFunction 型のパラメータの3番目の型パラメータと合わせる必要があります。

なお、戻り値の型を void にする場合、 BiFunction 型のパラメータの3番目の型パラメータには Void を指定します。

@SqlProcessor
void process(Integer id, BiFunction<Config, PreparedSql, Void> handler);

パラメータ

BiFunction 型のパラメータを1つのみ含める必要があります。 BiFunction 型のパラメータはSQLテンプレート処理後のSQLを処理するために使われます。

その他のパラメータはSQLテンプレートで参照できます。 基本的には、 検索 の問い合わせ条件に指定できるのと同じ型を使用できます。

利用例

例えば、SQLテンプレートで処理したSQLをさらに変形し直接実行することができます。(この例では例外処理を省略しています。)

EmployeeDao dao = ...
dao.process(1, (config, preparedSql) -> {
  String sql = preparedSql.getRawSql();
  String anotherSql = createAnotherSql(sql);
  DataSource dataSource = config.getDataSource()
  Connection connection = dataSource.getConnection();
  PreparedStatement statement = connection.prepareStatement(anotherSql);
  return statement.execute();
});
select * from employee where id = /*^ id */0