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)
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP