Использование подстановочного знака «как» в подготовленном утверждении - PullRequest
152 голосов
/ 23 ноября 2011

Я использую подготовленные операторы для выполнения запросов к базе данных mysql. И я хочу реализовать функцию поиска на основе своего рода ключевого слова.

Для этого мне нужно использовать ключевое слово LIKE, насколько я знаю. И раньше я также использовал подготовленные операторы, но я не знаю, как использовать их с LIKE, потому что из следующего кода, куда бы я добавил 'keyword%'?

Могу ли я напрямую использовать его в pstmt.setString(1, notes) как (1, notes+"%") или что-то в этом роде. Я вижу много сообщений на эту тему в Интернете, но нигде не получаю хорошего ответа.

PreparedStatement pstmt = con.prepareStatement(
      "SELECT * FROM analysis WHERE notes like ?");
pstmt.setString(1, notes);
ResultSet rs = pstmt.executeQuery();

Ответы [ 5 ]

256 голосов
/ 23 ноября 2011

Вам нужно установить его в самом значении, а не в подготовленной строке SQL оператора.

Итак, это должно быть сделано для соответствия префикса:

notes = notes
    .replace("!", "!!")
    .replace("%", "!%")
    .replace("_", "!_")
    .replace("[", "![");
PreparedStatement pstmt = con.prepareStatement(
        "SELECT * FROM analysis WHERE notes LIKE ? ESCAPE '!'");
pstmt.setString(1, notes + "%");

или суффикс-совпадение:

pstmt.setString(1, "%" + notes);

или глобальное совпадение:

pstmt.setString(1, "%" + notes + "%");
24 голосов
/ 14 марта 2015

Кодируйте его следующим образом:

PreparedStatement pstmt = con.prepareStatement(
    "SELECT * FROM analysis WHERE notes like ?");
pstmt.setString(1, notes + "%");`

Убедитесь, что вы НЕ включаете кавычки, как показано ниже, поскольку они вызовут исключение.

pstmt.setString(1,"'%"+ notes + "%'");
4 голосов
/ 10 марта 2016
PreparedStatement ps = cn.prepareStatement("Select * from Users where User_FirstName LIKE ?");
ps.setString(1, name + '%');

Попробуйте это.

1 голос
/ 15 ноября 2017
String fname = "Sam\u0025";

PreparedStatement ps= conn.prepareStatement("SELECT * FROM Users WHERE User_FirstName LIKE ? ");

ps.setString(1, fname);
0 голосов
/ 05 октября 2018
String query="select * from test1 where "+selected+" like '%"+SelectedStr+"%';";


PreparedStatement preparedStatement=con.prepareStatement(query);


// where seleced and SelectedStr are String Variables in my program
...