MyBatisの@SelectProvider,@UpdateProvider,@InsertProvider,@DeleteProviderアノテーションで動的SQL作成する
MyBatisでXMLベースではなくアノテーションベースで記述するときに動的SQLを作成したい場合は、@SelectProvider,@UpdateProvider,@InsertProvider,@DeleteProviderアノテーションを使って実現します。
アノテーションはメソッドに付与します。以下マッパークラスの記述例です。
@SelectProvider(type = jp.co.confrage.HogeSelectBuilder.class, method = "selectSql") public List<Integer> getHogeMst( @Param("idList") List<String> idList);
パラメータ | 値 |
---|---|
type | クラス名 |
method | メソッド名 |
同じパッケージにHogeSelectBuilderクラスを作成します。このクラスにマッパーで指定したselectSqlというメソッドを指定して動的SQLを作成します。
HogeSelectBuilderクラス
ここではHogeSelectBuilderクラスとしていますが名前は何でもいいです。
package jp.co.confrage; import static org.apache.ibatis.jdbc.SelectBuilder.*; import java.util.List; import java.util.Map; @SuppressWarnings("all") public class HogeSelectBuilder { public String selectSql(Map<String, Object> params) { List<String> idList = (List<String>)params.get("idList"); // 引数取得 BEGIN(); SELECT("name"); FROM("employee_mst"); if (idList.size() != 0) { // 動的にIN句作成 WHERE("id in (" + getInParamString(idList) + ")"); } return SQL(); } private String getInParamString(List<String> values) { String paramString = ""; int i = 0; for (String value : values) { if (i != 0) { paramString += ","; } paramString += String.format("'%s'", value); // SQLインジェクションの危険性あり i++; } return paramString; } }
これでアノーテションベースで動的SQLを作成することが可能ですがバインド変数を使っていない為、SQLインジェクションの危険があります。
paramString += String.format("'%s'", value); // SQLインジェクションの危険性あり
↓
paramString += String.format("#{idList[%s]}", i); // #{idList[0]},#{idList[1]},...
#{リストの変数名[インデックス]}としてバインド変数に変更する必要があります。
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント