Java PreparedStatements中的通配符

Eri*_*oob 8 java mysql jdbc prepared-statement

这是我当前的SQL语句:

SEARCH_ALBUMS_SQL = "SELECT * FROM albums WHERE title LIKE ? OR artist LIKE ?;";
Run Code Online (Sandbox Code Playgroud)

它会返回与专辑或艺术家名称的完全匹配,但不会返回任何其他内容.我不能在声明中使用'%',否则我会收到错误.

如何将通配符添加到预准备语句中?

(我正在使用Java5和MySQL)

谢谢!

Pau*_*lin 18

您将%放在绑定变量中.所以你也是

   stmt.setString(1, "%" + likeSanitize(title) + "%");
   stmt.setString(2, "%" + likeSanitize(artist) + "%");
Run Code Online (Sandbox Code Playgroud)

你应该添加ESCAPE'!' 允许您在输入中转义对LIKE至关重要的特殊字符.

在使用标题艺术家之前,你应该通过使用如下方法转义特殊字符(!,%,_[)来消毒它们(如上所示):

public static String likeSanitize(String input) {
    return input
       .replace("!", "!!")
       .replace("%", "!%")
       .replace("_", "!_")
       .replace("[", "![");
} 
Run Code Online (Sandbox Code Playgroud)

  • 如果绑定变量具有文字'%',则应将其转义为'\%'.请参阅Java方法java.lang.String.replace(). (4认同)