Java中为什么用PreparedStatement而不用Statement

---恢复内容开始---

1、 PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象。

2、作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能。三种方法

execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数

  虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次:
  stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values (‘"+var1+"‘,‘"+var2+"‘,"+var3+",‘"+var4+"‘)");//stmt是Statement对象实例

  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(); //prestmt是 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,;等做费尽心机的判断和过虑.

---恢复内容结束---

时间: 2024-10-13 02:05:13

Java中为什么用PreparedStatement而不用Statement的相关文章

Java中PreparedStatement和Statement的用法区别

Java中PreparedStatement和Statement的用法区别 (2012-08-01 11:06:44) 转载▼ 标签: 杂谈   1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能.三种方法 execute. executeQuery

不用static,巧用对象.方法调用java中的函数

先生成一个对象,用"对象.方法()"的方式调用. java中的main方法是静态的,用于程序的入口,在静态方法中无法调用非静态方法,只能调用静态方法.想调用静态方法的话就要先生成该类的一个对象,通过对象调用非静态方法.如:public class SquareIntTest { public static void main(String[] args) {  int result;  SquareIntTest m = new SquareIntTest();  for (int x

MySql中PreparedStatement对象与Statement对象

PreparedStatement对象与Statement对象相比 1.代码的可读性和可维护性. 2.PreparedStatement能保证安全性(解决sql注入问题) 3.PreparedStatement 能最大可能提高性能: Demo 1 //sql语句,参数用?代替-----一定要是英文的? 2 String sql="INSERT INTO s_user (NAME,PASSWORD) VALUES (?,?)"; 3 try { 4 pstmt=connection.pr

浅谈java中如何处理高并发的问题

1.从最基础的地方做起,优化我们写的代码,减少必要的资源浪费     a.避免频繁的使用new对象,对于整个应用只需要存在一个实例的类,我们可以使用单例模式.对于String连接操作,使用StringBuffer或StringBuilder,对于工具类可以通过静态方法来访问.     b.避免使用错误的方式,尽量不用instanceof做条件判断.使用java中效率高的类,比如ArrayList比Vector性能好. 2.html静态化     我们通过一个链接地址访问,通过这个链接地址,服务器

Java中执行存储过程和函数(web基础学习笔记十四)

一.概述 如果想要执行存储过程,我们应该使用 CallableStatement 接口. CallableStatement 接口继承自PreparedStatement 接口.所以CallableStatement 接口包含有Statement 接口和PreparedStatement 接口定义的全部方法,但是并不是所有的方法我们都要使用,主要使用的方法有这样几个: CallableStatement 常用方法: 返回类型 方法签名 说明 boolean execute() 执行 SQL 语句

JDBC为什么要使用PreparedStatement而不是Statement

PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement. PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查 询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程.同时 PreparedStatement还经常会在Java面试被提及,譬如:Statement与PreparedStatement的区别

java中的jdbc连接数据库方法及应用

jdbc连接数据库的口诀:猪脸特直观 import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Demo03 { public static void main(String[] args) thr

在java中使用mysql

在java中使用mysql 概略 安装环境:windows 10, eclipse 安装mysql运行mysql并且新建数据库feedback将所需的jar添加到工程里在代码中连接数据库并且进行查询 安装mysql 下载地址:mysql-install-community下载 下载后 安装sqlserver就行了,其他的应该暂时还不需要用到,最后需要设置密码,要记住,在后面我们需要使用账号密码登陆数据库. 运行mysql,新建数据库 登陆数据库 进入mysql的安装目录下,进入bin目录,默认应

1 Java中的时间类型

总结:sql中的时间转 util的时间直接赋值即可:反过来,必须先吧util下的时间转换成毫秒,再通过sql的构造器生成sql的时间格式. 1 Java中的时间类型 java.sql包下给出三个与数据库相关的日期时间类型,分别是: l Date:表示日期,只有年月日,没有时分秒.会丢失时间: l Time:表示时间,只有时分秒,没有年月日.会丢失日期: l Timestamp:表示时间戳,有年月日时分秒,以及毫秒. 这三个类都是java.util.Date的子类. 2 时间类型相互转换 把数据库