??xml version="1.0" encoding="utf-8" standalone="yes"?>
Z以下的原?
一.代码的可L和可维护?
虽然用PreparedStatement来代替Statement会代码多出几行,但这L代码无论从可L还是可l护性上来说.都比直接用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();
不用我多?对于W一U方?别说其他人去M的代?是你自p一D|间再去读,都会觉得伤心.
?PreparedStatement最大可能提高性能.
每一U数据库都会最大努力对预编译语句提供最大的性能优化.因ؓ预编译语句有可能被重复调?所以语句在被DB的编译器~译后的执行代码被缓存下?那么下次调用时只要是相同的预~译语句׃需要编?只要参数直接传入编译过的语句执行代码中(相当于一个涵?׃得到执行.qƈ不是说只有一?Connection中多ơ执行的预编译语句被~存,而是对于整个DB?只要预编译的语句语法和缓存中匚w.那么在Q何时候就可以不需要再ơ编译而可以直接执?而statement的语句中,即是相同一操作,而由于每ơ操作的数据不同所以整个语句相匹配的Z极小,几乎不太可能匚w.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即是相同操作但因ؓ数据内容不一?所以整个个语句本n不能匚w,没有~存语句的意?事实是没有数据库会对普通语句编译后的执行代码缓?q样每执行一ơ都要对传入的语句编译一?
当然q不是所以预~译语句都一定会被缓?数据库本w会用一U策?比如使用频度{因素来军_什么时候不再缓存已有的预编译结?以保存有更多的空间存储新的预~译语句.
?最重要的一Ҏ极大地提高了安全?
即到目前ؓ?仍有一些hq基本的恶义SQL语法都不知道.
String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";
如果我们把[' or '1' = '1]作ؓvarpasswd传入q来.用户名随?看看会成Z?
select * from tb_name = '随意' and passwd = '' or '1' = '1';
因ؓ'1'='1'肯定成立,所以可以Q何通过验证.更有甚?
把[';drop table tb_name;]作ؓvarpasswd传入q来,?
select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功?但也有很多数据库可以ɘq些语句得到执行.
而如果你使用预编译语?你传入的M内容׃会和原来的语句发生Q何匹配的关系.(前提是数据库本n支持预编?但上前可能没有什么服务端数据库不支持~译?只有数的桌面数据库,是直接文g讉K的那?只要全用预~译语句,你就用不着对传入的数据做Q何过?而如果用普通的statement, 有可能要对drop,;{做费尽心机的判断和q虑.
上面的几个原?q不你在M时候都使用PreparedStatement?
有的Ch可能此时对于用法q不太理解下面给个小例子
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();
set中的1对应W一个? 2对应W二个? 同时注意你set 的类?是intq是string 哈哈很简单吧
原文出处Q?span style="font-family: Simsun; line-height: normal; font-size: medium; ">http://blog.csdn.net/spcusa/archive/2009/05/09/4164076.aspx