preparedStatement 理解
2015-12-01 20:35
387 查看
preparedStatement :可以翻译为 预编译语句.
mysql 参考文档中的例子:
预编译语句 stmt2 在进行prepare 定义的时候会被先编译优化,然后保存在缓存中.这个预编译语句是session 变量.
优势:
1.而后面传入的参数不再被数据库当做SQL 语句来执行,所以可以防止SQL 注入.
2.因为prepared statements 是保存在内存中,第二次传入不同的变量时,直接调用,不需要再次分析 sql,编译,优化,所以性能上要比单独再次执行sql 语句要好.
限制:
为了防止SQL注入攻击,PreparedStatement不允许一个占位符(?)有多个值,在执行有IN子句查询的时候这个问题变得棘手起来。下面这个SQL查询使用PreparedStatement就不会返回任何结果.
参考:
mysql Prepared Statements reference
JDBC为什么要使用PreparedStatement而不是Statement
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
相关文章推荐
- jdbc中的Statement和PreparedStatement接口对象
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜