MyBatisの@SelectProvider,@UpdateProvider,@InsertProvider,@DeleteProviderアノテーションで動的SQL作成する

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]},...

#{リストの変数名[インデックス]}としてバインド変数に変更する必要があります。

コメント

株式会社CONFRAGE ITソリューション事業部をもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む

タイトルとURLをコピーしました