為什麼 JDBC 中的預編譯語句比語句快?解釋一下。


使用 Statement 物件執行語句時,特別是插入語句,每次執行查詢時,整個語句都會被編譯並再次執行,而這些語句之間唯一的區別在於語句的值。

而預編譯語句是一個預編譯的語句,即查詢被編譯並存儲在資料庫中,使用佔位符(?)代替值,稍後向這些佔位符提供值。

因此,避免了不必要的編譯和反覆執行語句。

示例

假設,我們在資料庫中有一個名為 **Dataset** 的表,其中包含 **mobile_brand** 和 **unit_sale** 列,如果我們想使用 statement 物件將記錄插入到此表中,程式碼將如下所示

stmt.executeUpdate("insert into Dataset values('Iphone', 3000)");
stmt.executeUpdate("insert into Dataset values('Samsung', 4000)");
stmt.executeUpdate("insert into Dataset values('Nokia', 5000)");
stmt.executeUpdate("insert into Dataset values('Vivo', 1500)");
stmt.executeUpdate("insert into Dataset values('Oppo', 9000)");
stmt.executeUpdate("insert into Dataset values('MI', 6400)");
stmt.executeUpdate("insert into Dataset values('MotoG', 4360)");
stmt.executeUpdate("insert into Dataset values('Lenovo', 4100)");
stmt.executeUpdate("insert into Dataset values('RedMi', 4000)");
stmt.executeUpdate("insert into Dataset values('OnePlus', 6334)");

並且對於每次 **executeUpdate()** 方法呼叫,其中的整個語句都會被編譯並執行。在這裡,如果您觀察到,只有語句的值發生了變化,而其餘的查詢則被不必要地編譯了。

如果您使用預編譯語句編寫插入查詢以將相同資料插入到同一表中,則程式碼如下所示

PreparedStatement pstmt = con.prepareStatement("insert into Dataset values(?, ?)");

pstmt.setString(1, "Iphone");
pstmt.setInt(2, 3000);
pstmt.executeUpdate();

pstmt.setString(1, "Samsung");
pstmt.setInt(2, 4000);
pstmt.executeUpdate();

pstmt.setString(1, "Nokia");
pstmt.setInt(2, 5000);
pstmt.executeUpdate();

pstmt.setString(1, "Vivo");
pstmt.setInt(2, 1500);
pstmt.executeUpdate();

pstmt.setString(1, "Oppo");
pstmt.setInt(2, 900);
pstmt.executeUpdate();

pstmt.setString(1, "MI");
pstmt.setInt(2, 6400);
pstmt.executeUpdate();

pstmt.setString(1, "MotoG");
pstmt.setInt(2, 4360);
pstmt.executeUpdate();

pstmt.setString(1, "Lenovo");
pstmt.setInt(2, 4100);
pstmt.executeUpdate();

pstmt.setString(1, "RedMi");
pstmt.setInt(2, 4000);
pstmt.executeUpdate();

pstmt.setString(1, "MotoG");
pstmt.setInt(2, 4360);
pstmt.executeUpdate();

pstmt.setString(1, "OnePlus");
pstmt.setInt(2, 6334);
pstmt.executeUpdate();

在這裡,如果您觀察到,插入查詢是用佔位符(?)準備的,並且此查詢被編譯並存儲在資料庫中,然後使用 PreparedStatement 介面的 setter 方法傳遞值,從而避免了不必要的執行語句。

更新於: 2019-07-30

534 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

立即開始
廣告