調べればすぐ分るけど、ちょっと忘れがちなのがLIKE検索の場合。
エスケープ文字ってDBによって異なるから、DBに依存しないでLIKE
のエスケープするメソッドを作ってみました。
MySQLでしか試してないから「どんなDBでも大丈夫」って言う自信
はないけど、一応以下な感じかな?
/**
* <code>con</code>からエスケープ文字列を取得する
*
* @param con
* Connection
* @return
* エスケープ用文字列
*/
public static String getEscapeChar(Connection con) {
if (con == null) {
System.out.println("illegal argument");
throw new IllegalArgumentException();
}
try {
DatabaseMetaData metaData = con.getMetaData();
return metaData.getSearchStringEscape();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
/**
* LIKE 検索を行う場合のデータ部分のエスケープ
*
* @param s
* エスケープ対象
* @param escape
* エスケープ文字列
* @return
* <code>s</code>にをエスケープシーケンスしたString
*/
public static String escape(Connection con, String s) {
if (StringUtils.isEmpty(s)) {
return s;
}
String escape = getEscapeChar(con);
StringBuffer sbuf = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '_') {
sbuf.append(escape);
} else if (c == '%') {
sbuf.append(escape);
}
sbuf.append(c);
}
return sbuf.toString();
}
0 コメント:
コメントを投稿