`
dickyzhu
  • 浏览: 107954 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Statement和PreparedStatement之间的区别

 
阅读更多
1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理
4.
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语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,它应该和普通的对象毫无差异,体现不出它预编译的优越性。
5.执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement对象。通常认为PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多次执行的时候。PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码的可读性。
注:
The best reasons for using PreparedStatements are these:

(1) Executing the same query multiple times in loop, binding different parameter values each time, and
(2) Using the setDate()/setString() methods to escape dates and strings properly, in a database-independent way.

The second one compels me to use PreparedStatement often, even if I'm not executing it in a loop. I don't have to worry about String or Date formatting that way.

I don't worry about the performance hit until it becomes a problem. Network latency is usually the bigger problem, and that has to do with the way queries are done rather the Statement vs PreparedStatement.
SQL injection attacks on a system are virtually impossible when using Prepared Statements.
what is SQL injection ?
Suppose your web application asks the user for their ID number. They type it into a box and click submit. This ends up calling the following method:
public List processUserID(String idNumber)
throws SQLException
{
String query = "SELECT role FROM roles WHERE id = '" + idNumber + "'";
ResultSet rs = this.connection.executeQuery(query);
// ... process results ...
}
If out of a sense of informed malice, your user enters the following text into the ID number field:

12345'; TRUNCATE role; SELECT '

They may be able to drop the contents of your role table, because the string that ends up in "query" will be:

SELECT role FROM roles WHERE id = '12345'; TRUNCATE role; SELECT ''

They have successfully injected SQL into your application that wasn't there before, hence the name. The specifics of this depend to some extent on your database, but there's some pretty portable SQL you can use to achieve this.

On the other hand, if you use a prepared statement:
public List processUserID(String idNumber)
throws SQLException
{
String query = "SELECT role FROM roles WHERE id = ?";
PreparedStatement statement = this.connection.prepare(query);
statement.setString(id,idNumber);

ResultSet rs = this.connection.executeQuery(query);
// ... process results ...
}
The database is told to compile the SQL in query first. The parameter is then submitted - so whatever you put into it will never get executed as SQL (well, ok, it's possible if you're passing it as a parameter to a stored proc, but it's very unlikely) - it will just return no matching records (because there won't be any users with id "12345'; TRUNCATE role; SELECT '"



分享到:
评论

相关推荐

    java中PreparedStatement和Statement的区别

    Java 中的 PreparedStatement 和 Statement 都是用于执行 SQL 语句的接口,但是它们之间存在一些关键的区别。 首先,从数据库执行 SQL 语句的角度来看,使用 PreparedStatement 语句可以提高数据库访问的效率。这是...

    prepareStatement和Statement的区别

    prepareStatement和Statement是 Java 中两个常用的数据库操作接口,它们都可以用来执行 SQL 语句,但是它们之间有着明显的区别。 首先,从创建时的区别开始,Statement 需要通过 Connection 对象的 createStatement...

    JDBC中PreparedStatement接口提供的execute、executeQuery和executeUpdate之间的区别及用法

    JDBC 中 PreparedStatement 接口提供的 execute、executeQuery 和 executeUpdate 之间的区别及用法 JDBC 中的 PreparedStatement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。...

    最全面Java面试题,从corejava到javaWeb共180多题(含答案)

    最全面Java面试题,从core...Statement 和PreparedStatement 之间的区别?120、JDBC,Hibernate 分页怎样实现?【中等难度】131、get 和post 的区别?【基础】177、请写出spring 中I0C 的三种实现机制。【中等难度】

    jdbc实例教程

    JDBC 类地图是 JDBC 的核心组件之一,提供了 JDBC 的类继承关系和类之间的关系。通过类地图,我们可以更好地理解 JDBC 的架构和实现机制。 数据库操作 数据库操作是 JDBC 的核心功能之一,包括插入数据、修改数据...

    java面试题大全--java基础,struts,spring,ejb等

    9.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。 10.找出下列代码可能存在的错误,并说明原因: 二、JSP&Servlet技术 1.描述JSP和Servlet的区别、共同点、各自应用的范围 2.在Web开发中需要...

    myBatis01.pdf

    JDBC API提供了各种方法来执行SQL语句,包括 Statement、PreparedStatement和CallableStatement等。 1.2.1 JDBC连接数据库 JDBC提供了多种方式来连接数据库,包括DriverManager和DataSource等。DriverManager提供...

    java语言程序设计课后习题答案.pdf

    * Statement和PreparedStatement:Statement和PreparedStatement是JDBC中的两个基本接口。 * ResultSet:ResultSet是JDBC中的一个基本接口,用于表示查询结果。 Java语言程序设计课后习题答案.pdf涵盖了Java语言的...

    Java 面试题 word文档

    9. Java 中访问数据库的步骤,Statement 和 PreparedStatement 之间的区别。 - 使用 JDBC 访问数据库的步骤包括:加载驱动、建立连接、创建语句、执行语句、关闭连接。 - Statement 和 PreparedStatement 的区别...

    一篇搞定JDBC【Mysql基础】

    演示只能使用Statement对象不能使用PreparedStatement的业务需求用户输入sql语句8.JDBC事务控制三段重要代码应用于数据库用户之间的转账9.悲观锁和乐观锁机制举栗子说明 1.JDBC Java Database Connectivity(java语言...

    jdbc连接各数据库及事务处理

    jdbc连接各数据库及事务处理

    JAVA面试资料大全-整理.zip

    2、 JDBC 中的 PreparedStatement 相比 Statement 的好处? 3、 Java 中实现多态的机制是什么? 4、 说出 ArrayList,Vector, LinkedList 的存储性能和特性 5、 Collection 和 Collections 的区别。 6、HashMap 和 ...

    Java-Web应用开发技术与案例教程-教学课件-张继军-第章JDBC数据库访问技术完整版资料.ppt

    DriverManager类负责管理JDBC驱动程序的基本服务,是JDBC的管理层,作用于用户和驱动程序之间,负责跟踪可用的驱动程序,并在数据库和驱动程序之间建立连接。DriverManager类即可用来建立数据库连接。 知识点四:...

    Java应届生面试题1.doc

    6. String 和 StringBuffer、StringBuilder 之间区别。(5 分) String 是不可变的,StringBuffer 和 StringBuilder 是可变的,后两个类都可以进行字符串的修改和追加操作。 二、 JSP 7. forward 和 redirect 的...

    JDBC笔记 JDBC笔记

    从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议。JDBC的实现由数据库厂商以驱动程序的形式提供。JDBC API 使得开发人员可以使用纯Java的方式来连接数据库,并进行操作。 ODBC:基于C语言的...

    java面试题

    int和Integer有什么区别? 答:int是java的原始数据类型,Integer是java为int提供的封装类,java为每个原始数据类型都提供了封装类。 String和StringBuffer的区别? 答:String是不可变的对象,每次对String类型进行...

    jdbc基础和参考

    //分别使用Statement对象和PreparedStatement对象实现 public class JDBCTest{ //查找s_user表中所有的数据,并且返回他们的集合 public Collection<User> findAll(){ } //按照名字进行删除 public int ...

    Java面试宝典2020修订版V1.0.1.doc

    20、JDBC中的PreparedStatement相比Statement的好处 71 21、写一个用jdbc连接实例。 71 22、ArrayList和Vector的区别? 73 23、List、Set和Map的区别? 74 24、Collection 和 Collections的区别。 74 25、Set里的...

    JAVAEE-期末卷-选择填空-已整理.doc

    知识点解释:java.sql.Statement 对象代表一条发送到数据库执行的 SQL 语句,包括 PreparedStatement、CallableStatement 和 Statement 三种。 12. Servlets 可以使用 MIME 类型来向浏览器传送非 HTML 文件。 知识...

Global site tag (gtag.js) - Google Analytics