preparestatement:JDBC中使用预编译Statement以及它的优

 2021-07-06 8:31    77  

preparestatement:JDBC中使用预编译Statement以及它的优点

JDBC中PreparedStatement与Statement一样是用于执行SQL语句的preparestatement,比如增加,删除

preparestatement:JDBC中使用预编译Statement以及它的优点

1. 使用PreparedStatement

preparestatement:JDBC中使用预编译Statement以及它的优点

和 Statement一样,PreparedStatement也是用来执行sql语句的,与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接preparestatement:

preparestatement:JDBC中使用预编译Statement以及它的优点

preparestatement:JDBC中使用预编译Statement以及它的优点

2. PreparedStatement的优点1 - 参数设置

preparestatement:JDBC中使用预编译Statement以及它的优点

Statement 需要进行字符串拼接preparestatement,可读性和维护性比较差

preparestatement:JDBC中使用预编译Statement以及它的优点

preparestatement:JDBC中使用预编译Statement以及它的优点

PreparedStatement 使用参数设置,可读性好,不易犯错

3. PreparedStatement的优点2 - 性能表现

PreparedStatement有预编译机制,性能比Statement更快

4. PreparedStatement的优点3 - 防止SQL注入式攻击

假设name是用户提交来的数据

使用Statement就需要进行字符串拼接

拼接出来的语句是:

因为有OR 1=1,这是恒成立的

那么就会把所有的人都查出来,而不只是IronMan

如果表里的数据是海量的,比如几百万条,把这个表里的数据全部查出来

会让数据库负载变高,CPU100%,内存消耗光,响应变得极其缓慢

而PreparedStatement使用的是参数设置,就不会有这个问题

最后,我自己是一名从事了多年开发的JAVA老程序员,辞职目前在做自己的java私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的java学习干货,可以送给每一位喜欢java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:java,即可免费获取。

作者: GatesMa

来源:CSDN

Statement和PrepareStatement的区别

preparestatement:JDBC中使用预编译Statement以及它的优点

首先来看看它们之间的联系,两者都是接口,都是由Connection接口创建得到的,而PreparedStatement呢,它是Statement的子接口,是继承于Statement接口而得到的。

再来看一看它们之间的区别

那么PreparedStatement和Statement相比呢,有以下几点好处。

1.从代码的可读性和可维护性来说

PreparedStatement在执行sql语句时可以包含动态参数占位符“?”,在执行时可以为占位符“?”动态设置参数值,而Statement不支持占位符“?”替换变量,只能在sql中拼接参数。

所以在代码的可读性以及可维护性上,PreparedStatement接口大大提高了代码的可读性和可维护性。

2.PreparedStatement会尽最大可能提高性能

我们知道sql语句的在数据库中执行都是需要DBMS编译的,而PreparedStatement会预编译sql语句,因此当多次执行时,只需DBMS运行sql语句,而不必再编译。而Statement没有预处理,每次都要重新编译,所以当多次执行这条sql语句时,PreparedStatement效率会大大的提高。

3.最重要的一点是PreparedStatement可以防止sql注入,极大地提高了安全性

PreparedStatement可防止sql注入。sql注入情况如下所示:

如果有一条登录的sql语句:

"select * from user where name = 'zhangsan' and password = 123456";

Statement的sql语句是这样写的:

"select * from user where name = '" + username + "' and password ='" + password + "'";

这样我们就发现输入用户名:'or'1=1'#,密码随意输入时,

Statement是将这个和sql语句做字符串连接到一起执行,变成了select * from user where `username` = ''or' 1=1'# and `password` =123456,而#这个字符后面的在MySQL数据库中会把它当做注释,所以sql就变成了select * from user where `username` = ''or'1=1',这样的sql语句执行会导致永远都可以登录成功。而PreparedStatement是将'or'1=1'# 作为一个字符串赋值给占位符“?”赋值,作为"用户名"字段的对应值,显然这样SQL注入就可以避免了。

本文标签:区别

原文链接:https://www.xgfox.com/jsyd/487.html

本文版权:如无特别标注,本站文章均为原创。