本文主要讲了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作用区别的更多相关文章

  1. 浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣

    先说下这俩到底是干啥的吧.其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句.说是CreateStatement和PrepareStatement ...

  2. JDBC 中preparedStatement和Statement区别

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

  3. DBUtils开源JDBC类库,对JDBC简单封装(作用是:简化编码工作量,同时不会影响程序的性能)

    DBUtils:提高了程序的性能,编程更加简便 架包 mysql-connector-java-jar commons-dbcp-1.4jar commons-pool-1.5.5jar common ...

  4. C#之app.config、exe.config和vshost.exe.config作用区别

    vshost.exe.config是程序运行时的配置文本 exe.config是程序运行后会复制到vshost.exe.config app.config是在vshost.exe.config和exe ...

  5. JDBC 中 socketTimeout 的作用

    如果我们把socketTimeout设置如下: socketTimeout=60000; 这意味着60秒以内服务器必须开始给客户端吐数据,以保持socket的活性.配置成60秒,一般查询都不会遇到问题 ...

  6. sql 外键 on update cascade 和 on delete cascade 作用区别?

    这是数据库外键定义的一个可选项,用来设置当主键表中的被参考列的数据发生变化时,外键表中响应字段的变换规则的.update 则是主键表中被参考字段的值更新,delete是指在主键表中删除一条记录:on ...

  7. JDBC与Statement和PreparedStatement的区别

    一.先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.具体步骤: 1.首先导入 ...

  8. 【转】Java JDBC对应C# ADO连接数据库之区别

    JDBC对应C#连接数据库之区别 之前一直在用java,最近因为找了.NET的工作,开始学习.NET. 今天也是查了好多资料,但是一直没有看到和JDBC之间的对比博文,开始也是一头雾水! 但是功夫不负 ...

  9. JDBC事务和JTA事务的区别

    转自:JDBC和JTA事务的区别 一.事务概述事务表示一个由一系列的数据库操作组成的不可分割的逻辑单位,其中的操作要么全做要么全都不做.与事务相关的操作主要有:BEGIN TRANSACTION: 开 ...

随机推荐

  1. 洛谷$P2053\ [SCOI2007]$修车 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 一个很妙的建图,,,说实话我麻油想到$QwQ$ 考虑对每个工人建$n$个点,表示这是他修的倒数第$i$辆车,就可以算出影响是$t\cdot i$,然后对每辆 ...

  2. 一文详解滑动平均法、滑动平均模型法(Moving average,MA)

    任何关于算法.编程.AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI.算法.编程和大数据知识分享,以及免费的SSR节点和 ...

  3. Docker+Nginx使用流程(笔记)

    Docker+Nginx使用流程 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统 # uname -r 查看你当前的内核版本 # yum -y insta ...

  4. 【转】小波与小波包、小波包分解与信号重构、小波包能量特征提取 暨 小波包分解后实现按频率大小分布重新排列(Matlab 程序详解)

    转:https://blog.csdn.net/cqfdcw/article/details/84995904 小波与小波包.小波包分解与信号重构.小波包能量特征提取   (Matlab 程序详解) ...

  5. ArcGIS Server 动态图层发布调用图解

    目录 1 前言 1.1 简介 1.2 适用场景 2 动态图层 2.1 共享地图服务 2.2 动态工作空间添加 2.2.1 企业级数据库 2.2.2 shapefile文件夹 2.2.3 栅格文件夹 2 ...

  6. webpack 三

    之前06年写了两篇自己研究webpack的文章,由于webpack已经升到了4.x,今天用起来发现有点小变化,重新自己建一个简单的项目,这里记录一下过程 1.安装webpack和webpack-cli ...

  7. 全网最详细的Linux命令系列-sed文本处理命令

    Sed简介 SED是一个非交互式文本编辑器,它可对文本文件和标准输入进行编辑,标准输入可以来自键盘输入.文本重定向.字符串.变量,甚至来自于管道的文本,与VIM编辑器类似,它一次处理一行内容,Sed可 ...

  8. 重拾c++第三天(5):循环和关系表达式

    1.改变步长 ;i<;i=i+) 2.*与++优先级相同,从右向左 3.strcmp函数比较两个字符串,=0两个相同,><0 ----> str1><str2 4. ...

  9. P2365 任务安排 batch 动态规划

    batch ★☆   输入文件:batch.in   输出文件:batch.out   简单对比时间限制:1 s   内存限制:128 MB 题目描述 N个任务排成一个序列在一台机器上等待完成(顺序不 ...

  10. 如何实施DevOps

    对于长期在孤立的架构下工作的组织来说,转移到协作式DevOps系统似乎是难以成功的.为了进一步提高效率,必须改变观念,并进行团队文化改变.例如:许多人认为只有自动化工具才能解决DevOps,其实这是不 ...