java中prepareStatement與createStatement的區別


首先來看兩段代碼:

第一個使用createStatement()

 1 public void delete( int id){
 2         try {
 3             Connection c = DBUtil.getConnection();
 4             Statement s = c.createStatement();
 5             String sql = "delete from category where id = " + id ;
 6             s.execute(sql);
 7         } catch (SQLException e) {
 8             e.printStackTrace();
 9         }
10     }

 

下面一段代碼使用prepareStatement()完成

 1 /**
 2      * 向數據庫中增加信息
 3      * @param config
 4      */
 5     public void add(Config config){
 6         String sql = "insert into category values(null,?,?)";
 7         try {
 8             Connection c = DBUtil.getConnection();
 9             PreparedStatement ps = c.prepareStatement(sql);
10             ps.setString(1, config.key);
11             ps.setString(2, config.value);
12             ps.execute();
13             ResultSet rs = ps.getGeneratedKeys();
14             
15             while (rs.next()) {
16                 int id = rs.getInt(1);
17                 config.id = id;
18             }
19         } catch (SQLException e) {
20             e.printStackTrace();
21         }
22     }

 

可以大致看出二者的區別:

 

1:在概念上

prepareStatement會先初始化SQL,先把這個SQL提交到數據庫中進行預處理,多次使用可提高效率。   

createStatement不會初始化,沒有預處理,每次都是從0開始執行SQL。

 

 

2:在變量上

prepareStatement可以在SQL中用?替換變量

String sql = "insert into category values(null,?,?)";

 

createStatement不支持 ? 替換變量,只能在sql中拼接參數

String sql = "delete from category where id = " + id ;

 

3:功能上

如果想要刪除三條數據

對於createStatement,需要寫三條語句

String sql = "delete from category where id = 2"  ;
String sql = "delete from category where id = 3"  ;
String sql = "delete from category where id = 7"  ;

而prepareStatement,通過set不同數據只需要生成一次執行計划,可以重用

String sql = "delete from category where id = ?"  ;

 

1.PreparedStatement是預編譯的,對於批量處理可以大大提高效率.也叫JDBC存儲過程。

2.使用createStatement 對象。在對數據庫只執行一次性存取的時侯,用 createStatement對象進行處理。PreparedStatement對象的開銷比createStatement大,對於一次性操作並不會帶來額外的好處。

3.createStatement每次執行sql語句,相關數據庫都要執行sql語句的編譯,preparedstatement是預編譯得,preparedstatement支持批處理

4:可重復性

 

對於上面的兩段代碼而言:第一段 id 必須給定一個值

而第二段中,對象的key,value都可以自己定義,而且大多數情況下這個語句已經被預編譯過,因而當其執行時,只需DBMS運行SQL語句,而不必先編譯。

這種轉換也給你帶來很大的便利,不必重復SQL語句的句法,而只需更改其中變量的值,便可重新執行SQL語句。

選擇PreparedStatement對象與否,在於相同句法的SQL語句是否執行了多次,而且兩次之間的差別僅僅是變量的不同。如果僅僅執行了一次的話,它應該和普通的對象毫無差異,體現不出它預編譯的優越性。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM