java中statement是啥_Java面试题Statement和PrepareStatement的区别,你知道吗?

03cc89185b4ecd2d0a00fe5e229dcd0f.png

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

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

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

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

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

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

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

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

63952847c8530215de648bda21030197.png

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注入就可以避免了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值