2013年8月10日土曜日

PreparedStatementでのIN句のパラメータ設定方法

PreparedStatementは、データベースに対してSQLを実行する際に、よく使いますがその時にSQLのIN句(例 select * from hoge where id  in (1,2,3))のようにしたい時に、イメージとしては下記の様なSQLが書けないかな?と思ってしまいます。

SELECT * FROM HOGE WHERE ID IN (?)

これに対し、複数パラメータで実行するとSQLExceptionが飛んで来てしまいます。
そこで、パラメータを使って出来ないかと思い考えた事をメモとして記載したいと思います。

実装方法

動的にSQLを作成することにより実行出来ます。
行いたいことは、

SELECT * FROM HOGE WHERE ID IN (?,?,?)

と、動的にパラメータを作成することです。
IN句のパラメータ数が動的に変わってしまうので、キャッシュにはパラメータの個数分乗ってしまうのですが、IN句の中身を直接値を記載するよりは効率が良いです。
サンプルとして以下のようなコードを記載します。

package info;

public class Test {
 public static void main(String args[]){
  StringBuilder sql = new StringBuilder();
  sql.append(" select ");
  sql.append("   * ");
  sql.append(" from hoge ");
  sql.append(" where 0 = 0 ");
  sql.append(" and ");
  sql.append("  id = (");
  sql.append(createInSQL(3)); //パラメータが3つの場合
  sql.append(" )");
  
  System.out.println(sql.toString());
 }
 
 private static String createInSQL(int length) {
  StringBuilder builder = new StringBuilder();
  for (int i = 0; i < length;) {
   builder.append("?");
   if (++i < length) {
    builder.append(",");
   }
  }
  return builder.toString();
 }
}

実行結果は
 select    *  from hoge  where 0 = 0  and   id = (?,?,? )
となります。
後は、Listなどでループで回してStatementに代入すれば実装出来ます。

Written By : // 12:32
Category:

0 コメント:

コメントを投稿

 

About

このブログは筆者の備忘録として色々記載しています。
Powered by Blogger.