将参数传递给JDBC PreparedStatement

时间:2012-10-05 11:21:50

标签: java mysql jdbc

我正在尝试为我的程序制作验证课程。我已经建立了与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);
        }
    }
}

但它似乎不起作用。

6 个答案:

答案 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)

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