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

浅谈 JDBC 中 CreateStatement 和 PrepareStatement 的区别与优劣。微信搜索程序员的起飞之路可以加我公众号,保证一有干货就更新~本人的几点浅见,各位大大不喜勿喷。先说下这俩到底是干啥的吧。其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句。说是CreateStatement和PrepareStatement的区别,但其实说的就是Statement和PrepareStatement的区别,相信大家在网上已经看到过不少这方面的资料和博客,我在此处提几点,大家看到过的,就当重记忆,没看到就当补充~下面开始谈谈他.

大家好,又见面了,我是你们的朋友全栈君。

微信搜索 程序员的起飞之路 可以加我公众号,保证一有干货就更新~

本人的几点浅见,各位大大不喜勿喷。

先说下这俩到底是干啥的吧。其实这俩干的活儿都一样,就是创建了一个对象然后去通过对象调用executeQuery方法来执行sql语句。说是CreateStatement和PrepareStatement的区别,但其实说的就是Statement和PrepareStatement的区别,相信大家在网上已经看到过不少这方面的资料和博客,我在此处提几点,大家看到过的,就当重记忆,没看到就当补充~下面开始谈谈他们的区别。

最明显的区别,就是执行的sql语句格式不同。我们往上放两段代码来看看他们的区别把:

代码背景:我们有一个数据库,里面有一个user表,有username,userpwd两列。我们要查出这两列的数据。

这是使用CreateStatement方法创建了stmt对象,再通过他查询的一部分语句片段。

String sql = "select * from users where  username= '"+username+"' and userpwd='"+userpwd+"'";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);

而下面则是使用了PrepareStatement方法创建了pstmt对象,再通过这个对象查询的一部分语句片段。

String sql = "select * from users where  username=? and userpwd=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, userpwd);
rs = pstmt.executeQuery();

相信写到这,大家很多人就能看出来了,原来PrepareStatement跟Statement的主要区别就是把上面sql语句中的变量抽出来了。这就是我要说的第一大优点,PrepareStatement可以提高代码的可读性。什么?你没觉得这有什么可以提高可读性的?那好,咱来看看下面这两段代码,看完你再说话。

代码背景:我们有一个数据库,里面有一个book表,有bookid,bookname,bookauthor,booksort,bookprice五列。我们要向这个表中添加一部分数据。

Statement版

String sql = "insert into book (bookid,bookname,bookauthor,booksort,bookprice) values ('"+var1+"',
                                '"+var2+"',"+var3+",'"+var4+","+var5+"')";
stmt = conn.createStatement();
rs = stmt.executeUpdate(sql);

ParperStatement版

String sql = "insert into book (bookid,bookname,bookauthor,booksort,bookprice) values (?,?,?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1,var1);
pstmt.setString(2,var2);
pstmt.setString(3,var3);
pstmt.setString(4,var4);
pstmt.setString(5,var5);
pstmt.executeUpdate();

怎么样。反正我打这行代码的时候,整个引号逗号就给我刺激懵了。

下面说说第二点优点。ParperStatement提高了代码的灵活性和执行效率。

PrepareStatement接口是Statement接口的子接口,他继承了Statement接口的所有功能。它主要是拿来解决我们使用Statement对象多次执行同一个SQL语句的效率问题的。ParperStatement接口的机制是在数据库支持预编译的情况下预先将SQL语句编译,当多次执行这条SQL语句时,可以直接执行编译好的SQL语句,这样就大大提高了程序的灵活性和执行效率。

最后但也是最重要的一个大大的比Statement好的优点,那就是安全!

你说啥?这还关安全啥事儿,那我给你一行代码,你来给我说说这是干嘛的。

String sql = "select * from user where username= '"+varname+"' and userpwd='"+varpasswd+"'";
stmt = conn.createStatement();
rs = stmt.executeUpdate(sql);

这是验证用户名密码的,对吧。但要是我们把’or ‘1’ = 1’当作密码传进去,你猜猜会发生啥。

select * from user where username = 'user' and userpwd = '' or '1' = '1';

 发现了吧!这是个永真式,因为1永远等于1。所以不管怎样都能获取到权限。哇。这就坏咯!这还不是最坏的,你再看!

 
String sql = "select * from user where username= '"+varname+"' and userpwd='"+varpasswd+"'";
stmt = conn.createStatement();
rs = stmt.executeUpdate(sql);

依旧是这行代码。这次我们把’or ‘1’ = 1′;drop table book;当成密码传进去。哇!又坏了!这次直接把表给删了。但是,你如果用PrepareStatement的话就不会出现这种问题。你传入的这些数据根本不会跟原来的数据有任何的交集,也不会发生这些问题。

 


读书越多越发现自己的无知,Keep Fighting!

欢迎友善交流,不喜勿喷~

Hope can help~

微信搜索 程序员的起飞之路 或微信扫描下方二维码可以加我公众号,保证一有干货就更新~

另外,关注公众号后回复“资料”关键字,可获取小弟多年收藏之精华

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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130957.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月13日 上午8:16
下一篇 2022年6月13日 上午8:16


相关推荐

  • mysql分表+分页查询

    mysql分表+分页查询随着项目运行的时间越来越长 有些数据的存储也会越来越大 比如一些点击量 浏览量量 单表的数据可以到达上千万条数据 这时候会存在单表数据过大 查询效率低的问题 为了提高查询效率这时候需要对单表进行拆分 比如一张 1000 万条数据的表 我们需要把它拆分为 10 张表 一张表就需要 100 万 my

    2026年3月19日
    4
  • idea 2021.8 激活码_在线激活

    (idea 2021.8 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~BI…

    2022年3月22日
    71
  • 手写卷积运算

    手写卷积运算最近看到一个巨牛的人工智能教程 分享一下给大家 教程不仅是零基础 通俗易懂 而且非常风趣幽默 像看小说一样 觉得太牛了 所以分享给大家 平时碎片时间可以当小说看 点这里可以去膜拜一下大神的 小说 从一个通道的图片进行卷积生成新的单通道图的过程很容易理解 对于多个通道卷积后生成多个通道的图理解起来有点抽象 本文以通俗易懂的方式讲述卷积 并辅以图片解释 能快速理解卷积的实现原理 最后手写 pyt

    2026年2月4日
    11
  • 链表排序之选择排序法_单链表直接选择排序

    链表排序之选择排序法_单链表直接选择排序选择排序的优点在于它每次选择出最大或者最小的值,将它们进行排序此选择排序的思想在于选择出最小的节点,创建新链表,将原链表的最小节点删除,继续循环TYPE*lain(intl,TYPE*head){TYPE*first,*tail,*p_min,*min,*p;first=NULL;while(head!=NULL){

    2022年10月11日
    6
  • zuul网关有哪些作用_springcloud注册中心

    zuul网关有哪些作用_springcloud注册中心zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个springcloud里在Eureka注册中心的模块.zuul:ignored-services:’*’sensitiveHeaders:Access-Control-Allow-Originignored-headers:Access-Control-Allow-Credentials,Access…

    2022年8月15日
    7
  • c语言学生成绩管理系统总结

    c语言学生成绩管理系统总结一、系统功能1.基本功能1.录入信息2.按照学号查找信息3.按照学号修改信息4.按照学号删除信息5.插入信息6.浏览全部信息7.按c语言成绩排序8.保存到文件2.结构体typedefstructstudent{ charnum[20];//学号 charname[10];//姓名 charsex[10];//性别 charduty[10];//专业 inteng;//英语成绩 intmath;

    2022年6月20日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号