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(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント