基本的な使い方
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テンプレートを評価します。
結果は、PreparedStatement
や JdbcTemplate
に渡せる形式になっています。
ProcessResult result = template.process(context); // 評価したSQLテンプレートの取得 // 結果 : select * from employee salary >= ? and salary <= ? String sql = result.getSql(); // SQL中のバインドパラメータの取得 // テンプレート中のプレースホルダーの定義準になっています。 List<Object> bindParams = result.getParameters();