27

我正在尝试为我的程序制作验证类。我已经建立了与 MySQL 数据库的连接,并且已经在表中插入了行。该表由firstNamelastNameuserID字段组成。现在我想通过构造函数的参数选择数据库上的特定行。

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);
        }
    }
}
    

但这似乎不起作用。

4

6 回答 6

55

您应该使用该setString()方法来设置userID. 这既可以确保语句格式正确,又可以防止SQL injection

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

Java 教程中有一个关于如何PreparedStatement正确使用 s 的很好的教程。

于 2012-10-05T11:24:22.233 回答
6

你的查询有问题。。

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

您正在使用 Prepare Statement.. 所以您需要使用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);
于 2012-10-05T11:25:22.397 回答
5

如果您使用准备好的语句,您应该像这样使用它:

"SELECT * from employee WHERE userID = ?"

然后使用:

statement.setString(1, userID);

?将在您的查询中替换为传递给setString方法的用户 ID。

看看这里如何使用PreparedStatement

于 2012-10-05T11:27:17.697 回答
2

做这样的事情,也可以防止SQL 注入攻击

statement = con.prepareStatement("SELECT * from employee WHERE  userID = ?");
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();
于 2012-10-05T11:25:08.913 回答
1

您可以使用 '?' 使用 PreparedStatments 在字符串中设置自定义参数。

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

如果您直接在查询中传递 userID,那么它可能会受到SQL INJECTION Attack 的攻击。

于 2012-10-05T11:26:42.070 回答
-2

问题是您需要添加“';” 在末尾。

于 2017-08-24T18:31:01.993 回答