PreparedStatement的用法
轉載:http://www.cnblogs.com/raymond19840709/archive/2008/05/12/1192948.html
jdbc(java database connectivity,java數據庫連接)的api中的主要的四個類之一的java.sql.statement要求開發者付出大量的時間和精力。在使用statement獲取jdbc訪問時所具有的一個共通的問題是輸入適當格式的日期和時間戳:2002-02-05 20:56 或者 02/05/02 8:56 pm。
通過使用java.sql.preparedstatement,這個問題可以自動解決。一個preparedstatement是從java.sql.connection對象和所提供的sql字符串得到的,sql字符串中包含問號(?),這些問號標明變量的位置,然後提供變量的值,最後執行語句,例如:
stringsql = "select * from people p where p.id = ? and p.name = ?"; preparedstatement ps = connection.preparestatement(sql); ps.setint(1,id); ps.setstring(2,name); resultset rs = ps.executequery();
使用preparedstatement的另一個優點是字符串不是動態創建的。下面是一個動態創建字符串的例子:
stringsql = "select * from people p where p.i = "+id;
這允許jvm(javavirtual machine,java虛擬機)和驅動/數據庫緩存語句和字符串並提高性能。
preparedstatement也提供數據庫無關性。當顯示聲明的sql越少,那麽潛在的sql語句的數據庫依賴性就越小。
由於preparedstatement具備很多優點,開發者可能通常都使用它,只有在完全是因為性能原因或者是在一行sql語句中沒有變量的時候才使用通常的statement。
一個完整的preparedstatement的例子:
package jstarproject; import java.sql.*; public class mypreparedstatement { private final string db_driver="com.microsoft.jdbc.sqlserver.sqlserverdriver"; private final string url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databasename=pubs"; public mypreparedstatement() { } public void query() throws sqlexception{ connection conn = this.getconnection(); string strsql = "select emp_id from employee where emp_id = ?"; preparedstatement pstmt = conn.preparestatement(strsql); pstmt.setstring(1,"pma42628m"); resultset rs = pstmt.executequery(); while(rs.next()){ string fname = rs.getstring("emp_id"); system.out.println("the fname is " + fname); } rs.close(); pstmt.close(); conn.close(); } private connection getconnection() throws sqlexception{ // class. connection conn = null; try { class.forname(db_driver); conn = drivermanager.getconnection(url,"sa","sa"); } catch (classnotfoundexception ex) {} return conn; } //main public static void main(string[] args) throws sqlexception { mypreparedstatement jdbctest1 = new mypreparedstatement(); jdbctest1.query(); }
}
為什麽要始終使用PreparedStatement代替Statement?為什麽要始終使用PreparedStatement代替Statement?
在JDBC應用中,如果你已經是稍有水平開發者,你就應該始終以PreparedStatement代替Statement.也就是說,在任何時候都不要使用Statement.
基於以下的原因:
一.代碼的可讀性和可維護性.
雖然用PreparedStatement來代替Statement會使代碼多出幾行,但這樣的代碼無論從可讀性還是可維護性上來說.都比直接用Statement的代碼高很多檔次:
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values (‘"+var1+"‘,‘"+var2+"‘,"+var3+",‘"+var4+"‘)"); perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); perstmt.setString(1,var1); perstmt.setString(2,var2); perstmt.setString(3,var3); perstmt.setString(4,var4); perstmt.executeUpdate();
PreparedStatement的用法