preparedstatement和preparestatement的区别

作者&投稿:爨军 (若有异议请与网页底部的电邮联系)
java PreparedStatement与Statement区别?~

1、 PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。2、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法
execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数

3、在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替
Statement.也就是说,在任何时候都不要使用Statement.
基于以下的原因:
一.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
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 对象实例

不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.

二.PreparedStatement尽最大可能提高性能.
语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.

当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.

三.最重要的一点是极大地提高了安全性.

即使到目前为止,仍有一些人连基本的恶义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,并与之在两方面有所不同:
1、PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指定。相反的,该语句为每个 IN 参数保留一个问号(“?”)作为占位符。每个问号的值必须在该语句执行之前,通过适当的setXXX 方法来提供。
2、由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。
3、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象。

prepareStatement是Connection类的一个方法,作用是对sql语句进行预处理,发到数据库等待执行,该方法执行完之后会返回一个prreparedStatement对象,可以通过它设置sql中带有占位符的值,执行预处理sql语句等操作


清徐县17251213302: PreparedStatement - 搜狗百科
池荷酮康: jdbc(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力.在使用statement获取jdbc访问时所具有的一个共通的问题是输入适当格式的日期和时间戳:2002-02-05 20:56 ...

清徐县17251213302: java中的preparedstatement是什么意思 -
池荷酮康: prepared statement 准备语句; 准备好的报告 拼音双语对照 双语例句1 Asked about the legality of the killing, Carney read from a prepared statement.问道射杀的合法性,Carney读起了已经准备好的报告.2 Senator Donahue welcomed the witness cordially, after which Dr. Stavely read a prepared statement.参议员唐纳休和颜悦色地对证人表示欢迎,随后,斯塔弗利医生念了一份事先准备好的声明.

清徐县17251213302: PreparedStatement是干什么用的?用来数据库操作什么 -
池荷酮康: 预编译sql 的,例如 preparedStatement("select * from t where id = ?"); 然后传入参数的时候 ? 就会替换成你所需要的参数. 也可以时候 createStatement, 但是这个会有 sql 注入的问题

清徐县17251213302: JDBC中的Statement和PreparedStatement的区别 -
池荷酮康: Statement 用于执行静态 SQL 语句并返回它所生成结果的对象.在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象.因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对...

清徐县17251213302: PreparedStatement和Statement的区别 -
池荷酮康: 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程2.使用 Statement 对象.在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理.PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处.3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理

清徐县17251213302: java 中的PreparedStatement,preparestate定义? -
池荷酮康: PreparedStatement:表示预编译的 SQL 语句的对象. SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用此对象多次高效地执行该语句. 注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数...

清徐县17251213302: Statement和PreparedStatement之间的区别 -
池荷酮康: 最大的区别就是Statement创建的时候不需要传递进去sql,但是preparedStatement创建的时候就需要传递进去sql...Statement在执行一次性的查询的时候效果比preparement要好,但是在执行很多条sql语句时,preparedStatement不需要进行编译,相比之下Statement效率变的很低

清徐县17251213302: PreparedStatement的使用 -
池荷酮康: // PreparedStatement stm=con.prepareStatement("insert into TBL_USER values(?,?)");// stm.setString(1, user.getUname());// stm.setString(2, user.getUpass());// // int count=stm.executeUpdate();PreparedStatement stm=con.prepareStatement...

清徐县17251213302: PreparedStatement接口的常用方法及其描述 -
池荷酮康: 通过增删查改 4个最常用的功能讲吧.1 对于增删改来说 但是如果sql语句有?参数的话,需要先用到preparedStatement.setInt(1,参数值), 或者preparedStatement.setString(1,参数值)等等(那几种基本类型) . 其中1表示第几个?号. 最后调用...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网