PreparedStatement接口擴展了Statement接口,它代表一個可以多次執(zhí)行的預(yù)編譯SQL語句。它接受參數(shù)化 SQL 查詢,并且您可以向此查詢傳遞 0 個或多個參數(shù)。
最初此語句使用占位符 “?” 而不是參數(shù),稍后您可以傳遞參數(shù)使用 PreparedStatement 接口的 setXXX() 方法動態(tài)地實現(xiàn)這些。
創(chuàng)建一個PreparedStatement
您可以創(chuàng)建一個PreparedStatement (接口)使用 Connection 接口的 prepareStatement() 方法。此方法接受查詢(參數(shù)化)并返回一個PreparedStatement 對象。
當(dāng)您調(diào)用此方法時,Connection 對象會將給定的查詢發(fā)送到數(shù)據(jù)庫以編譯并保存它。如果查詢編譯成功,則僅返回對象。
要編譯查詢,數(shù)據(jù)庫不需要任何值,因此您可以使用(零個或多個)占位符 (問號 ” ?”) 代替查詢中的值。
例如,如果數(shù)據(jù)庫中有一個名為 Employee 的表,使用以下查詢創(chuàng)建。
CREATE TABLE Employee(Name VARCHAR(255), Salary INT NOT NULL, Location VARCHAR(255));
登錄后復(fù)制
然后您應(yīng)該可以使用準備好的語句向其中插入值,如下所示。
//Creating a Prepared Statement String query="INSERT INTO Employee(Name, Salary, Location)VALUES(?, ?, ?)"; Statement pstmt = con.prepareStatement(query);
登錄后復(fù)制
設(shè)置占位符的值
PreparedStatement接口提供了幾個setter方法,例如setInt()、setFloat()、setArray()、setDate()、setDouble()等,用于設(shè)置預(yù)編譯語句的占位符的值。
這些方法接受兩個參數(shù),一個是表示占位符位置索引的整數(shù)值,另一個是int、String、float等表示您需要插入的值。
您可以使用以下示例中的setter方法為上述創(chuàng)建的語句設(shè)置占位符的值:
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");
登錄后復(fù)制
執(zhí)行Prepared Statement
創(chuàng)建PreparedStatement對象后,您可以使用PreparedStatement接口的execute()方法之一來執(zhí)行它,即execute ()、executeUpdate() 和、executeQuery()。
execute(): 該方法在當(dāng)前準備好的語句對象中執(zhí)行普通的靜態(tài) SQL 語句,并返回一個布爾值。
executeQuery(): 該方法執(zhí)行
executeUpdate():該方法在當(dāng)前Prepared中執(zhí)行insert update或delete等SQL DML語句陳述。它返回一個整數(shù)值,表示受影響的行數(shù)。
您可以執(zhí)行上面創(chuàng)建的準備好的語句,如下所示:
示例
在本例中,我們嘗試使用準備好的語句將值插入名為“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://localhost/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 ....");
}
}
登錄后復(fù)制
輸出
Connection established...... Number of rows inserted: 1
登錄后復(fù)制
如果驗證數(shù)據(jù)庫,您可以觀察表中插入的值:
+---------+--------+----------------+ | Name | Salary | Location | +---------+--------+----------------+ | Amit | 30000 | Hyderabad | | Kalyan | 40000 | Vishakhapatnam | | Renuka | 50000 | Delhi | | Archana | 15000 | Mumbai | +---------+--------+----------------+ 5 rows in set (0.00 sec)
登錄后復(fù)制
以上就是JDBC中的PreparedStatement是什么?的詳細內(nèi)容,更多請關(guān)注www.92cms.cn其它相關(guān)文章!






