首先來看兩段代碼:
第一個使用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語句是否執行了多次,而且兩次之間的差別僅僅是變量的不同。如果僅僅執行了一次的話,它應該和普通的對象毫無差異,體現不出它預編譯的優越性。