mysql - 用于在查询中插入常量的绑定参数?
问题描述
在 Prepared Statement 中使用绑定参数(使用?)是在运行时在 SQL 查询中插入参数的流行策略。我的问题是,这种策略是否应该用于将常量插入查询?我说的是与用户输入的数据没有任何关系的常量。有什么理由不应该直接在 SQL 查询中使用这些常量,而是使用准备好的语句?
通过代码显示我在说什么:
public static final String x = "xxx";
getJdbcTemplate.update("SELECT * FROM TABLE WHERE COLUMN = ?", x);
对比
getJdbcTemplate.update("SELECT * FROM TABLE WHERE COLUMN = '" + x + "'");
解决方案
当您编写这样的查询时,
update("SELECT * FROM TABLE WHERE COLUMN = " + x,);
而不是这个,
update("SELECT * FROM TABLE WHERE COLUMN = ?", x);
第一个查询不会从查询的预编译中受益。
相反,当您使用 ? 在查询中,并且说生产中的查询运行了数百到数千到数百万次,预编译的查询(包含?的查询)被一次又一次地重复使用,避免了重新编译查询,这种现象使它变得更好性能方面,而不是包含硬编码数据的查询。
由于查询包含硬编码的数据,这使得查询每次都不同,因为硬编码的数据每次都会随着查询而变化,每次都需要编译查询,从而影响性能。
但是,如果您只需要运行几次查询,那么您将不会获得任何显着的性能提升。
推荐阅读
- ruby-on-rails - 文章不会显示在 Heroku 部署上
- android - 请求设置和proguard上的“未找到证书路径的信任锚”
- r - download.file() 错误:InternetOpenURL 失败:“安全通道支持出现错误”
- amazon-web-services - 为创建 ELB 规则而在 boto3 中传递的实际值是多少
- java - 电报用户不会收到来自机器人的消息
- javascript - 正则表达式(Javascript)允许忽略逗号
- ios - 处理 iPhoneX 的自定义标签栏
- html - 使一个非常宽的 div 水平滚动而不影响页面的其余部分
- mysql - 如何在 Mysql 和 Node.js express 中添加可选参数
- mongodb - 我想删除 MongoDB 文档中的特殊字符