首页 > 解决方案 > 用于在查询中插入常量的绑定参数?

问题描述

在 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 + "'");

标签: mysqloracleprepared-statementjdbctemplate

解决方案


当您编写这样的查询时,

update("SELECT * FROM TABLE WHERE COLUMN = " + x,);

而不是这个,

update("SELECT * FROM TABLE WHERE COLUMN = ?", x);

第一个查询不会从查询的预编译中受益。

相反,当您使用 ? 在查询中,并且说生产中的查询运行了数百到数千到数百万次,预编译的查询(包含?的查询)被一次又一次地重复使用,避免了重新编译查询,这种现象使它变得更好性能方面,而不是包含硬编码数据的查询。

由于查询包含硬编码的数据,这使得查询每次都不同,因为硬编码的数据每次都会随着查询而变化,每次都需要编译查询,从而影响性能。

但是,如果您只需要运行几次查询,那么您将不会获得任何显着的性能提升。


推荐阅读