Statement和PreparedStatement的含义

Statement

java.sql.Statement

public interface Statementextends 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 PreparedStatementextends Statement

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

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

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

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

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

   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEESSET 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不一定能做

Statement和PreparedStatement的含义及区别相关推荐

  1. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...

  2. Statement和PreparedStatement之间的区别(转)

    转自http://www.cnblogs.com/raymond19840709/archive/2008/10/13/1309657.html 1.PreparedStatement是预编译的,对于 ...

  3. Statement与PreparedStatement的区别

    Statement与PreparedStatement的区别 PreparedStatement预编译SQL语句,性能好. PreparedStatement无序拼接SQL语句,编程更简单. Prep ...

  4. sql语句和java的关系_java中Statement 与 PreparedStatement接口之间的关系和区别

    Statement 和 PreparedStatement之间的关系和区别. 关系:PreparedStatement继承自Statement,都是接口 区别:PreparedStatement可以使 ...

  5. 数据库SQL Server2012笔记(八)——Statement与PreparedStatement的区别,JDBC方式操作数据库...

    1.Statement与PreparedStatement的区别 1)都可用于  把sql语句从java程序中发送到制定数据库,并执行sql语句. 2)区别 直接使用Statement,驱动程序一般不 ...

  6. Statement和PreparedStatement的区别/PreparedStatement和Statement比较的优点

    Statement 和 PreparedStatement之间的关系和区别.     关系:PreparedStatement继承自Statement,都是接口     区别:PreparedStat ...

  7. 浅析Statement和PreparedStatement的区别

    当我们使用java程序来操作sql server时会使用到Statement和PreparedStatement,俩者都可以用于把sql语句从java程序中发送到指定数据库,并执行sql语句.那么如何 ...

  8. Statement和PreparedStatement的区别及联系

    两者之间的联系: Statement和PreparedStatement两者都是用来执行SQL查询语句的API之一 PreparedStatement接口继承了Statement接口 两者之间的区别: ...

  9. Statement, PreparedStatement和CallableStatement的区别

    Statement用于执行不带参数的简单SQL语句,并返回它所生成的结果,每次执行SQL豫剧时,数据库都要编译该SQL语句. Satatement stmt = conn.getStatement() ...

最新文章

  1. 【Leetcode】 刷题之路1(python)
  2. PHP反序列化漏洞总结
  3. 自动化打包资源混淆集成python实践----资源混淆
  4. Oracle杀事务数据库崩溃,关于pl/sql dev窗口崩溃导致锁表
  5. 一个社交电商小程序配套的平台接
  6. 输入姓名打印年龄练习
  7. Java问题解决:错误: 找不到或无法加载主类
  8. Main线程与main()方法的关系
  9. 单循环比赛规则-java
  10. Baxter 机器人仿真软件安装及演示
  11. android support v13,java – 程序类型已存在:android.support.v13.v...
  12. Centos7 上安装 FastDFS
  13. AD10 report_drc.xsl不存在解决方法
  14. tracking里面几种常见图的画法
  15. 用 Python 写个俄罗斯方块小游戏
  16. oracle utl file putf,UTL_FILE学习
  17. Python Flask教程学习02
  18. PLSQL_自治事务和嵌套事物的理解和用法(案例)
  19. node.js安装及环境配置
  20. python实现留一法_机器学习基础

热门文章

  1. 面向对象通识14(static修饰符)
  2. javaScript实现邮箱集成登陆
  3. 第3章第2节:使用HStack在水平方向排列视图 [SwiftUI快速入门到实战]
  4. 手指放在手机摄像头和闪光灯前检测心率的应用是什么原理?
  5. 为何品牌一定要做好控价
  6. 深击 | 运营商,只有“商”?
  7. 【译】为GatsbyJS选择一个合适的后端
  8. 【ipxe、clonezilla】iPXE启动Clonezilla实现镜像自动恢复及硬盘健康值检测探索
  9. 2022什么蓝牙耳机好?高品质的蓝牙耳机测评
  10. 电脑服务商行纯净版XP系统 高手第5代作品