??xml version="1.0" encoding="utf-8" standalone="yes"?>国产区在线观看成人精品,亚洲欧美日韩区,日韩一区二区三区电影在线观看http://www.aygfsteel.com/yeshucheng/archive/2010/12/14/340635.html叶澍?/dc:creator>叶澍?/author>Tue, 14 Dec 2010 05:58:00 GMThttp://www.aygfsteel.com/yeshucheng/archive/2010/12/14/340635.html在JDBC应用?如果你已l是E有水^开发?你就应该始终以PreparedStatement代替Statement.也就是说,在Q何时候都不要使用Statement.
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



]]>
վ֩ģ壺 | | ֹ| | ɽ| | ˺| ʡ| | | | ؿ˹| | ֽ| ʯ| | | | ϽϽ| Ϸ| տ| | | ָ| | Խ| | | | ˮ| ţ| | | | | | ʡ| ʡ| | | ͨ|