preparedStatement 理解

来源:互联网 发布:db2删除一列的sql语句 编辑:程序博客网 时间:2024/05/20 02:22

preparedStatement :可以翻译为 预编译语句.

mysql 参考文档中的例子:

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';mysql> PREPARE stmt2 FROM @s;mysql> SET @a = 6;mysql> SET @b = 8;mysql> EXECUTE stmt2 USING @a, @b;+------------+| hypotenuse |+------------+|         10 |+------------+mysql> DEALLOCATE PREPARE stmt2;

预编译语句 stmt2 在进行prepare 定义的时候会被先编译优化,然后保存在缓存中.这个预编译语句是session 变量.

优势:
1.而后面传入的参数不再被数据库当做SQL 语句来执行,所以可以防止SQL 注入.

2.因为prepared statements 是保存在内存中,第二次传入不同的变量时,直接调用,不需要再次分析 sql,编译,优化,所以性能上要比单独再次执行sql 语句要好.

限制:

为了防止SQL注入攻击,PreparedStatement不允许一个占位符(?)有多个值,在执行有IN子句查询的时候这个问题变得棘手起来。下面这个SQL查询使用PreparedStatement就不会返回任何结果.

SELECT * FROM loan WHERE loan_type IN (?)preparedSatement.setString(1, "'personal loan', 'home loan', 'gold loan'");

参考:
mysql Prepared Statements reference
JDBC为什么要使用PreparedStatement而不是Statement

0 0
原创粉丝点击