浅谈 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 硬核!高频Linux命令大总结,建议收藏~

    硬核!高频Linux命令大总结,建议收藏~前言记得不久前跟大家大分享了一波个人在平时日常工作、学习、开发、写文字、做视频等过程中,一些好用高效的在线工具和网站,并且把自己的浏览器收藏夹书签离线文件都导出给大家了。很多小伙伴后台反馈还不错,说书签一导入后,很多工具确实挺好用,主要省了很多找资源和整理的时间。今天继续分享,最近花了不少时间把平时开发过程中常用的一些Linux系统命令给做了一个大整理,形成一个常用高频Linux速查备忘录。有了它,还怕Linux操作系统常用操作和命令记不住么?接下来直接上菜吧。注:本文GitHubhtt

    2022年5月8日
    37
  • p6使用说明_人员配置情况说明

    p6使用说明_人员配置情况说明P6SPY 是一个监控JDBC执行语句的开源产品,利用P6SPY很容易的就能监控到JDBC中执行的SQL语句,便于系统调试和性能调优。P6SPY 实现原理是对JDBC的关键类进行了一次包装,让应用系统调用自己的类;自己的类截获到SQL语句后再调用真实的JDBC驱动进行执行SQL,这样,在自己的类里面就可以监控到所有的SQL语句。    P6SPY 使用非常简单,只需要简单的几步即完成配置:

    2022年10月5日
    2
  • Myeclipse 激活成功教程

    Myeclipse 激活成功教程参考 https blog csdn net zhangjuanxpj article details

    2025年8月13日
    4
  • 特殊字体英文可复制粘贴[通俗易懂]

    特殊字体英文可复制粘贴[通俗易懂]???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

    2022年4月28日
    306
  • Storm流处理项目案例

    Storm流处理项目案例

    2022年4月2日
    52
  • 架设ftp服务器从入门到精通[通俗易懂]

    架设ftp服务器从入门到精通[通俗易懂]1.FTP是什么FTP的全称是FileTransferProtocol(文件传输协议)。顾名思义,就是专门用来传输文件的协议。FTP服务器则是在互联网上提供存储空间的计算机,它们依照FTP协议提供服务。当它们运行时,用户就可以连接到服务器上下载文件,也可以将自己的文件上传到FTP服务器中。有时把FTP服务器简称为FTP。FTP服务器的存在,大大方便了网友之间远程交换文件资料的需要,充分体现了互联网资源共享的精神。现在许多朋友都已经用上了宽带网,而且硬盘也有足够的空间,完全可以通过软件手段把自己的

    2022年7月21日
    21

发表回复

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

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