1. 程式人生 > >Java基礎——Statement與PrepareStatement

Java基礎——Statement與PrepareStatement

fill dst 時間 建立 lib color 語法 處理 輸入

Statement

Statement是Java運行數據庫操作的一個重要方法。用於在已經建立數據庫連接的基礎上。向數據庫發送要運行的SQL語句。Statement對象,用於運行不帶參數的簡單SQL語句。用於運行靜態 SQL 語句並返回它所生成結果的對象。


在默認情況下,同一時間每一個 Statement對象在僅僅能打開一個 ResultSet對象。因此,假設讀取一個 ResultSet對象與讀取還有一個交叉。則這兩個對象必須是由不同的 Statement對象生成的。

假設存在某個語句的打開的當前 ResultSet對象,則 Statement

接口中的全部運行方法都會隱式關閉它。


Statement對象用於將 SQL語句發送到數據庫中。

實際上有三種 Statement對象,它們都作為在給定連接上運行 SQL語句的包容器:StatementPreparedStatement(它從 Statement繼承而來)和 CallableStatement(它從 PreparedStatement繼承而來)。它們都專用於發送特定類型的 SQL語句:Statement對象用於運行不帶參數的簡單 SQL語句;PreparedStatement對象用於運行帶或不帶 IN參數的預編譯 SQL語句;CallableStatement

對象用於運行對數據庫已存在的存儲過程的調用。


Statement接口提供了運行語句和獲取結果的基本方法。

PreparedStatement接口加入了處理 IN參數的方法;而CallableStatement加入了處理 OUT參數的方法。

PrepareStatement

PreparedStatement對象已預編譯過,所以其運行速度要快於 Statement對象。因此。多次運行的 SQL語句常常創建為 PreparedStatement對象。以提高效率。


作為 Statement 的子類,PreparedStatement 繼承了 Statement 的全部功能。另外它還加入了一整套方法,用於設置發送給數據庫以代替 IN 參數占位符的值。

CallableStatement

CallableStatement對象為全部的DBMS 提供了一種以標準形式調用已儲存過程的方法。已儲 存過程儲存在數據庫中。對已儲存過程的調用是CallableStatement對象所含的內容。

這樣的調用是 用一種換碼語法來寫的,有兩種形式:一種形式帶結果參,還有一種形式不帶結果參數。結果參數是 一種輸出(OUT) 參數。是已儲存過程的返回值。兩種形式都可帶有數量可變的輸入(IN 參數)、 輸出(OUT 參數)或輸入和輸出(INOUT參數)的參數。問號將用作參數的占位符。

Statement 或 PrepareStatement

通過讀其它人的代碼。能夠看到用的大部分都是PrepareStatementPrepareStatement 運行的是預編譯語句,預編譯語句在被DB的編譯器編譯後的運行代碼被緩存下來。那麽下次調用時僅僅要是同樣的預編譯語句就不用在編譯了,對多次插入但數據不同的情況下,使用PrepareStatement能提高非常大的性能

Statement插入1萬條數據耗費時間:

技術分享

PrepareStatement插入1萬條數據耗費時間:

技術分享

安全性是PrepareStatement的非常大的優勢,使用PrepareStatement能盡可能提高數據庫的安全性

大家應該都知道sql註入;採用拼串的方式拼的sql語句存在被sql註入的風險。而假設使用預編譯語句.則傳入的不論什麽內容就不會和原來的語句發生不論什麽匹配的關系。安全性就有了非常高的提升。


總結

盡管PrepareStatementStatement有非常多的優點。可是Statement並非一無是處的。假設插入的sql語句不固定。也沒有什麽規律那麽用PrepareStatement在性能上也沒有什麽優勢。存在即有一定的合理性。所以我們應該依據情況選擇合適的方式。

Java基礎——Statement與PrepareStatement