Statement和PreparedStatement的含义及区别
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的含义及区别相关推荐
- Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...
- Statement和PreparedStatement之间的区别(转)
转自http://www.cnblogs.com/raymond19840709/archive/2008/10/13/1309657.html 1.PreparedStatement是预编译的,对于 ...
- Statement与PreparedStatement的区别
Statement与PreparedStatement的区别 PreparedStatement预编译SQL语句,性能好. PreparedStatement无序拼接SQL语句,编程更简单. Prep ...
- sql语句和java的关系_java中Statement 与 PreparedStatement接口之间的关系和区别
Statement 和 PreparedStatement之间的关系和区别. 关系:PreparedStatement继承自Statement,都是接口 区别:PreparedStatement可以使 ...
- 数据库SQL Server2012笔记(八)——Statement与PreparedStatement的区别,JDBC方式操作数据库...
1.Statement与PreparedStatement的区别 1)都可用于 把sql语句从java程序中发送到制定数据库,并执行sql语句. 2)区别 直接使用Statement,驱动程序一般不 ...
- Statement和PreparedStatement的区别/PreparedStatement和Statement比较的优点
Statement 和 PreparedStatement之间的关系和区别. 关系:PreparedStatement继承自Statement,都是接口 区别:PreparedStat ...
- 浅析Statement和PreparedStatement的区别
当我们使用java程序来操作sql server时会使用到Statement和PreparedStatement,俩者都可以用于把sql语句从java程序中发送到指定数据库,并执行sql语句.那么如何 ...
- Statement和PreparedStatement的区别及联系
两者之间的联系: Statement和PreparedStatement两者都是用来执行SQL查询语句的API之一 PreparedStatement接口继承了Statement接口 两者之间的区别: ...
- Statement, PreparedStatement和CallableStatement的区别
Statement用于执行不带参数的简单SQL语句,并返回它所生成的结果,每次执行SQL豫剧时,数据库都要编译该SQL语句. Satatement stmt = conn.getStatement() ...
最新文章
- 【Leetcode】 刷题之路1(python)
- PHP反序列化漏洞总结
- 自动化打包资源混淆集成python实践----资源混淆
- Oracle杀事务数据库崩溃,关于pl/sql dev窗口崩溃导致锁表
- 一个社交电商小程序配套的平台接
- 输入姓名打印年龄练习
- Java问题解决:错误: 找不到或无法加载主类
- Main线程与main()方法的关系
- 单循环比赛规则-java
- Baxter 机器人仿真软件安装及演示
- android support v13,java – 程序类型已存在:android.support.v13.v...
- Centos7 上安装 FastDFS
- AD10 report_drc.xsl不存在解决方法
- tracking里面几种常见图的画法
- 用 Python 写个俄罗斯方块小游戏
- oracle utl file putf,UTL_FILE学习
- Python Flask教程学习02
- PLSQL_自治事务和嵌套事物的理解和用法(案例)
- node.js安装及环境配置
- python实现留一法_机器学习基础