就这牛客网的一道题,进行分析PreparedStatement与Statement的区别。

题目:

关于PreparedStatement与Statement描述错误的是()
A 一般而言,PreparedStatement比Statement执行效率更高
B PreparedStatement会预编译SQL语句
C Statement每次都会解析/编译SQL,确立并优化数据获取路径
D Statement执行扫描的结果集比PreparedStatement大

区别:

1、创建时的区别:
Statement statement = conn.createStatement();
PreparedStatement preStatement = conn.prepareStatement(sql);

执行的时候:

ResultSet rSet = statement.executeQuery(sql);
ResultSet pSet = preStatement.executeQuery();

  由上可以看出,PreparedStatement有预编译的过程,已经绑定sql,之后无论执行多少遍,都不会再去进行编译,而 statement 不同,如果执行多变,则相应的就要编译多少遍sql,所以从这点看,preStatement 的效率会比 Statement要高一些。

 package test;

 import java.sql.*;

 /**
* @author zsh
* @company wlgzs
* @create 2019-03-21 20:19
* @Describe JDBCTest,PreparedStatement与Statement区别
*/
public class JDBCTest { public static void t() throws ClassNotFoundException, SQLException {
//1 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2 获取数据库连接
String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=false&characterEncoding=UTF-8";
String user = "root" ;
String password = "root" ;
Connection conn = DriverManager.getConnection(url, user, password);
//3 创建一个Statement
String sql = "select * from user where id= " ;
String tempSql;
int count = 1000 ;
long time = System.currentTimeMillis();
for ( int i= 0 ;i<count ;i++){
Statement statement = conn.createStatement();
tempSql=sql+(int ) (Math.random() * 100 );
ResultSet rSet = statement.executeQuery(tempSql);
statement.close();
}
System.out.println("statement cost:" + (System.currentTimeMillis() - time)); String psql = "select * from user where id= ?" ;
time = System.currentTimeMillis();
for ( int i = 0 ; i < count; i++) {
int id=( int ) (Math.random() * 100 );
PreparedStatement preStatement = conn.prepareStatement(psql);
preStatement.setLong(1 , new Long(id));
ResultSet pSet = preStatement.executeQuery();
preStatement.close();
}
System.out.println("preStatement cost:" + (System.currentTimeMillis() - time));
conn.close();
} public static void main(String[] args) throws SQLException, ClassNotFoundException {
for (int i = 0; i < 4; i++) {
System.out.println("-------"+i+"------");
t();
}
}
}

运行结果:

  虽然没有更详细的测试 各种数据库, 但是就数据库发展 版本越高,数据库对 preStatement的支持会越来越好,所以总体而言, 验证  preStatement 的效率 比 Statement 的效率高。

2、安全性问题

  这个就不多说了,preStatement是预编译的,所以可以有效的防止 SQL注入等问题。所以 preStatement 的安全性 比 Statement 高

3、代码的可读性 和 可维护性 
  这点也不用多说了,你看老代码的时候  会深有体会

PreparedStatement与Statement区别的更多相关文章

  1. JDBC 中preparedStatement和Statement区别

    一.概念 PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement.PreparedStatement 和 CallableStatement三种方式 ...

  2. PreparedStatement和Statement区别

    在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement 一.代码的可读性和可维护性. 虽 ...

  3. PreparedStatement和Statement区别详解

    技术原理 该 PreparedStatement接口继承Statement,并与之在两方面有所不同: PreparedStatement 实例包含已编译的 SQL 语句.这就是使语句“准备好”.包含于 ...

  4. JDBC增删改查,PreparedStatement和Statement的区别

    此篇是在上一篇的基础上使用PreparedStatement对象来实现JDBC增删改查的 具体工具类JDBCTools和实现类和配置文件在上一篇Statement对象实现的时候有写. 上一篇地址htt ...

  5. PreparedStatement与Statement的区别

    PreparedStatement与statement的区别 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 2.使用 Statement 对象 ...

  6. Statement和PreparedStatement之间的区别

    Statement和PreparedStatement之间的区别: 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程2.使用 Statement ...

  7. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...

  8. Statement、 PreparedStatement 、CallableStatement 区别和联系

    Statement. PreparedStatement .CallableStatement 区别和联系 1. Statement.PreparedStatement和CallableStateme ...

  9. PreparedStatement 和 Statement 的区别(推荐使用PreparedStatement)

    PreparedStatement与Statement在使用时的区别: 1.Statement: String sql=" "; executeUpdate(sql) 2. Pre ...

随机推荐

  1. antlr安装

    安装java环境,环境变量设置如下: ANTLR 简介 ANTLR—Another Tool for Language Recognition,Antlr 本身是使用 Java 开发的,它为包括Jav ...

  2. React项目中使用Mobx状态管理(一)

    1.安装 $ yarn add mobx mobx-react 2.新建store/index.js,存放数据(以下思路仅限于父子组件的简单应用) 注意:这里暂时没使用装饰器@observable,装 ...

  3. LeetCode71.简化路径

    给定一个文档 (Unix-style) 的完全路径,请进行路径简化. 例如,path = "/home/", => "/home"path = " ...

  4. spark 关联source

    IDEA就自动把jar包中的字节码反编译为Java源码,并且,我们可以直接下个断点调试程序,但是对于Scala,IDEA的反编译效果并不是很好,如下图所示: 2)提示“Source not found ...

  5. caffe运行训练脚本时报错:Unknown bottom blob 'data' (layer 'conv1',bottom index 0)

    报错的两种报错原因: 1.输入数的路径错误,需要将路径进行修改排查目录是否出错 2.训练原数据格式不对 3.train.prototxt文件中并未设置test层,而在solver层则设置了test的迭 ...

  6. SQLAllocHandle

    函数定义: 顾名思义,该函数就是用来分配句柄的,句柄类型参考参数详解. SQLRETURN SQLAllocHandle( SQLSMALLINT     HandleType, SQLHANDLE  ...

  7. 终极解决liunx GUI 无法显示中文的问题。

    为linux安装字体 Linux字体文件放在/usr/share/font/,只要将字体文件拷贝到这里就可以了.这里示例安装Windows的所有字体. 2,复制Windows下 的所有字体.cd命令切 ...

  8. 【Scala学习之一】 Scala基础语法

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...

  9. python中从键盘输入内容的方法raw_input()和input()的区别

    raw_input()输出结果都是字符串 Input()输入什么内容,输出就是什么内容

  10. 转:如何捕获winform程序全局异常?

    前言 上篇文章我提供了一种方案可以供我们捕获单线程程序中的所有未处理异常.但是如果程序是多线程,那么新增线程出现了异常上个方案就无能为力了.本着方案总比问题多的态度,我再给大家提供一种新的方案,供大家 ...