`

PreparedStatement优点

    博客分类:
  • jdbc
阅读更多
为什么要始终使用PreparedStatement代替Statement?


在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement.
基于以下的原因:
一.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:

java 代码

1. stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");
2.
3. perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)");
4. perstmt.setString(1,var1);
5. perstmt.setString(2,var2);
6. perstmt.setString(3,var3);
7. perstmt.setString(4,var4);
8. perstmt.executeUpdate();



不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心.

二.PreparedStatement尽最大可能提高性能.
每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个 Connection中多次执行的预编译语句被缓存,而是对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.比如:
insert into tb_name (col1,col2) values ('11','22');
insert into tb_name (col1,col2) values ('11','23');
即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.

当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句.

三.最重要的一点是极大地提高了安全性.

即使到目前为止,仍有一些人连基本的恶义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;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行.

而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑.

转自:http://huangchao200701.iteye.com/blog/255196
分享到:
评论

相关推荐

    Statement和PreparedStatement之间的区别

    PreparedStatement对象相比Statement对象具有更多的优点,因此在实际开发中,建议使用PreparedStatement对象来代替Statement对象。 知识点: 1. Statement对象和PreparedStatement对象的区别 2. PreparedStatement...

    java十分经典的jdbc增删改查程序,含sql语句

    8. **预编译的PreparedStatement优点**: - 性能优化:SQL语句预编译后,数据库只需解析一次。 - 安全性:参数化查询能有效防止SQL注入攻击。 - 可读性:对于复杂的SQL,预编译后的语句更易读。 9. **连接池**:...

    Java数据库连接PreparedStatement的使用详解

    下面将详细介绍 PreparedStatement 的使用方法和优点。 PreparedStatement 的定义 PreparedStatement 是一种预编译的 SQL 语句,用于执行数据库的 CRUD 操作。它可以将 SQL 语句与参数分离,提高了执行效率和安全...

    JDBC之PreparedStatement类中预编译的综合应用解析

    预编译的优点主要包括: 1. **效率提升**:由于SQL语句已经预编译,执行时避免了编译过程,从而提高了执行速度。这对于大量重复执行的SQL语句来说,性能提升尤为显著。 2. **防止SQL注入**:PreparedStatement通过...

    java精典编程100例 36

    与`Statement`相比,`PreparedStatement`有以下几个显著优点: 1. **性能提升**: - 预编译SQL语句可以显著减少数据库服务器解析SQL的时间。 - 对于重复执行的SQL语句,预编译只会在第一次执行时发生,后续执行会...

    东北大学高级java最全简答题(考试考的都有)

    PreparedStatement PreparedStatement 是 Statement 的扩展,主要用于执行预编译的 SQL 语句。它的主要优点和缺点如下: 优点: - PreparedStatement 支持参数化查询,通过占位符(问号)来代替具体的值,避免了 ...

    jdbc 增删改查事物处理, 批处理,以及预编译示例代码

    - **优点**:防止SQL注入攻击,提高执行效率(因为数据库只需解析一次SQL),适合多次重复执行相同结构但参数不同的SQL。 示例代码: ```java // 创建连接 Connection conn = DriverManager.getConnection(url, ...

    Java WEB访问数据库

    PreparedStatement的用法 jdbc(java database connectivity,...由于preparedstatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement。

    第10章 JDBC-课后习题1

    这有以下优点: - 提高性能:预编译的SQL语句可以重复使用,避免了每次执行时的编译过程。 - 防止SQL注入:占位符机制使得参数值与SQL语句结构分离,增加了安全性。 - 支持类型安全:Java方法可以确保参数类型...

    MyBatis使用手册PDF

    - 优点: - 解耦了 SQL 代码和 Java 代码,使得 SQL 代码易于管理。 - 提供动态 SQL 和数据库无关性。 - 可以维护 XML 格式的 SQL 映射文件,方便团队开发时维护。 - 缺点: - 需要额外编写 MyBatis 的配置...

    statement和prepared区别

    此外,使用PreparedStatement还有其他几个优点。首先,它能够帮助我们提高安全性能。因为PreparedStatement自动对传入的参数进行转义处理,所以能够有效防止SQL注入攻击,这对于维护Web应用的安全至关重要。而使用...

    tsinghua(java)

    PreparedStatement是JDBC提供的一种预编译的SQL语句,它的主要优点在于性能和安全性。 - **预编译优势**:PreparedStatement首先在数据库层面创建好可执行的程序,这个程序是编译过的二进制代码,后续只需要传递...

    抓取网页数据的代码

    - **优点**:使用`PreparedStatement`可以显著提高应用程序的性能和安全性。预编译的SQL语句减少了与数据库的通信次数,同时也避免了SQL注入攻击的风险。 #### 2. 创建PreparedStatement对象 ```java // 假设con是...

    第24讲 JDBC编程2.ppt

    首先,PreparedStatement相较于普通的Statement对象,其主要优点在于执行速度更快和SQL语句的参数化。当PreparedStatement实例化时,会预先指定一个SQL语句,这个语句会被直接发送到数据库进行编译。因此,当同一个...

    JAVA学习使用JDBC的高级特征创建应用程序PPT教案学习.pptx

    PreparedStatement接口的主要优点在于它允许程序员在SQL语句中使用占位符(通常为'?'),这些占位符将在运行时被实际的参数值替换。这样可以防止SQL注入攻击,并且由于SQL语句在首次执行时会被编译,后续的执行无需...

    jdbc经典实例

    对比两者,`PreparedStatement`有以下优点: - 性能:预编译的SQL语句可以减少解析和编译的时间,尤其在大量重复执行时。 - 安全性:通过占位符避免了SQL注入,提高了应用程序的安全性。 - 易于读写:复杂的SQL语句...

    JAVA Web程序设计-3期(KC006) 08单元案例_预编译和存储过程操作教学案例.doc

    在实际编程中,使用PreparedStatement的主要优点有: 1. **性能提升**:由于预编译的SQL语句在首次执行时会被数据库解析并生成执行计划,后续的执行只需传入参数即可,避免了重复解析的过程,提高了执行效率。 2. ...

    JDBC技术使用标准的 SQL 语言对数据库表中的数据进行访问,以及增删查改

    4. PreparedStatement:PreparedStatement是Statement的子接口,它的优点在于预编译SQL语句,提高效率并支持参数化查询,防止SQL注入攻击。与Statement相比,它更安全,性能更好。 5. CallableStatement:...

    在Java中实现Oracle变量的绑定方法 .doc

    此外,使用PreparedStatement还有以下优点: - **缓存和重用**:数据库可以缓存PreparedStatement对象,多次执行时无需重复创建,进一步提高性能。 - **类型安全**:Java类型和SQL类型之间的转换由JDBC驱动处理,...

    atguigu的JDBC资料

    PreparedStatement是JDBC中预编译的SQL语句,相比Statement,它有以下优点: 1. 预编译的SQL语句更高效,因为数据库可以预先解析并优化。 2. 支持参数绑定,提高安全性,防止SQL注入攻击。 3. 对于重复执行的SQL语句...

Global site tag (gtag.js) - Google Analytics