PreparedStatement接口擴(kuò)展了Statement接口,它代表一個可以多次執(zhí)行的預(yù)編譯SQL語句。它接受參數(shù)化 SQL 查詢,并且您可以向此查詢傳遞 0 個或多個參數(shù)。
最初此語句使用占位符 “?” 而不是參數(shù),稍后您可以傳遞參數(shù)使用 PreparedStatement 接口的 setXXX() 方法動態(tài)地實(shí)現(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)該可以使用準(zhǔn)備好的語句向其中插入值,如下所示。
//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ǔn)備好的語句對象中執(zhí)行普通的靜態(tài) SQL 語句,并返回一個布爾值。
executeQuery(): 該方法執(zhí)行
executeUpdate():該方法在當(dāng)前Prepared中執(zhí)行insert update或delete等SQL DML語句陳述。它返回一個整數(shù)值,表示受影響的行數(shù)。
您可以執(zhí)行上面創(chuàng)建的準(zhǔn)備好的語句,如下所示:
示例
在本例中,我們嘗試使用準(zhǔn)備好的語句將值插入名為“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ù)制
如果驗(yàn)證數(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是什么?的詳細(xì)內(nèi)容,更多請關(guān)注www.92cms.cn其它相關(guān)文章!