PreparedStatementを使用してLIKE検索を行いたい


JavaからMySQLへクエリーを発行する場合、パフォーマンスやセキュリティの観点からPreparedStatementが使われます。
PreparedStatementを使うとSQLを生成する際、?マークにした箇所を後から別の値に置き換えることができます。

String searchWord = "東京":
String sql = "SELECT * FROM prefecture WHERE name = ?";
ps = con.prepareStatement(sql);
ps.setString(1, searchWord);
rs = ps.executeQuery();

 

しかしLIKEを使用して検索を行う場合には注意が必要です。
以下の場合エラーとなります。

String searchWord = "ア":
String sql = "SELECT * FROM prefecture WHERE kana LIKE '?%';
ps = con.prepareStatement(sql);
ps.setString(1, searchWord);
rs = ps.executeQuery();

アで始まる都道府県を検索しようとしていますが、これでは上手くいきません。
PreparedStatementは?マークを置き換える際、前後にシングルクォーテーションを付けます。
したがって、上記の場合はこんなSQLが発行されています。

SELECT * FROM prefecture WHERE kana like ''ア'%'

これではエラーになってしまいますね。

 

この問題は以下の記述で解決できます。

String searchWord = "ア":
String sql = "SELECT * FROM prefecture WHERE kana LIKE ?;
ps = con.prepareStatement(sql);
ps.setString(1, searchWord + "%");
rs = ps.executeQuery();

シングルクォーテーションが付与される前に「%」と文字列結合してしまうわけです。
お困りの際は、是非お試しください!

  • このエントリーをはてなブックマークに追加

PAGE TOP