【问题标题】:Passing parameters to a JDBC PreparedStatement将参数传递给 JDBC PreparedStatement
【发布时间】:2012-09-26 13:07:36
【问题描述】:

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

但它似乎不起作用。

【问题讨论】:

  • 你遇到什么问题??

标签: java mysql jdbc


【解决方案1】:

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

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

the Java Tutorials 中有一个很好的关于如何正确使用PreparedStatements 的教程。

【讨论】:

    【解决方案2】:

    您的查询有问题..

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

    【讨论】:

    • statement =con.prepareStatement("SELECT * from employee WHERE userID = :userId"); 我认为 jdbc 不支持这种语法。 jdbc 不支持命名参数吧?
    【解决方案3】:

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

    "SELECT * from employee WHERE userID = ?"
    

    然后使用:

    statement.setString(1, userID);
    

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

    看看here如何使用PreparedStatement

    【讨论】:

      【解决方案4】:

      做这样的事情,也可以防止SQL injection attacks

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

        如果您直接在查询中传递用户 ID,那么它可能会受到 SQL INJECTION Attack.

        的攻击

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2020-02-21
            • 2015-04-25
            • 2012-04-07
            • 1970-01-01
            • 1970-01-01
            • 2019-09-27
            • 1970-01-01
            • 2023-03-24
            相关资源
            最近更新 更多