`
cvics_ailk
  • 浏览: 10773 次
社区版块
存档分类
最新评论

[转]JDBC中Statement与PreparedStatement的区别

阅读更多

JDBC中Statement与PreparedStatement的区别

 

1. statement每次执行sql语句,相关数据库都要执行sql语句的编译;preparedstatement是预编译的, 采用Cache机制(预编译语句,放在Cache中,下次执行相同SQL语句时,则可以直接从Cache中取出来,有利于sql生成查询计划。),对于批量处理可以大大提高效率. 也叫JDBC存储过程。

 

例如,如果要执行两条sql语句

 

SELECT colume FROM TABLE WHERE colume=1;
SELECT colume FROM TABLE WHERE colume=2;

 

会生成两个执行计划

 

一千个查询就生成一千个执行计划!

 

PreparedStatement用于使用绑定变量重用执行计划

 

SELECT colume FROM TABLE WHERE colume=:x;

 

通过set不同数据只需要生成一次执行计划,可以重用

 

是否使用绑定变量对系统影响非常大,生成执行计划极为消耗资源

 

两种实现 速度差距可能成百上千倍

 

后者使用了PreparedStatement对象,而前者是普通的Statement对象。PreparedStatement对象不仅包含了SQL语句,而且大多数情况下这个语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。当你需要执行Statement对象多次的时候,PreparedStatement对象将会大大降低运行时间,当然也加快了访问数据库的速度

 

这种转换也给你带来很大的便利,不必重复SQL语句的句法,而只需更改其中变量的值,便可重新执行SQL语句。选择PreparedStatement对象与否,在于相同句法的SQL语句是否执行了多次,而且两次之间的差别仅仅是变量的不同。如果仅仅执行了一次的话,在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理,PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。

 

2. PrepareStatement中执行的SQL语句中是可以带参数的,也就是说可以替换变量,尽量采用使用?号的方式传递参数,增加代码的可读性又可以预编译加速;而Statement则不可以。

 

3. 防止SQL注入。在SQL中包含特殊字符或SQL的关键字(如:’ or 1 or ‘)时,Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。

 

SQL注入或者说SQL注入攻击就是利用Statement的漏洞完成的,例如用个用户登录,那么form表单有用户名和密码

 

那么我提交时,在用户名输入框内 输入 “aaa’ or ’a’=’a” 密码框随便输入,那么这样意味着 sql的

 

查询语言就是 “select * from 表 where 用户名=’aaa’ or ’a’=’a’ and 密码=’123’ ”,这样查询出来所有的数据或者是混乱。那么不被授权的用户照样可以登录,岂不是被黑了?!实际中现在java程序员早都不用这种方式写查询了,一般都用PreparedStatement来查询,或干脆就用hibernate之类的持久层框架,这样通过sql注入就无从谈起了。
分享到:
评论

相关推荐

    Statement和PreparedStatement之间的区别

    Statement和PreparedStatement是JDBC中的两种不同的语句对象,用于执行数据库操作。虽然它们都可以执行SQL语句,但是它们之间存在着很大的区别。 首先, Statement对象执行的SQL语句是直接编译的,而...

    详解Java的JDBC中Statement与PreparedStatement对象

    在Java的JDBC(Java Database Connectivity)中,与数据库交互的核心接口是Statement和PreparedStatement。这两个接口都是用于执行SQL语句的,但它们在特性和效率上有所不同。 Statement接口是最基本的SQL执行方式...

    JDBC基础教程之PreparedStatement.doc

    #### 二、`PreparedStatement`与`Statement`的区别 1. **预编译的SQL语句**: - `PreparedStatement`实例包含已编译的SQL语句,这意味着当创建此类对象时,SQL语句会被解析和编译,而不是在每次执行时都进行解析。...

    34.jdbc中preparedStatement比Statement的好处.avi

    jdbc中preparedStatement比Statement的好处

    java中PreparedStatement和Statement的区别

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

    Java面试题34.jdbc中preparedStatement比Statement的好处.mp4

    Java面试题34.jdbc中preparedStatement比Statement的好处.mp4

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

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

    JDBC(用PrepareStatement实现)

    在实际开发中,为了提高效率和安全性,我们通常会使用PreparedStatement接口来代替Statement接口。 1. **PreparedStatement简介** PreparedStatement是Statement的一个子接口,它的主要优势在于预编译。预编译的...

    jdbc实例教程

    * 插入数据:使用 JDBC 的 Statement 或 PreparedStatement 对象可以插入数据。插入数据需要指定要插入的数据表和字段,然后使用 executeUpdate() 方法执行插入操作。 * 修改数据:使用 JDBC 的 Statement 或 ...

    JDBC PrepareStatement 使用(附各种场景 demo)

    在Java编程中,JDBC(Java Database Connectivity)是用于与各种数据库进行交互的一套标准接口。PrepareStatement是JDBC提供的一种预编译的SQL语句,它可以提高数据库操作的效率和安全性。本资源主要涵盖了使用JDBC ...

    JDBC从入门到放弃02-JDBC的Statement数据库增加和删除

    在Java编程领域,JDBC(Java Database Connectivity)是连接Java应用程序和各种数据库的...在实际应用中,为了提高安全性与性能,推荐使用PreparedStatement。了解并熟练掌握这些基础操作是每个Java开发者必备的技能。

    第10章 JDBC-课后习题1

    - 创建Statement或PreparedStatement对象:根据需求选择,Statement用于一般SQL语句,PreparedStatement用于预编译的SQL语句。 - 执行SQL:调用Statement或PreparedStatement的`executeQuery()`或`executeUpdate()...

    statement和prepared区别

    而Statement和PreparedStatement就是JDBC中执行SQL语句的两种主要方式。 Statement对象是JDBC提供的一个接口,它被用来执行不带参数的静态SQL语句。每次执行Statement时,数据库都会对SQL语句进行编译,然后执行。...

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

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

    【性能】JDBC PreparedStatement和连接池PreparedStatement Cache学习记录

    在Java的数据库编程中,`JDBC PreparedStatement`和连接池中的`PreparedStatement Cache`是两个非常重要的概念,它们对于提升应用程序的性能和效率有着显著的作用。本文将深入探讨这两个主题,并结合Oracle数据库的...

    PreparedStatement和Statement

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

    jdbc 总结 有参考价值

    JDBC(Java Database Connectivity)是Java编程语言中用于与各种数据库进行交互的一种标准接口。它由Sun Microsystems开发并被纳入Java SE(标准版)的一部分,允许开发者在Java应用程序中执行SQL语句,实现数据的增...

    Java-JDBC【源码】JDBC概述、获取连接、SQL注入问题与解决、查询解析

    Java-JDBC【之】JDBC概述、获取连接、SQL注入问题与解决、查询...3.SQL注入问题与解决(Statement 、PreparedStatement) 3.1.模拟SQL注入 3.2.PreparedStatement解决 3.3.Statement 与 PreparedStatement 4.完整源码

    Mysql JDBC源码 官网版

    2. `Connection`:代表与数据库的会话,通过该接口可以创建Statement或PreparedStatement对象。 3. `Statement`:用于执行静态SQL语句并返回结果集,如`executeQuery()`和`executeUpdate()`。 4. `PreparedStatement...

    jdbc.zip_java jdbc_java+jdbc_jdbc_jdbc Java_zip

    客户端可能会使用JDBC API建立与服务器的连接,创建Statement或PreparedStatement对象,然后执行SQL语句。这些语句可以是SELECT、INSERT、UPDATE或DELETE,用于获取、添加、修改或删除数据库中的数据。 `Server....

Global site tag (gtag.js) - Google Analytics