A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在执行sql语句的时候,我们比较常用的就是PreparedStatement,有时也会用到Statement,对于我来说,一直都是使用PreparedStatement。
但是,当我使用Statement的时候也是没有问题的,我就是想知道,PreparedStatement和Statement有什么区别?在什么情况下应该用什么?

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

3 个回复

正序浏览
java中的PreparedStatement 接口继承了Statement,并与之在两方面有所不同:、
有人主张,在JDBC应用中,如果你已经是稍有水平开发者,
你就应该始终以PreparedStatement代替Statement.
也就是说,在任何时候都不要使用Statement。
由于 PreparedStatement 对象已预编译过,所以其执行速度要快于 Statement 对象。
因此,多次执行的 SQL 语句经常创建为 PreparedStatement 对象,以提高效率。

作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。
另外它还添加了一整套方法,用于设置发送给数据库以取代 IN 参数占位符的值。
同时,三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。
这些方法的 Statement 形式(接受 SQL 语句参数的形式)不应该用于 PreparedStatement 对象。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
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的区别在于,后者使用了PreparedStatement对象,而前者是普通的Statement对象。PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度。
这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
主要有两点
1、preparedStatement的效率要比Statement的效率要高,因为preparedStatement会预编译,会把编译后的语句放入缓存,如果后面有一样的SQL要执行,只要替换参数即可。不像statement每次都得重新生成新的SQL
2、preparedStatement可以防止SQL注入,比如用户在注册的时候填写一句 or "1=1" 如果你用Statement,那么最后的SQL的结构就改变了你原来的SQL了。
如果是preparedStatement,他早就预编译了,他的SQL结构是不会变的了 ,顶多把 or "1=1" 这个整个串作为一个参数传进去。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马