JDBC——CreateStatement和PrepareStatement作用区别
本文主要讲了PrepareStatement和CreateStatement的作用区别,大家可以一起学习!走后端的小伙伴都会必修JDBC,在前段时间作者实训期间,看到老师举例的时候用了CreateStatement(当然老师只是随便举得例子)。而本人的个人习惯是用PrepareStatement的,作者之前是很困惑过这两个之间的区别的,在实践之后以及看的一些资料积攒了一些看法,在这里和大家谈一下CreatStatement和PrepareStatement的作用和区别吧。(图为老师的案例)
作用:这两者作用基本一样,来看两者代码的写法。两者在JDBC连接数据库时用法基本一样,都是创建了一个数据库的操作对象,然后让该对象调用excuteQuery执行相应的sql语句。所以在JDBC中这俩其实最后达成的效果是一样的。
区别:CreateStatement和PrepareStatement的最明显的区别首先自然是写法上面了。来直接看代码:
代码背景:假设我们数据库里面有一张关于book的表,里面有bid和bname两列,现在进行查询两列数据这个简单的操作。
这是用PrepareStatement创建的ps操作对象的过程(为了增强对比性其余片段先省略掉)
//创建sql命令
String sql="select *from book where bid=? and bname=?";
//创建sql操作对象
ps=conn.prepareStatement;
//给占位值赋值
ps.setString(1,bid);
ps.setString(2,bname);
//执行sql命令
rs=ps.executeQuery();
这是用CreatStatement创建的st操作对象的过程
//创建sql命令
String sql="select *from book where bid='"+bid+"' and bname='"+bname"'";
//创建数据库操作对象
st=conn.createStatement;
//执行sql命令
rs=st.executeQuery(sql);
从代码上相信很多人就可以看出两个人写法上的区别了,PrepareStatement和CreateStatement的写法就是前者将sql语句中的变量抽离出来了。你品,你细品。有没有从这发现PrepareStatement的一大优点:可读性强!什么?你没有发现?如果我们原来数据库中的book表多了bdescn,bprice,bauthor这三列。我们往这五列添加数据,两个代码的样子又变成什么样子了呢?
Createment的是这样的:
String sql = "insert into book (bid,bname,bauthor,bdescn,bprice) values("+var1+'"+var2+"',"+var3+",'"+var4+","+var5+"')";
st = conn.createStatement();
rs = st.executeUpdate(sql);
PrepareStatement是这样的
String sql = "insert into book (boid,bname,bauthor,bdescn,bprice) values(?,?,?,?,?)";
ps=conn.prepareStatement(sql);
ps.setString(1,var1);
ps.setString(2,var2);
ps.setString(3,var3);
ps.setString(4,var4);
ps.setString(5,var5);
pst.executeUpdate();
这样看应该是非常清晰了吧,CreateStatement在写的时候要注意的太多了,而且标点符号啥的一点都不能错。否则程序就会报错,这谁顶得住呀!
当然不止这一个区别。PrepareStatement从“伦理”上面来说应该是诞生于CresteStatement,也就是CreateStatement是它爸!!所以CreateStatement上面的所有优点都被PrepareStatement完美的继承了。就拿上面的举例,实际上Createment的工作原理就是将String sql="insert into book values()"执行了多次,而PrepareStatement工作原理则相反,是先将相应的sql语句编译好,之后有对象执行这条sql语句时,直接调用相应编译好的sql语句时就好。所以后者的工作效率就会明显的比前者高,当然也就更加灵活啦。
最后,就是最重要的一个区别了。那就是PrepareStatement的安全性比“他爸”高了非常多,你在看上面的代码,你品,你细品。如果看不出来的话我给大家换一个,如果使用CreateStatement创造数据库操作对象去验证用户的账号密码的时是不是下面这么操作的呢?
String sql = "select * from user where username= '"+varname+"' and userpwd='"+varpasswd+"'";
st = conn.createStatement();
rs = st.executeUpdate(sql);
有没有感觉有什么不对的地方呢??你看,假使我们在知道一个用户的用户名却不知道密码的时候,将or '1' = '1'当作密码传进去会发生什么呢?句子就变成这样子了select * from user where username = 'user' and userpwd = '' or '1' = '1'是不是就会惊奇的发现,这竟然是一个恒等式!!所以想要得到你的权限去干事情就变得非常简单,比如添加一个在'or '1' = 1'添加一个drop table book是不是你这一个表就消失了呢?而用它的“儿子”就完全不会出现这种情况,因为PrepareStatement在运行的过程中都是独立的,数据也都是独立运行的,所以影响没有那么大的!
好啦,就讲到这了,希望可以给你一点帮助!
JDBC——CreateStatement和PrepareStatement作用区别的更多相关文章
- 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣
先说下这俩到底是干啥的吧.其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句.说是CreateStatement和PrepareStatement ...
- JDBC 中preparedStatement和Statement区别
一.概念 PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement.PreparedStatement 和 CallableStatement三种方式 ...
- DBUtils开源JDBC类库,对JDBC简单封装(作用是:简化编码工作量,同时不会影响程序的性能)
DBUtils:提高了程序的性能,编程更加简便 架包 mysql-connector-java-jar commons-dbcp-1.4jar commons-pool-1.5.5jar common ...
- C#之app.config、exe.config和vshost.exe.config作用区别
vshost.exe.config是程序运行时的配置文本 exe.config是程序运行后会复制到vshost.exe.config app.config是在vshost.exe.config和exe ...
- JDBC 中 socketTimeout 的作用
如果我们把socketTimeout设置如下: socketTimeout=60000; 这意味着60秒以内服务器必须开始给客户端吐数据,以保持socket的活性.配置成60秒,一般查询都不会遇到问题 ...
- sql 外键 on update cascade 和 on delete cascade 作用区别?
这是数据库外键定义的一个可选项,用来设置当主键表中的被参考列的数据发生变化时,外键表中响应字段的变换规则的.update 则是主键表中被参考字段的值更新,delete是指在主键表中删除一条记录:on ...
- JDBC与Statement和PreparedStatement的区别
一.先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.具体步骤: 1.首先导入 ...
- 【转】Java JDBC对应C# ADO连接数据库之区别
JDBC对应C#连接数据库之区别 之前一直在用java,最近因为找了.NET的工作,开始学习.NET. 今天也是查了好多资料,但是一直没有看到和JDBC之间的对比博文,开始也是一头雾水! 但是功夫不负 ...
- JDBC事务和JTA事务的区别
转自:JDBC和JTA事务的区别 一.事务概述事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做.与事务相关的操作主要有:BEGIN TRANSACTION: 开 ...
随机推荐
- $Poj1952\ $洛谷$1687\ Buy\ Low,Buy\ Lower$ 线性$DP+$方案计数
Luogu Description 求一个长度为n的序列a的最长下降子序列的长度,以及这个长度的子序列种数,注意相同的几个子序列只能算作一个子序列. n<=5000,a[i]不超过long范围 ...
- ReentrantLock 源码分析从入门到入土
回答一个问题 在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 JDK 设计人员都是沙雕 ...
- 「洛谷P1306」斐波那契公约数 解题报告
P1306 斐波那契公约数 题目描述 对于Fibonacci数列:1,1,2,3,5,8,13......大家应该很熟悉吧~~~但是现在有一个很"简单"问题:第n项和第m项的最大公 ...
- web(www)服务器搭建Redhat5.4
WWW服务概念及服务原理 目前,在Internet上最热门的服务之一就是WWW (World Wide Web)菔务,til^^Web服务.通过WWW触务,岢在Internet 或企业内部网络中传播. ...
- python利用scapy嗅探流量
能实时监测流量, 只显示有问题的流量, 可疑流量要显示出在那个数据包里 所有流量都保存到为pcap 每5000个包保存一个 第3个自动下载到本地 def sniff(count=0, st ...
- 【转】在MyEclipse 8.6上搭建Android开发环境
内容导航 第 1 页:基本环境准备 第 2 页:下载Android SDK 第 3 页:配置SDK环境变量 第 4 页:给MyEclipse安装ADT插件 第 5 页:配置MyEclipse 第 6 ...
- Alodi:环境创建从未如此简单
一个满足你各种想象的快速方便生成临时环境的系统 在『Alodi:为了保密我开发了一个系统』文章中有讲到我们开发了一个系统用来快速生成临时测试环境,短短三个月已有数百个环境被创建,简化了工作,节省了时间 ...
- 原生js面向对象编程-选项卡(自动轮播)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- VUE CLI环境搭建文档
VUE CLI环境搭建文档 1.安装Node.js 下载地址 https://nodejs.org/zh-cn/download/ 2.全局安装VUE CLI win+R键打开运行cmd窗口输入一下代 ...
- MySQL快速回顾:高级查询操作
8.1 排序数据 检索出的数据并不是以纯粹的随机顺序显示的.如果不排序,数据一般将以它在底层表中出现的顺序显示.这可以是数据最初添加到表中的顺序.但是,如果数据后来进行过更新或删除,则此顺序将会受到M ...