Передача параметров в 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
Проблема заключалась в том, что вам нужно было добавить "'; в конце.