gpt4 book ai didi

java - JdbcTemplate 不支持Parameterized Query 'IN' case?一定要通过NamedParameterJdbcTemplate吗?

转载 作者:行者123 更新时间:2023-11-29 09:09:25 26 4
gpt4 key购买 nike

为了防止SQL注入(inject)攻击,我的项目中的所有SQL语句代码都应该转换为Parameterized Query。但是当查询条件包含“IN”案例时,我遇到了问题。像这样(使用 DB2 数据库):

String employeeId = 'D2309';
String name = "%brady%";

List<Integer> userRights = new ArrayList<Integer>();
userRights.add(1);
userRights.add(2);
userRights.add(3);

String sql = "SELECT * FROM T_EMPLOYEE WHERE EMPLOYEE_ID = ? AND NAME LIKE ?
AND RIGHT IN (?)";

jdbcTemplate.query(sql, new Object[] {employeeId, name, userRights}, new
EmployeeRowMapper());

上述代码运行失败,异常:

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad 
SQL grammar [SELECT * FROM T_EMPLOYEE WHERE EMPLOYEE_ID = ? AND NAME LIKE ? AND
RIGHT IN (?)]; nested exception is com.ibm.db2.jcc.am.io: [jcc][1091][10824]
[3.57.82] .... ERRORCODE=-4461, SQLSTATE=42815

这里的问题是JdbcTemplate不支持IN case的Parameterized Query吗?而且我知道这个工作可以通过NamedParameterJdbcTemplate来完成,是否只有NamedParameterJdbcTemplate可以做IN case查询?

非常感谢。

最佳答案

正如我在评论中提到的,我对这个解决方案不满意,因为它会动态生成大量 SQL 语句。给定 userRights 的数量在 1 到 n 之间,它需要缓存中最多 n 个准备好的语句。

下面应该可以工作(我没试过)。

String employeeId = 'D2309';
String name = "%brady%";

List<Integer> userRights = new ArrayList<Integer>();
userRights.add(1);
userRights.add(2);
userRights.add(3);

// build the input string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < userRights.size; i++) {
sb.append("?");
if (i < userRights.size() - 1) {
sb.append(", ");
}
}

// build the SQL
String sql = "SELECT * FROM T_EMPLOYEE WHERE EMPLOYEE_ID = ?" +
" AND NAME LIKE ?" +
" AND RIGHT IN (" + sb.toString() + ")";

// init the object array
// size is employeeId + name + right
Object[] param = new Object[2 + userRights.size()];

// fill it
param[0] = employeeId;
param[1] = name;

for (int i = 0; i < userRights.size(); i++) {
param[i + 2] = userRights.get(i);
}

jdbcTemplate.query(sql, param, new EmployeeRowMapper());

关于java - JdbcTemplate 不支持Parameterized Query 'IN' case?一定要通过NamedParameterJdbcTemplate吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13190249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com