PreparedStatement与Statement区别

Stella981
• 阅读 630

  就这牛客网的一道题,进行分析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要高一些。

 1 package test;
 2 
 3 import java.sql.*;
 4 
 5 /**
 6  * @author zsh
 7  * @company wlgzs
 8  * @create 2019-03-21 20:19
 9  * @Describe JDBCTest,PreparedStatement与Statement区别
10  */
11 public class JDBCTest {
12 
13     public static void t() throws ClassNotFoundException, SQLException {
14         //1 加载数据库驱动
15         Class.forName("com.mysql.jdbc.Driver");
16         //2 获取数据库连接
17         String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=false&characterEncoding=UTF-8";
18         String user = "root" ;
19         String password = "root" ;
20         Connection conn = DriverManager.getConnection(url, user, password);
21         //3 创建一个Statement
22         String sql = "select * from user where id= " ;
23         String tempSql;
24         int  count =  1000 ;
25         long  time = System.currentTimeMillis();
26         for ( int  i= 0  ;i<count ;i++){
27             Statement statement = conn.createStatement();
28             tempSql=sql+(int ) (Math.random() *  100 );
29             ResultSet rSet = statement.executeQuery(tempSql);
30             statement.close();
31         }
32         System.out.println("statement cost:"  + (System.currentTimeMillis() - time));
33 
34         String psql = "select * from user where id= ?" ;
35         time = System.currentTimeMillis();
36         for  ( int  i =  0 ; i < count; i++) {
37             int  id=( int ) (Math.random() *  100 );
38             PreparedStatement preStatement = conn.prepareStatement(psql);
39             preStatement.setLong(1 ,  new  Long(id));
40             ResultSet pSet = preStatement.executeQuery();
41             preStatement.close();
42         }
43         System.out.println("preStatement cost:"  + (System.currentTimeMillis() - time));
44         conn.close();
45     }
46 
47     public static void main(String[] args) throws SQLException, ClassNotFoundException {
48         for (int i = 0; i < 4; i++) {
49             System.out.println("-------"+i+"------");
50             t();
51         }
52     }
53 }

运行结果:

PreparedStatement与Statement区别

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

2、安全性问题

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
Statement及PreparedStatement执行多个sql
这两个对象的区别:1.Statement它更适合执行不同sql的批处理,它没有提供预处理功能,性能比较低。2.PreparedStatement它适合执行相同的批处理,它提供了预处理功能,属性比较高。         /\\     \ @param args     \ @thr
Wesley13 Wesley13
3年前
JDBC+C3P0+DBCP 基本使用
1.概述这篇文章主要说了JDBC的基本使用,包括Statement,PreparedStatement,JDBC的连接,Mysql创建用户创建数据表,C3P0的连接与配置,DBCP的连接与配置.2.mysql的处理这里的JDBC使用Mysql作为DBMS,请先安装Mysql,未安装的请点击这里下载(https:
Wesley13 Wesley13
3年前
JavaWeb面试篇(7)
61,JDBC访问数据库的基本步骤是什么?1,加载驱动2,通过DriverManager对象获取连接对象Connection3,通过连接对象获取会话4,通过会话进行数据的增删改查,封装对象5,关闭资源62,说说preparedStatement和Statement的区别1,效率:预编译会话比普通会话对象
Wesley13 Wesley13
3年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。
Stella981 Stella981
3年前
PreparedStatement的用法以及与Statement的区别
jdbc(javadatabaseconnectivity,java数据库连接)的api中的主要的四个类之一的java.sql.statement要求开发者付出大量的时间和精力。在使用statement获取jdbc访问时所具有的一个共通的问题是输入适当格式的日期和时间戳:2002020520:56或者02/05/028:56pm。通过使
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这