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