Передача параметров в JDBC PreparedStatement

Я пытаюсь сделать мой класс проверки для своей программы. Я уже установил соединение с базой данных MySQL, и я уже вставил строки в таблицу. Таблица состоит из полей firstName, lastName и userID. Теперь я хочу выбрать определенную строку в базе данных через свой параметр моего конструктора.

import java.sql.*;
import java.sql.PreparedStatement;
import java.sql.Connection;

public class Validation {

    private PreparedStatement statement;
    private Connection con;
    private String x, y;

    public Validation(String userID) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/test", "root", "");
            statement = con.prepareStatement(
                    "SELECT * from employee WHERE  userID = " + "''" + userID);
            ResultSet rs = statement.executeQuery();
            while (rs.next()) {
                x = rs.getString(1);
                System.out.print(x);
                System.out.print(" ");
                y = rs.getString(2);
                System.out.println(y);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
}

но он не работает.

Ответ 1

Вы должны использовать setString(), чтобы установить userID. Это гарантирует, что оператор корректно отформатирован и предотвращает SQL injection:

statement =con.prepareStatement("SELECT * from employee WHERE  userID = ?");
statement.setString(1, userID);

Есть хороший учебник о том, как правильно использовать PreparedStatement в учебниках по Java.

Ответ 2

Если вы используете подготовленный оператор, вы должны использовать его следующим образом:

"SELECT * from employee WHERE userID = ?"

Затем используйте:

statement.setString(1, userID);

? будет заменен в вашем запросе идентификатором пользователя, переданным в метод setString.

Взгляните здесь как использовать PreparedStatement.

Ответ 3

В вашем запросе есть проблема.

   statement =con.prepareStatement("SELECT * from employee WHERE  userID = "+"''"+userID);
   ResultSet rs = statement.executeQuery();

Вы используете Подготовить выражение. Поэтому вам нужно установить свой параметр с помощью statement.setInt() или statement.setString() в зависимости от типа вашего userId

Заменить его: -

   statement =con.prepareStatement("SELECT * from employee WHERE  userID = :userId");
   statement.setString(userId, userID);
   ResultSet rs = statement.executeQuery();

Или, вы можете использовать ? вместо именованного значения - :userId..

   statement =con.prepareStatement("SELECT * from employee WHERE  userID = ?");
   statement.setString(1, userID);

Ответ 4

Сделайте что-нибудь подобное, что также предотвратит атаки SQL-инъекции

statement = con.prepareStatement("SELECT * from employee WHERE  userID = ?");
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();

Ответ 5

Вы можете использовать '?' для установки пользовательских параметров в строке с использованием PreparedStatments.

statement =con.prepareStatement("SELECT * from employee WHERE  userID = ?");
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();

Если вы напрямую передаете идентификатор пользователя в запросе, как вы делаете, он может подвергнуться атаке SQL INJECTION Attack.

Ответ 6

Проблема заключалась в том, что вам нужно было добавить "'; в конце.