基本的な使い方

1. SQLテンプレートの定義

SQLテンプレートをファイルに定義します。

  • SQLにバインドするパラメータを /*パラメータ名*/ の形式で指定します。
  • バインドパラメータは、最終的にはプレースホルダー ? に置換された出力されます。
select * from employee
/*BEGIN*/
where
/*IF salaryMin != null*/
salary >= /*salaryMin*/1000
/*END*/
/*IF salaryMax != null*/
and salary <= /*salaryMax*/2000
/*END*/
/*END*/

詳細は、「2Way-SQLとは 」を参照してください。

2. SQLテンプレートのパース

SqlTemplateEngine のインスタンスを作成します。

SqlTemplateEngine templateEngine = new SqlTemplateEngine();

SqlTemplateEngine#getTemplate(...) を使い、SQLテンプレートをパースします。

SpringFrameworkの ResourceLoader を使用しているため接頭語を付けることで様々なリソースにアクセスできます。

  • classpath: - クラスパス上から読み込みます。例) classpath:/sql/hoge.sql
  • file: - システムファイルから読み込みます。例)file:c:/sql/hoge.sql
  • http: - ネットワーク上のURLから読み込みます。例)http://hoge.com/sql/hoge.sql
  • なし - クラスパス上から読み込みます。例) /sql/hoge.sql
SqlTemplate template = templateEngine.getTemplate("classpath:/sql/employee_select.sql");

3. パラメータの指定

パラメータは、JavaBeanの形式とMapの形式で指定することができます。

3.1. JavaBeanによるパラメータの指定

JavaBeanで指定するときには、プロパティ名をSQLテンプレート中で定義したバインドパラメータ名と一致させる必要があります。

また、フィールドが public であれば、getter/setter のアクセッサメソッドは省略できます。

EL式の実装の1つである SpEL を使用して参照するため、ネストした形式でも定義可能です。

// パラメータ用JavaBeanの定義
public class SelectParam {
    public BigDecimal salaryMin;
    public BigDecimal salaryMax;
}

// JavaBeanのインスタンスの作成
SelectParam bean = new SelectParam();
bean.salaryMin = new BigDecimal(1200);
bean.salaryMax = new BigDecimal(1800);

SQLテンプレートを評価する際の引数 SqlTemplateContext の実装の1つである BeanPropertySqlTemplateContext を使用します。

SqlTemplateContext templateContext = new BeanPropertySqlTemplateContext(bean);

3.2. Mapによるパラメータの指定

Mapで指定するときには、キー名をSQLテンプレート中で定義したバインドパラメータ名と一致させる必要があります。

Map<String, Object> map = Map.of("salaryMin", 1200, "salaryMax", 1800);

SQLテンプレートを評価する際の引数 SqlTemplateContext の実装の1つである MapSqlTemplateContext を使用します。

SqlTemplateContext templateContext = new MapSqlTemplateContext(map);

また、MapSqlTemplateContext はインスタンス作成後でもバインドパラメータを設定可能です。

MapSqlTemplateContext templateContext = new MapSqlTemplateContext();
context.addVariable("salaryMin", 1200);
context.addVariable("salaryMax", 1800);

3.3. パラメータがない場合

SQLテンプレートに渡すパラメータがない場合は、 EmptyValueSqlTemplateContext を使用します。

SqlTemplateContext templateContext = new EmptyValueSqlTemplateContext();

4. SQLテンプレートの評価

SqlTemplate#process(...) にて、SQLテンプレートを評価します。

結果は、PreparedStatementJdbcTemplate に渡せる形式になっています。

ProcessResult result = template.process(context);

// 評価したSQLテンプレートの取得
// 結果 : select * from employee salary >= ? and salary <= ?
String sql = result.getSql();

// SQL中のバインドパラメータの取得
// テンプレート中のプレースホルダーの定義準になっています。
List<Object> bindParams = result.getParameters();