`
498320858
  • 浏览: 393090 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java的sql中的preparedStatement和Statement 的区别

阅读更多

在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement

一.代码的可读性和可维护性.
虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:

stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')");

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();

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

二.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,;等做费尽心机的判断和过虑.

上面的几个原因,还不足让你在任何时候都使用PreparedStatement吗?
参考资料:http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=10397&start=0&tstart=0

分享到:
评论

相关推荐

    java中PreparedStatement和Statement的区别

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

    如何获得PreparedStatement最终执行的sql语句

    在Java的JDBC编程中,`PreparedStatement`是一个非常重要的接口,它用于预编译SQL语句,提高了数据库操作的效率和安全性。当我们处理大量重复的SQL操作时,使用`PreparedStatement`可以避免SQL注入等问题,同时提升...

    PreparedStatement和Statement

    在Java编程中,数据库操作是常见任务之一,而`PreparedStatement`和`Statement`是Java JDBC(Java Database Connectivity)中用于执行SQL语句的两种主要接口。它们都是`java.sql`包下的类,用来与数据库进行交互,但...

    java 连接sqlserver数据库查询,并分页显示

    注意,为了提高性能和避免SQL注入,应尽量使用PreparedStatement而不是Statement。此外,为了保持数据库连接的整洁,我们使用了try-with-resources语句自动关闭资源。 分页查询不仅可以提高用户体验,还可以降低...

    java与SQL Server2000的连接

    同时,标签中的“源码”提示我们,可能会有具体的Java代码示例,而“工具”可能指的是用于连接和管理数据库的工具,如SQL Server Management Studio。 总的来说,Java与SQL Server 2000的连接涉及到JDBC API的使用...

    java SQL接口

    这些接口主要包括`java.sql.Connection`、`java.sql.Statement`、`java.sql.PreparedStatement`、`java.sql.ResultSet`等。 1. `Connection`接口:这是与数据库建立连接的基础,通过它,Java应用程序可以与数据库...

    java检查sql语法是否正确

    总结来说,Java中检查SQL语法正确性的方法包括直接使用JDBC API的`Statement`或`PreparedStatement`,使用ORM框架的验证功能,以及借助数据库管理工具。选择哪种方法取决于你的具体需求和项目结构。在实际开发中,...

    Java sql数据库api

    Java SQL API是Java编程语言中用于访问和操作关系型数据库的标准接口。它是Java Database Connectivity (JDBC)的一部分,允许开发者在Java程序中执行SQL语句,进行数据查询、插入、更新和删除等操作。JDBC提供了...

    st.rar_SQL java_SQL 导入_java sql_java sql 2000_数据库作业

    3. **执行SQL语句**:`java.sql.Statement`或`java.sql.PreparedStatement`接口用于执行SQL查询。`Statement`适用于静态SQL语句,而`PreparedStatement`则用于预编译的SQL语句,能防止SQL注入攻击。 4. **数据导入*...

    java sql server2005 驱动包

    在实际开发中,为了提高性能和代码的健壮性,通常会使用PreparedStatement和CallableStatement,它们能预编译SQL语句,减少解析时间,并且可以防止SQL注入攻击。 总之,Java SQL Server 2005驱动包是Java开发者与...

    Java防止SQL注入的几个途径

    如果使用 PreparedStatement 来代替 Statement 来执行 SQL 语句,其后只是输入参数,SQL 注入攻击手段将无效。这是因为 PreparedStatement 不允许在不同的插入时间改变查询的逻辑结构,大部分的 SQL 注入已经挡住了...

    java 连接sqlserver使用的java-sqlserver-connect.jar包

    总结来说,"java-sqlserver-connect.jar"是Java应用程序连接SQL Server数据库的关键组件,它为开发者提供了在Java环境中执行SQL查询和操作数据库的能力,同时支持JRE7和JRE8,确保了兼容性和灵活性。在实际项目中,...

    java+sql.rar_SQL java_java s_java sql_java sql 简单_java.sql.

    在Java中,JDBC是Java API的一个部分,它提供了一组接口和类,使得Java程序可以连接到各种类型的数据库,如MySQL、Oracle、SQL Server等。JDBC的核心概念包括: 1. **Driver Manager**:它是Java应用程序与数据库...

    prepareStatement和Statement的区别

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

    java sql server jdbc驱动jar

    在Java环境中,JDBC驱动是连接数据库的桥梁,它负责翻译Java代码中的SQL语句,并将它们转化为数据库可以理解的格式。 对于SQL Server 2000,Microsoft提供了专门的JDBC驱动,以支持Java应用与其进行数据交互。这个...

    Java SqlServer 数据库驱动 jar

    这个压缩包包含了针对SQL Server 2000和SQL Server 2005两个不同版本的数据库驱动程序,允许开发者在Java环境中高效地执行SQL查询和其他数据库操作。 1. **Java Database Connectivity (JDBC)**: JDBC是Java平台上...

    java语言的分页查询功能(mysql和sql server)

    本教程将详细讲解如何在Java中实现不分框架的分页查询,同时涵盖对MySQL和SQL Server数据库的支持。 一、基础知识 1. 分页概念:分页是将大量数据按一定数量分成若干部分,每次只加载一部分到内存中显示,用户可以...

    Java连接SQL源码

    在本主题中,我们将深入探讨如何使用Java和JDBC驱动程序连接到SQL数据库。 首先,要连接到SQL数据库,我们需要引入JDBC驱动。大多数SQL数据库如MySQL、Oracle、SQL Server都有对应的JDBC驱动。例如,如果你使用的是...

    JAVA sqlserver驱动.zip

    在Java编程中,SQL Server驱动是连接Java应用程序与Microsoft SQL Server数据库的关键组件。这个压缩包“JAVA sqlserver驱动.zip”显然包含了一个或多个用于Java连接SQL Server的驱动程序。让我们详细了解一下相关的...

Global site tag (gtag.js) - Google Analytics