什麼是繫結變數?如何使用 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
廣告