为什么要始终使用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
分享到:
相关推荐
PreparedStatement对象相比Statement对象具有更多的优点,因此在实际开发中,建议使用PreparedStatement对象来代替Statement对象。 知识点: 1. Statement对象和PreparedStatement对象的区别 2. PreparedStatement...
8. **预编译的PreparedStatement优点**: - 性能优化:SQL语句预编译后,数据库只需解析一次。 - 安全性:参数化查询能有效防止SQL注入攻击。 - 可读性:对于复杂的SQL,预编译后的语句更易读。 9. **连接池**:...
下面将详细介绍 PreparedStatement 的使用方法和优点。 PreparedStatement 的定义 PreparedStatement 是一种预编译的 SQL 语句,用于执行数据库的 CRUD 操作。它可以将 SQL 语句与参数分离,提高了执行效率和安全...
预编译的优点主要包括: 1. **效率提升**:由于SQL语句已经预编译,执行时避免了编译过程,从而提高了执行速度。这对于大量重复执行的SQL语句来说,性能提升尤为显著。 2. **防止SQL注入**:PreparedStatement通过...
与`Statement`相比,`PreparedStatement`有以下几个显著优点: 1. **性能提升**: - 预编译SQL语句可以显著减少数据库服务器解析SQL的时间。 - 对于重复执行的SQL语句,预编译只会在第一次执行时发生,后续执行会...
PreparedStatement PreparedStatement 是 Statement 的扩展,主要用于执行预编译的 SQL 语句。它的主要优点和缺点如下: 优点: - PreparedStatement 支持参数化查询,通过占位符(问号)来代替具体的值,避免了 ...
- **优点**:防止SQL注入攻击,提高执行效率(因为数据库只需解析一次SQL),适合多次重复执行相同结构但参数不同的SQL。 示例代码: ```java // 创建连接 Connection conn = DriverManager.getConnection(url, ...
PreparedStatement的用法 jdbc(java database connectivity,...由于preparedstatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement。
这有以下优点: - 提高性能:预编译的SQL语句可以重复使用,避免了每次执行时的编译过程。 - 防止SQL注入:占位符机制使得参数值与SQL语句结构分离,增加了安全性。 - 支持类型安全:Java方法可以确保参数类型...
- 优点: - 解耦了 SQL 代码和 Java 代码,使得 SQL 代码易于管理。 - 提供动态 SQL 和数据库无关性。 - 可以维护 XML 格式的 SQL 映射文件,方便团队开发时维护。 - 缺点: - 需要额外编写 MyBatis 的配置...
此外,使用PreparedStatement还有其他几个优点。首先,它能够帮助我们提高安全性能。因为PreparedStatement自动对传入的参数进行转义处理,所以能够有效防止SQL注入攻击,这对于维护Web应用的安全至关重要。而使用...
PreparedStatement是JDBC提供的一种预编译的SQL语句,它的主要优点在于性能和安全性。 - **预编译优势**:PreparedStatement首先在数据库层面创建好可执行的程序,这个程序是编译过的二进制代码,后续只需要传递...
- **优点**:使用`PreparedStatement`可以显著提高应用程序的性能和安全性。预编译的SQL语句减少了与数据库的通信次数,同时也避免了SQL注入攻击的风险。 #### 2. 创建PreparedStatement对象 ```java // 假设con是...
首先,PreparedStatement相较于普通的Statement对象,其主要优点在于执行速度更快和SQL语句的参数化。当PreparedStatement实例化时,会预先指定一个SQL语句,这个语句会被直接发送到数据库进行编译。因此,当同一个...
PreparedStatement接口的主要优点在于它允许程序员在SQL语句中使用占位符(通常为'?'),这些占位符将在运行时被实际的参数值替换。这样可以防止SQL注入攻击,并且由于SQL语句在首次执行时会被编译,后续的执行无需...
对比两者,`PreparedStatement`有以下优点: - 性能:预编译的SQL语句可以减少解析和编译的时间,尤其在大量重复执行时。 - 安全性:通过占位符避免了SQL注入,提高了应用程序的安全性。 - 易于读写:复杂的SQL语句...
在实际编程中,使用PreparedStatement的主要优点有: 1. **性能提升**:由于预编译的SQL语句在首次执行时会被数据库解析并生成执行计划,后续的执行只需传入参数即可,避免了重复解析的过程,提高了执行效率。 2. ...
4. PreparedStatement:PreparedStatement是Statement的子接口,它的优点在于预编译SQL语句,提高效率并支持参数化查询,防止SQL注入攻击。与Statement相比,它更安全,性能更好。 5. CallableStatement:...
此外,使用PreparedStatement还有以下优点: - **缓存和重用**:数据库可以缓存PreparedStatement对象,多次执行时无需重复创建,进一步提高性能。 - **类型安全**:Java类型和SQL类型之间的转换由JDBC驱动处理,...
PreparedStatement是JDBC中预编译的SQL语句,相比Statement,它有以下优点: 1. 预编译的SQL语句更高效,因为数据库可以预先解析并优化。 2. 支持参数绑定,提高安全性,防止SQL注入攻击。 3. 对于重复执行的SQL语句...