1. 程式人生 > >轉載----PreparedStatement和Statement的區別

轉載----PreparedStatement和Statement的區別

應該 lec 一個 執行 但是 驗證 語句 log ()

1>PreparedStatement用於處理動態SQL語句,在執行前會有一個預編譯過程,這個過程是有時間開銷的,雖然相對數據庫的操作,該時間開銷可以忽略不計,但是PreparedStatement的預編譯結果會被緩存,下次執行相同的預編譯語句時,就不需要編譯,只要將參數直接傳入編譯過的語句執行代碼中就會得到執行,所以,對於批量處理可以大大提高效率。

2>Statement每次都會執行SQL語句,相關數據庫都要執行SQL語句的編譯。

3>作為開發者,應該盡可能以PreparedStatement代替Statement,其原因如下:

(1)代碼的可讀性和可維護性。從代碼比較中就應該能看出來;

技術分享
stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values (‘"+var1+"‘,‘"+var2+"‘,"+var3+",‘"+var4+"‘)");//stmt是Statement對象實例

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(); //prestmt是 PreparedStatement 對象實例
技術分享

(2)PreparedStatement盡最大可能提高性能。

(3)極大的提高了安全性。

惡意SQL語法

String sql = "select * from tb_name where name= ‘"+varname+"‘ and passwd=‘"+varpasswd+"‘";
如果我們把[‘ or ‘1‘ = ‘1]作為varpasswd傳入進來.用戶名隨意,看看會成為什麽?
select * from tb_name = ‘隨意‘ and passwd = ‘‘ or ‘1‘ = ‘1‘;
因為‘1‘=‘1‘肯定成立,所以可以任何通過驗證.更有甚者:
把[‘;drop table tb_name;]作為varpasswd傳入進來,則:
select * from tb_name = ‘隨意‘ and passwd = ‘‘;drop table tb_name;有些數據庫是不會讓你成功的,但也有很多數據庫就可以使這些語句得到執行.
而如果你使用預編譯語句.你傳入的任何內容就不會和原來的語句發生任何匹配的關系.只要全使用預編譯語句,你就用不著對傳入的數據做任何過慮.而如果使用普通的statement,有可能要對drop,;等做費盡心機的判斷和過慮.

轉載----PreparedStatement和Statement的區別