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: 开 ...
随机推荐
- 十三、springboot 优雅集成spring-boot-admin 实现程序监控
前言 我们知道项目的监控是尤为重要的,但是我们如果用jdk 自带的jconsole 和jvisualvm 的话会非常繁琐,且界面不是很友好.之前我们使用了spring boot 项目,但是都没有对项目 ...
- ES6学习----let、const、解构赋值、新增字符串、模板字符串、Symbol类型、Proxy、Set
这篇es6的学习笔记来自于表哥 表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206 ES6就是JS6,JS的第 ...
- 【题解】Comet OJ Round 70 简要题解
[题解]Comet OJ Round 70 简要题解 A 将放在地上的书按照从小到大排序后,问题的本质就变成了合并两个序列使得字典序最小.可以直接模拟归并排序.直接用循环和std::merge实现这个 ...
- $Noip2010/Luogu1525$ 关押罪犯 贪心
$Luogu$ $Sol$ 贪心.尽量把怨气值大的罪犯放到两个监狱,所以首先要按照怨气值从大到小排序.当扫描到两个罪犯已经被指定到同一个监狱时,就结束循环,这个怨气值就是答案.当然把怨气值大的两个罪犯 ...
- Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学
题目链接:https://codeforces.com/contest/1265/problem/E 题目大意: 有 \(n\) 个步骤,第 \(i\) 个步骤成功的概率是 \(P_i\) ,每一步只 ...
- java基础之----分布式事务tcc
最近研究了一下分布式事务框架,ttc,总体感觉还可以,当然前提条件下是你要会使用这个框架.下面分层次讲,尽量让想学习的同学读了这篇文章能加以操作运用.我不想废话,直接上干货. 一.什么是tcc?干什么 ...
- Java防锁屏小程序
为防止系统桌面自动锁屏,只需打成jar包,写个批处理程序start.bat,双击执行保持dos窗口执行即可,无其他影响. 程序设计为每30秒动一次鼠标,可根据需要调整. 附代码: package ma ...
- 案例分析丨谷歌设计冲刺 4 天决定 Clips 的功能特性
这次为大家带来Google冲刺日程案例,之前案例分析可以戳对应文字直达:ING集团.音乐流媒体Spotify.美国知名超市Target 作为一款工具类产品,谷歌十分注重产品候选人的技术背景,同时也看重 ...
- Spring Boot 2.X(十九):集成 mybatis-plus 高效开发
前言 之前介绍了 SpringBoot 整合 Mybatis 实现数据库的增删改查操作,分别给出了 xml 和注解两种实现 mapper 接口的方式:虽然注解方式干掉了 xml 文件,但是使用起来并不 ...
- light题目讲解 7.25模拟赛T1
心得:这一道题其实就是自己打暴力打出来的 没有想到正解真的就是暴力枚举 我的做法是这样的 就是枚举A字符串中长度为x的子串 看它是不是B串的子序列 接下来是我的绝望考试代码(100分AC) //lig ...