就这牛客网的一道题,进行分析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. a标签下载;页面传参row对象先转换成字符串。

    jsp:添加一列 <th data-options="field:'id',width:180,formatter: rowformater" width="20% ...

  2. 获取PC硬件硬件序列号,唯一标识一台PC

    用一个库:jydisk.dll  百度说是windows提供的C++标准动态库,很方便使用. 点击连接下载文件,里面有各种语言的调用例子,可直接使用.测试多台机器,结果靠谱.没有遇到获取出来是全零的情 ...

  3. 如何使用github来查找自己需要的(关心的)项目

    1.登录github官网 输入用户名密码后会显示下面的界面 2.点击explore git hub 然后你会看到下面的页面 3.下面的或许有你想要的项目 点击Treding 可以查看最近火的项目仓库 ...

  4. .NET 黑魔法 - asp.net core 日志系统

    asp.net core 里如何记录日志呢? 这要从asp.net core的依赖注入说起,在asp.net core里的依赖注入真是无所不在,各种面向切面的接口与事件. 好吧,来点干货. 首先,我们 ...

  5. vue框架(三)_vue引入jquery、bootstrap

    一.vue安装jquery 1.按照之前博客的内容,新建一个vue工程. 2.在项目文件夹下,使用命令npm install jquery --save-dev 引入jquery. 3.在build/ ...

  6. 擠出機步進馬達的 Steps per Unit 該如何計算?

    擠出機步進馬達的 Steps per Unit 該如何計算?   這邊 Steps per Unit 指的是塑料往前推進1mm,步進馬達須要走幾步.依此定義,可知計算方式可以用 步進馬達轉一圈需要的步 ...

  7. Sitecore CMS中如何命名项目名称

    如何在Sitecore CMS中命名项目,以及配置命名限制,“显示名称”是什么以及如何使用它. 任何其他名称的项目 当创建Sitecore的项目,内容编辑器要求制作者为新建项目提供名称.输入的名称将其 ...

  8. 基于word2vec训练词向量(一)

    转自:https://blog.csdn.net/fendouaini/article/details/79905328 1.回顾DNN训练词向量 上次说到了通过DNN模型训练词获得词向量,这次来讲解 ...

  9. 开源数据流管道-Luigi vs Azkaban vs Oozie vs Airflow

    原文链接:https://www.jianshu.com/p/4ae1faea733b 随着企业的发展,他们的工作流程变得更加复杂,越来越多的有着错综复杂依赖关系的工作流需要增加监控,故障排除.如果没 ...

  10. Linux Centos下查看cpu、磁盘、内存使用情况,关闭MySQL日志

    Linux Centos下查看cpu.磁盘.内存使用情况,关闭MySQL日志 lsblk 查看分区和磁盘df -h 查看空间使用情况fdisk -l 分区工具查看分区信息cfdisk /dev/sda ...