码迷,mamicode.com
首页 > 数据库 > 详细

【Statement和PreparedStatement有什么区别?哪个性能更好?预编译语句,防止sql注入问题】

时间:2017-12-23 15:56:03      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:接口   结果   计划   dstat   exe   bool   密码   false   字符串   

答:与Statement相比,①PreparedStatement接口代表预编译的语句,它主要的优势在于可以减少SQL的编译错误并增加SQL的安全性(减少SQL注射攻击的可能性);②PreparedStatement中的SQL语句是可以带参数的,避免了用字符串连接拼接SQL语句的麻烦和不安全;③当批量处理SQL或频繁执行相同的查询时,PreparedStatement有明显的性能上的优势,由于数据库可以将编译优化后的SQL语句缓存起来,下次执行相同结构的语句时就会很快(不用再次编译和生成执行计划)。

 

SQL注入问题

假设有登录案例SQL语句如下:

SELECT * FROM 用户表 WHERE NAME = 用户输入的用户名 AND PASSWORD = 用户输的密码;

此时,当用户输入正确的账号与密码后,查询到了信息则让用户登录。但是当用户输入的账号为XXX 密码为:XXX’  OR ‘a’=’a时,则真正执行的代码变为:

SELECT * FROM 用户表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’  OR ’a’=’a’;

此时,上述查询语句时永远可以查询出结果的。那么用户就直接登录成功了,显然我们不希望看到这样的结果,这便是SQL注入问题。

为此,我们使用PreparedStatement来解决对应的问题。

API详解:预处理对象

使用PreparedStatement预处理对象时,建议每条sql语句所有的实际参数,都使用逗号分隔。

String sql = "insert into sort(sid,sname) values(?,?)";;

PreparedStatement预处理对象代码:

PreparedStatement psmt = conn.prepareStatement(sql)

         常用方法:

  1. 执行SQL语句:

l  int executeUpdate(); --执行insert update delete语句.

l  ResultSet executeQuery(); --执行select语句.

l  boolean execute(); --执行select返回true 执行其他的语句返回false.

  1. 设置实际参数

l  void setXxx(int index, Xxx xx) 将指定参数设置为给定Java的xx值。在将此值发送到数据库时,驱动程序将它转换成一个 SQL Xxx类型值。

例如:

setString(2, "家用电器") 把SQL语句中第2个位置的占位符? 替换成实际参数 "家用电器"

【Statement和PreparedStatement有什么区别?哪个性能更好?预编译语句,防止sql注入问题】

标签:接口   结果   计划   dstat   exe   bool   密码   false   字符串   

原文地址:http://www.cnblogs.com/wy20110919/p/8093399.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!