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: 开 ...
随机推荐
- 20191121-8 Scrum立会报告+燃尽图 04
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/10068 一: 组名:组长组 组长:杨天宇 组员:魏新 罗杨美慧 王歆瑶 ...
- promethues安装
prometheus 1. 下载安装 下载安装:https://github.com/prometheus/prometheus/releases/tag/v2.9.2 wget https://gi ...
- 机器学习之路--KNN算法
机器学习实战之kNN算法 机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python ...
- 「洛谷P3469」[POI2008]BLO-Blockade 解题报告
P3469[POI2008]LO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每两个 ...
- 「洛谷P1231」教辅的组成 解题报告
P1231 教辅的组成 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习 ...
- SpringBoot 2.X整合Mybatis
1.创建工程环境 勾选Web.Mybatis.MySQL,如下 依赖如下 <dependency> <groupId>org.springframework.boot</ ...
- css label两端对齐
上面这种效果很常见,实现的代码如下: html部分 <ul> <li class="detail_item"> <span class="d ...
- CI框架获取post和get参数_CodeIgniter使用心得
请参考:CI文档的输入类部分: $this->input->post()$this->input->get() -------------------------------- ...
- 在ubuntu 18上安装MongoDB
本文介绍 MongoDB Community Edition 在 Ubuntu 下的安装和常见配置方法.文中操作基于 MongoDB Community Edition 4.2.2 和 Ubuntu ...
- IDEA使用 磨刀霍霍向代码
工欲善其事,必先利其器 ,当下有数不清的 Java 程序员将石器时代的 Eclipse 替换成了现代化的智能开发工具 InteliJ IDEA ,写代码的小日子过得不亦乐乎(玩笑话,两者各有千秋,看个 ...