将参数传递给 JDBC PreparedStatement

Posted

技术标签:

【中文标题】将参数传递给 JDBC PreparedStatement【英文标题】:Passing parameters to a 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);
        
    

    

但它似乎不起作用。

【问题讨论】:

你遇到什么问题?? 【参考方案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】:

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

【讨论】:

以上是关于将参数传递给 JDBC PreparedStatement的主要内容,如果未能解决你的问题,请参考以下文章

使用 JDBC 将自己制作的 Windows 凭据传递给 SQL Server

如何将 POST 参数传递给 Durable Function,然后将此参数传递给 Timer Triggered 函数

如何将参数传递给 Java 线程?

如何将参数传递给进程

如何通过反射将参数传递给方法

如何将参数传递给 erlang os:cmd()?