參考:https://www.cnblogs.com/weiyi1314/p/6638483.html
一睹栖、技術(shù)原理
PreparedStatement接口繼承Statement,并有兩方面不同:
一是PreparedStatement對(duì)象已預(yù)編譯過(guò)年堆,其執(zhí)行速度要快于Statement對(duì)象斑匪。需要多次執(zhí)行的SQL語(yǔ)句應(yīng)創(chuàng)建為PreparedStatement對(duì)象以提高效率呐籽;
二是SQL語(yǔ)句在創(chuàng)建時(shí)可使用IN參數(shù)及其配套的setXXX方法設(shè)置SQL語(yǔ)句中的參數(shù),Statement的三種執(zhí)行方法execute/executeQuery/executeUpdate不再需要執(zhí)行參數(shù)蚀瘸。
二狡蝶、PreparedStatement的優(yōu)點(diǎn)
1.增強(qiáng)代碼的可讀性和可維護(hù)性
Statement設(shè)置的SQL語(yǔ)句
stmt.executeUpdate("insert into tb_name(col1,col2,col2,col4) values('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
PreparedStatement設(shè)置的SQL語(yǔ)句
perstmt=con.prepareStatement("insertintotb_name(col1,col2,col2,col4)values(?,?,?,?)");
perstmt.setString(1,var1);
perstmt.setString(2,var2);
perstmt.setString(3,var3);
perstmt.setString(4,var4);
perstmt.executeUpdate();
2.提高運(yùn)行性能
數(shù)據(jù)庫(kù)編譯器在執(zhí)行PreparedStatement代碼后,將會(huì)緩存該語(yǔ)句贮勃。下次調(diào)用相同的預(yù)編譯語(yǔ)句不再進(jìn)行編譯贪惹,直接將參數(shù)傳入編譯過(guò)的語(yǔ)句執(zhí)行代碼中。
而Statement語(yǔ)句僅僅是因?yàn)閭魅雲(yún)?shù)不同寂嘉,數(shù)據(jù)庫(kù)編譯器必須重新編譯馍乙,如下述兩條語(yǔ)句:
insert into tb_name(col1,col2) values('11','22');
insert into tb_name(col1,col2) values('11','23');
3.提高數(shù)據(jù)庫(kù)安全性
惡意SQL語(yǔ)句:
如下語(yǔ)句
String sql="select * from tb_name where name = '" + varname + "'and passwd='" + varpasswd + "'";
如果將varpassword值設(shè)為['or'1'='1],SQL語(yǔ)句變?yōu)?/p>
select * from tb_name = '隨意' and passwd='' or '1'='1';
因?yàn)椤?=1‘一直成立垫释,該條語(yǔ)句將被執(zhí)行,數(shù)據(jù)庫(kù)受到SQL注入攻擊撑瞧。
而使用預(yù)編譯語(yǔ)句時(shí)棵譬,你傳入的內(nèi)容就不會(huì)和原語(yǔ)句發(fā)生任何匹配關(guān)系。只要使用PreparedStatement预伺,就不用對(duì)傳入數(shù)據(jù)進(jìn)行任何過(guò)濾订咸,也免于SQL注入的威脅。
欲窮千里目酬诀,更上一層樓