JDBC中的PreparedStatement是什麼?


PreparedStatement 介面擴充套件了 Statement 介面,它表示一個預編譯的SQL語句,可以執行多次。它接受引數化的SQL查詢,您可以向該查詢傳遞0個或多個引數。

最初,此語句使用佔位符“?”代替引數,之後您可以使用PreparedStatement介面的setXXX()方法動態地向這些佔位符傳遞引數。

建立PreparedStatement

您可以使用Connection介面的prepareStatement()方法建立PreparedStatement(介面)的物件。此方法接受一個(引數化的)查詢並返回一個PreparedStatement物件。

當您呼叫此方法時,Connection物件將給定的查詢傳送到資料庫進行編譯和儲存。只有在查詢成功編譯後,它才會返回物件。

要編譯查詢,資料庫不需要任何值,因此您可以在查詢中的值位置使用(零個或多個)佔位符(問號”?”)。

例如,如果您在資料庫中有一個名為Employee的表,使用以下查詢建立。

CREATE TABLE Employee(Name VARCHAR(255), Salary INT NOT NULL, Location VARCHAR(255));

那麼您可以使用Prepared Statement將值插入到其中,如下所示。

//Creating a Prepared Statement
String query="INSERT INTO Employee(Name, Salary, Location)VALUES(?, ?, ?)";
Statement pstmt = con.prepareStatement(query);

為佔位符設定值

PreparedStatement介面提供了一些setter方法,例如setInt()、setFloat()、setArray()、setDate()、setDouble()等,用於為prepared statement的佔位符設定值。

這些方法接受兩個引數,一個是表示佔位符位置索引的整數值,另一個是int、String、float等…,表示您需要在該特定位置插入的值。

您可以使用setter方法為上面建立的語句的佔位符設定值,如下所示

pstmt.setString(1, "Amit");
pstmt.setInt(2, 3000);
pstmt.setString(3, "Hyderabad");

pstmt.setString(1, "Kalyan");
pstmt.setInt(2, 4000);
pstmt.setString(3, "Vishakhapatnam");

pstmt.setString(1, "Renuka");
pstmt.setInt(2, 5000);
pstmt.setString(3, "Delhi");

pstmt.setString(1, "Archana");
pstmt.setInt(2, 15000);
pstmt.setString(3, "Mumbai");

執行Prepared Statement

建立PreparedStatement物件後,您可以使用PreparedStatement介面的execute()方法之一來執行它,即execute()executeUpdate()和executeQuery()。

  • execute(): 此方法在當前prepared statement物件中執行普通的靜態SQL語句,並返回一個布林值。

  • executeQuery(): 此方法執行當前prepared statement並返回一個ResultSet物件。

  • executeUpdate(): 此方法執行SQL DML語句,例如在當前Prepared statement中插入、更新或刪除。它返回一個整數值,表示受影響的行數。

您可以執行上面建立的prepared statement,如下所示

示例

在這個例子中,我們嘗試使用prepared statement將值插入到名為Employees的表中。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class PreparedStatementExample {
   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 = "INSERT INTO Employees(Name, Salary, Location) VALUES (?, ?, ?)";
      PreparedStatement pstmt = con.prepareStatement(query);

      pstmt.setString(1, "Amit");
      pstmt.setInt(2, 3000);
      pstmt.setString(3, "Hyderabad");

      pstmt.setString(1, "Kalyan");
      pstmt.setInt(2, 4000);
      pstmt.setString(3, "Vishakhapatnam");

      pstmt.setString(1, "Renuka");
      pstmt.setInt(2, 5000);
      pstmt.setString(3, "Delhi");

      pstmt.setString(1, "Archana");
      pstmt.setInt(2, 15000);
      pstmt.setString(3, "Mumbai");

      int num = pstmt.executeUpdate();
      System.out.println("Rows inserted ....");
   }
}

輸出

Connection established......
Number of rows inserted: 1

如果您驗證資料庫,您可以在表中觀察插入的值為

+---------+--------+----------------+
| Name    | Salary | Location       |
+---------+--------+----------------+
| Amit    | 30000  | Hyderabad      |
| Kalyan  | 40000  | Vishakhapatnam |
| Renuka  | 50000  | Delhi          |
| Archana | 15000  | Mumbai         |
+---------+--------+----------------+
5 rows in set (0.00 sec)

更新於:2019年7月30日

11K+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.