您的位置:首页 > 数据库 > MySQL

preparedStatement 理解

2015-12-01 20:35 387 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql jdbc