什麼是繫結變數?如何使用 JDBC 執行包含繫結變數的查詢?


繫結變數是指SQL語句中使用臨時變數作為佔位符,稍後用適當的值替換這些佔位符。例如,如果資料庫中有一個名為 employee 的表,其建立方式如下所示

+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000 | Hyderabad       |
| Kalyan  | 40000 | Vishakhapatnam  |
| Renuka  | 50000 | Delhi           |
| Archana | 15000 | Mumbai          |
+---------+--------+----------------+

如果您需要檢索薪水大於 20000 的 employee 表中的記錄,則可以編寫如下查詢:

SELECT Name, Salary FROM Employee WHERE Salary > 30000;

在這裡,您可以使用變數作為佔位符,而不是值 30000,稍後將值傳遞給它。

SELECT Name, Salary FROM Employee WHERE Salary > sal_val;

在 JDBC 中執行包含繫結變數的查詢

JDBC API 中的 **PreparedStatement** 介面表示預編譯語句,您可以透過將包含繫結變數的查詢傳遞給 **Connection** 介面的 prepareStatement() 方法來建立預編譯語句。但是,您需要使用問號 (?) 作為佔位符,而不是繫結變數。

//Creating a Prepared Statement
String query = "SELECT Name, Salary FROM Employee WHERE Salary > ?";
PreparedStatement pstmt = con.prepareStatement(query);

建立 PreparedStatement 後,您可以使用 PreparedStatement 介面提供的 setter 方法將值設定為其佔位符。根據繫結變數的資料型別,您需要選擇相應的 setter 方法。在本例中,繫結變數的資料型別為整數,因此需要使用 **setInt()** 方法。

此方法需要傳遞一個整數,表示佔位符的位置索引以及您要設定的值。由於只有一個佔位符,因此佔位符的索引為 1,我們需要設定的值為 30000。

pstmt.setInt(1, 30000);

最後,您可以使用其中一種 execute 方法 (execute()、executeUpdate()、executeQuery()) 來執行預編譯語句。由於此查詢返回結果集,因此需要使用 **executeQuery()** 方法。

ResultSet rs = pstmt.executeQuery();

示例

以下 JDBC 程式演示瞭如何執行包含繫結變數的查詢。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BindVariableExample {
   public static void main(String args[]) throws SQLException {
      //Registering the Driver
      DriverManager.registerDriver(new com.mysql.jdbc.Driver());
      //Getting the connection
      String mysqlUrl = "jdbc:mysql:///testdb";
      Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
      System.out.println("Connection established......");
      //Creating a Prepared Statement
      String query = "SELECT Name, Salary FROM Employee WHERE Salary > ?";
      PreparedStatement pstmt = con.prepareStatement(query);
      pstmt.setInt(1, 30000);
      ResultSet rs = pstmt.executeQuery();
      while(rs.next()) {
         System.out.print("Name: "+rs.getString("Name")+", ");
         System.out.print("Salary: "+rs.getInt("Salary"));
         System.out.println();
      }
   }
}

輸出

Connection established......
Name: Kalyan, Salary: 40000
Name: Renuka, Salary: 50000

更新於:2019年7月30日

6000+ 次瀏覽

啟動您的 職業生涯

完成課程獲得認證

開始學習
廣告