将参数传递给 JDBC PreparedStatement
Posted
技术标签:
【中文标题】将参数传递给 JDBC PreparedStatement【英文标题】:Passing parameters to a JDBC PreparedStatement 【发布时间】:2012-09-26 13:07:36 【问题描述】:我正在尝试为我的程序创建验证类。我已经建立了与 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);
但它似乎不起作用。
【问题讨论】:
你遇到什么问题?? 【参考方案1】:您应该使用setString()
方法来设置userID
。这既确保语句格式正确,又防止SQL injection
:
statement =con.prepareStatement("SELECT * from employee WHERE userID = ?");
statement.setString(1, userID);
在the Java Tutorials 中有一个很好的关于如何正确使用PreparedStatement
s 的教程。
【讨论】:
【参考方案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 函数