java操作数据库---Statement对象和preparedStatement对象的区别(二)

在java操作数据库的程序中,通过Statement对象和preparedStatement对象都可以去调用execute()等操作数据库的操作,那么这两个对象有什么区别呢?


(一)两者的关系

 PreparedStatement接口继承Statement PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。

作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数


(二)对象创建

Satement对象: 通过调用Connection对象的createStatement()方法,来创建Satement对象

preparedStatement对象: 通过调用Connection对象的prepareStatement(String sql)方法来创建preparedStatement对象。

1.Statement对象 使用

String updateString = "update  table1 set sale = 75 " + "where  name like ′Colombian′"; 

或者 String updateString ="update table1 set sale = " +sale_value+"where name like '" + name_value+"'"
stmt.executeUpdate(updateString); 

2.preparedStatement对象使用

PreparedStatement updateSales = con.prepareStatement("UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? "); 
updateSales.setInt(1, 75); 
updateSales.setString(2, "Colombian"); 
updateSales.executeUpdate(); 

(三)区别

1. preparedSatement对象比使用Statement对象,执行sql语句快。(因为sql语句预先编译好了,Statement对象每执行一次都要编译一次。而preparedStatement对象其实是一个封装了某种sql操作的对象,所以每次动态设置好参数,执行时就解析一次preparedStatement对象,不用编译了)所以preparedStatement对象适合批量操作。

2. preparedStatement对象比Statement对象安全。举例如下:

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,;等做费尽心机的判断和过虑.

3.  在默认情况下,同一时间每个 Statement对象在只能打开一个 ResultSet对象。因此,如果读取一个 ResultSet对象与读取另一个交叉,则这两个对象必须是由不同的 Statement对象生成的。如果存在某个语句的打开的当前 ResultSet对象,则 Statement接口中的所有执行方法都会隐式关闭它。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值