JDBC——CreateStatement和PrepareStatement做用区别

  本文主要讲了PrepareStatement和CreateStatement的做用区别,你们能够一块儿学习!走后端的小伙伴都会必修JDBC,在前段时间做者实训期间,看到老师举例的时候用了CreateStatement(固然老师只是随便举得例子)。而本人的我的习惯是用PrepareStatement的,做者以前是很困惑过这两个之间的区别的,在实践以后以及看的一些资料积攒了一些见解,在这里和你们谈一下CreatStatement和PrepareStatement的做用和区别吧。(图为老师的案例)sql

  做用:这二者做用基本同样,来看二者代码的写法。二者在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操做对象的过程spa

//建立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这三列。咱们往这五列添加数据,两个代码的样子又变成什么样子了呢?rest

  Createment的是这样的:code

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在写的时候要注意的太多了,并且标点符号啥的一点都不能错。不然程序就会报错,这谁顶得住呀!blog

  固然不止这一个区别。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在运行的过程当中都是独立的,数据也都是独立运行的,因此影响没有那么大的!

  好啦,就讲到这了,但愿能够给你一点帮助!

相关文章
相关标签/搜索