廣告聯播

2009年1月12日 星期一

[DataBase] PreparedStatement & Statement 的差異

From: Polin Wei

Java 程式語言在寫入資料庫有兩種方式 PreparedStatement 與 Statement , [Java] Date Type Write In DataBase 日期型態如何寫入資料庫 一文中有 PreparedStatement 的程式範例, 至於 Statement 的程式碼如下:

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public void writeInDB(){
Connection conn = null;
String sql ;
Statement pstmt ;
ResultSet rs;
try {
    sql = "Select id,name FROM mydate where id='" + PolinWei + "'";
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
    if ( rs.next() ){
       name = rs.getString("NAME");
       System.out.println("name: " + name);           
    }
    rs.close();
    stmt.close();
} catch (Exception e) {
    System.err.println(e);
} finally {
    try {
    conn.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}


看似 Statement 比 PreparedStatement 的程式為簡單, 且程式碼較為精簡 , 但若這支程式的使用率很頻繁, 且 WHERE 條件中的值也每次都不一樣時, 建議應使用 PreparedStatement , 因為這會讓後端的資料庫在作 Parse 時, 負載會減輕很多.

附註: 若希望 ResultSet 可以上一筆, 下一筆的查詢. 則在宣告 Statement stmt 時要加入 ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY 這兩個參數, 如:

Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

3 則留言:

  1. 其實PreparedStatement對SQL injection擁有較佳的防護能力,而且SQL指令如果是超級長,要維護的時候,要在Statement寫法內找出要被維護的參數,會相當的不容易,為了避免自己開發Bugs讓自己Debug,好的習慣是使用PreparedStatement來撰寫程式碼,減少參數型態錯誤的一些小問題,還有Hibernate也是一個不錯的工具

    回覆刪除
  2. 謝謝布丁的補充說明. 至於 Hibernate 本人還沒有涉獵, 改天再向布丁請教

    回覆刪除
  3. 我的blog目前位於http://www.walkone.com.tw/blog/index.jsp?user_id=test

    有空可以來看看

    回覆刪除