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

Posted Im X

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Statement和PreparedStatement有什么区别?哪个性能更好?预编译语句,防止sql注入问题相关的知识,希望对你有一定的参考价值。

答:与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注入问题的主要内容,如果未能解决你的问题,请参考以下文章

JDBC连接数据库(Java DataBase Connectivity,java)

JDBC预编译statement(preparedstatement)和statement的比较execute与executeUpdate的区别

Statement和ResultSet

JDBC学习笔记——Statement和ResultSet

Java_JDBC使用Statement和PreparedStatement

Java中PreparedStatement和Statement的用法区别