我正在尝试为我的程序制作验证课程。我已经建立了与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);
}
}
}
但它似乎不起作用。
答案 0 :(得分:33)
您应该使用setString()
方法设置userID
。这既可以确保语句格式正确,又可以阻止SQL injection
:
statement =con.prepareStatement("SELECT * from employee WHERE userID = ?");
statement.setString(1, userID);
有一个很好的教程,介绍如何在the Java Tutorials中正确使用PreparedStatement
。
答案 1 :(得分:4)
如果您使用的是预准备语句,则应该像这样使用它:
"SELECT * from employee WHERE userID = ?"
然后使用:
statement.setString(1, userID);
?
将在您的查询中使用传递给setString
方法的用户ID进行替换。
查看here如何使用PreparedStatement。
答案 2 :(得分:2)
您的查询存在问题..
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);
答案 3 :(得分:1)
做这样的事情,这也会阻止SQL injection attacks
statement = con.prepareStatement("SELECT * from employee WHERE userID = ?");
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();
答案 4 :(得分:1)
您可以使用'?'使用PreparedStatments在字符串中设置自定义参数。
statement =con.prepareStatement("SELECT * from employee WHERE userID = ?");
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();
如果您在查询中直接传递userID,则可能会受到 SQL INJECTION Attack.
的攻击答案 5 :(得分:-1)
问题是你需要添加“';”在末尾。