Statement与PreparedStatement的区别
Statement與PreparedStatement的區(qū)別
PreparedStatement預(yù)編譯SQL語(yǔ)句,性能好。
PreparedStatement無(wú)序拼接SQL語(yǔ)句,編程更簡(jiǎn)單.
PreparedStatement可以防止SQL注入,安全性好。
?
?
Statement由方法createStatement()創(chuàng)建,該對(duì)象用于發(fā)送簡(jiǎn)單的靜態(tài)的SQL語(yǔ)句。
PreparedStatement由方法preparedStatement()創(chuàng)建,該對(duì)象用于發(fā)送帶有一個(gè)
或多個(gè)輸入?yún)?shù)的SQL語(yǔ)句。該方法繼承了Statement的所有方法。并進(jìn)行了擴(kuò)展。
SQL語(yǔ)句使用“?”作為數(shù)據(jù)占位符,使用setXxx()方法設(shè)置數(shù)據(jù)。
?setXxx()方法的第一個(gè)參數(shù)誰(shuí)要設(shè)置參數(shù)的序數(shù)位置,第二個(gè)參數(shù)時(shí)設(shè)置給該參數(shù)的值。
?
?
//Statement的用法
int id=111;
String sql="selsect * from user where id="+id;
Statement st=connection.CreateStatement();
ResultSet rs=st.executeQuery(sql);
//PreparedStatement的用法
//PreparedStatement可替換變量(在SQL語(yǔ)句中可以包含?)
String sql="select * from user where id=?";
PreparedStatement ps=connection.preparedStatement(sql);//sql在這里進(jìn)行預(yù)編譯
int id =111;
ps.setInt(1,id);//為sql傳入?yún)?shù)
ResultSet rs=ps.executeQuery();//這里不需要sql,因?yàn)樯厦骖A(yù)編譯過(guò)
?
1.PreparedStatement是預(yù)編譯的,對(duì)于批量處理可以大大提高效率. 也叫JDBC存儲(chǔ)過(guò)程 2.使用 Statement 對(duì)象。在對(duì)數(shù)據(jù)庫(kù)只執(zhí)行一次性存取的時(shí)侯,用 Statement 對(duì)象進(jìn)行處理。PreparedStatement 對(duì)象的開(kāi)銷(xiāo)比Statement大,對(duì)于一次性操作并不會(huì)帶來(lái)額外的好處。 3.statement每次執(zhí)行sql語(yǔ)句,相關(guān)數(shù)據(jù)庫(kù)都要執(zhí)行sql語(yǔ)句的編譯,preparedstatement是預(yù)編譯得,?? preparedstatement支持批處理 4. Code Fragment 1:String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE ′Colombian′";
stmt.executeUpdate(updateString);
Code Fragment 2:
PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? ");
updateSales.setInt(1, 75);
updateSales.setString(2, "Colombian");
updateSales.executeUpdate();
片斷2和片斷1的區(qū)別在于,后者使用了PreparedStatement對(duì)象,而前者是普通的Statement對(duì)象。PreparedStatement對(duì)象不僅包含了SQL語(yǔ)句,而且大多數(shù)情況下這個(gè)語(yǔ)句已經(jīng)被預(yù)編譯過(guò),因而當(dāng)其執(zhí)行時(shí),只需DBMS運(yùn)行SQL語(yǔ)句,而不必先編譯。當(dāng)你需要執(zhí)行Statement對(duì)象多次的時(shí)候,PreparedStatement對(duì)象將會(huì)大大降低運(yùn)行時(shí)間,當(dāng)然也加快了訪問(wèn)數(shù)據(jù)庫(kù)的速度。
這種轉(zhuǎn)換也給你帶來(lái)很大的便利,不必重復(fù)SQL語(yǔ)句的句法,而只需更改其中變量的值,便可重新執(zhí)行SQL語(yǔ)句。選擇PreparedStatement對(duì)象與否,在于相同句法的SQL語(yǔ)句是否執(zhí)行了多次,而且兩次之間的差別僅僅是變量的不同。如果僅僅執(zhí)行了一次的話,它應(yīng)該和普通的對(duì)象毫無(wú)差異,體現(xiàn)不出它預(yù)編譯的優(yōu)越性。 5.執(zhí)行許多SQL語(yǔ)句的JDBC程序產(chǎn)生大量的Statement和PreparedStatement對(duì)象。通常認(rèn)為PreparedStatement對(duì)象比Statement對(duì)象更有效,特別是如果帶有不同參數(shù)的同一SQL語(yǔ)句被多次執(zhí)行的時(shí)候。PreparedStatement對(duì)象允許數(shù)據(jù)庫(kù)預(yù)編譯SQL語(yǔ)句,這樣在隨后的運(yùn)行中可以節(jié)省時(shí)間并增加代碼的可讀性。
轉(zhuǎn)載于:https://www.cnblogs.com/liubin1988/p/8999159.html
總結(jié)
以上是生活随笔為你收集整理的Statement与PreparedStatement的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦到吃虾什么意思
- 下一篇: module_param 用于动态开启/