簡體   English   中英

將參數傳遞給 JDBC PreparedStatement

[英]Passing parameters to a JDBC PreparedStatement

我正在嘗試為我的程序創建驗證類。 我已經建立了與 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);
        }
    }
}
    

但它似乎不起作用。

您應該使用setString()方法來設置userID 這既可以確保語句的格式正確,又可以防止SQL injection

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

Java 教程中有一個關於如何正確使用PreparedStatement的很好的教程

您的查詢有問題..

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

如果您使用的是准備好的語句,您應該像這樣使用它:

"SELECT * from employee WHERE userID = ?"

然后使用:

statement.setString(1, userID);

? 將在您的查詢中替換為傳遞給setString方法的用戶 ID。

看看這里如何使用PreparedStatement

做這樣的事情,這也可以防止SQL 注入攻擊

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

您可以使用 '?' 使用 PreparedStatments 在字符串中設置自定義參數。

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

如果您直接在查詢中傳遞用戶 ID,那么它可能會受到SQL INJECTION Attack 的攻擊。

問題是您需要添加“ ';” 在末尾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM