为了防止 SQL 注入攻击,我项目中的所有 SQL 语句代码都应该转换为参数化查询。但是当查询条件包含“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 的参数化查询吗?我知道这项工作可以由 NamedParameterJdbcTemplate 完成,是否只有 NamedParameterJdbcTemplate 可以做 IN case 查询?
非常感谢。