Statement和PreparedStatement的含义及区别

Statement和PreparedStatement的含义

Statement

java.sql.Statement

public interface Statement
      extends 
      Wrapper

用于执行静态 SQL 语句并返回它所生成结果的对象。

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

常用方法:

void	close() 
        立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。
boolean	execute(String sql) 
		执行给定的 SQL 语句,该语句可能返回多个结果。
boolean	execute(String sql, int autoGeneratedKeys) 
         执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序所有自动生成的键都应该可用于获取。
ResultSet	executeQuery(String sql) 
         执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。 
executeUpdate(String sql) 
         执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。  
Connection	getConnection() 
         获取生成此 Statement 对象的 Connection 对象。
ResultSet	getResultSet() 
         以 ResultSet 对象的形式获取当前结果。
                                            		

PreparedStatement

public interface PreparedStatement
      extends 
      Statement

表示预编译的 SQL 语句的对象。

SQL 语句被预编译并存储在 PreparedStatement 对象中,然后可以使用此对象多次高效地执行该语句。

注:用于设置 IN 参数值的设置方法(setShort、setString 等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER,那么应该使用 setInt 方法。

如果需要任意参数类型转换,使用 setObject 方法时应该将目标 SQL 类型作为其参数。

在以下设置参数的示例中,con 表示一个活动连接:

   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setInt(2, 110592)
   问号表示占位符

PreparedStatement的executeQuery方法

executeQuery
ResultSet executeQuery()
                       throws SQLException

在此 PreparedStatement 对象中执行 SQL 查询,并返回该查询生成的 ResultSet 对象。
返回:
包含该查询生成的数据的 ResultSet 对象;不会返回 null
抛出:
SQLException - 如果发生数据库访问错误,在关闭的 PreparedStatement 上调用此方法,或者 SQL 语句没有返回 ResultSet 对象

PreparedStatement的executeUpdate方法

executeUpdate
int executeUpdate()
                  throws SQLException

在此 PreparedStatement 对象中执行 SQL 语句,该语句必须是一个 SQL 数据操作语言(Data Manipulation Language,DML)语句,比如 INSERT、 UPDATE 或 DELETE 语句;或者是无返回内容的 SQL 语句,比如 DDL 语句。
返回:
(1) SQL 数据操作语言 (DML) 语句的行数
(2) 对于无返回内容的 SQL 语句,返回 0
抛出:
SQLException - 如果发生数据库访问错误,在关闭的 PreparedStatement 上调用此方法,或者 SQL 语句返回一个 ResultSet 对象
由于PreparedStatement继承了Statement,Statement有的方法,PreparedStatement都会有的,这里不做介绍

Statement和PreparedStatement的区别

1、性能方面

Statement statement = conn.createStatement();
PreparedStatement preparedStatement = conn.preparedStatement(sql);

执行的时候

ResulteSet rSet = statement.executeQuery(sql);
ResultSet pSet = preparedStatement.executeQuery();

以上可以看出,PreparedStatement有预编译的过程,而且绑定了sql语句,无论执行多少遍,都不会再次进行编译。而Statement则不同,sql执行多少遍,就需要编译多少遍,所以PreparedStatement效率要比Statement高

2、代码的可读性和维护性

虽然用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 对象实例

3、安全性问题

即使到目前为止,仍有一些人连基本的恶义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;
	select * from tb_name where name= 'zhangsan' and passwd = '123' ; trop table 		tb_name;
	有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行

4、继承关系

作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能,
Statement对象能做的操作Preparedstatement都能做,Preparedstatement能做的Statement不一定能做

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值