问题描述
我有 private static final String sql_SEARCH_ALL = "SELECT * FROM product WHERE name LIKE '%?%'";
sql 语句,我需要在其中传递查询字符串。当我传递一个像 ?
这样的字符串而不是 '%cola%'
标记时,它工作正常。
我像以前一样使用 JdbcTemplate 传递参数
return jdbcTemplate.query(sql_SEARCH_ALL,new Object[]{searchInput},productRowMapper);
返回零个对象。
我在将值传递到此语句时遇到问题。
解决方法
JDBC 参数不是在您使用 ?
标记的任何地方替换的字符串;这会将查询打开到 SQL 注入。根据每个数据库和每个 JDBC 驱动程序,?
参数标记的允许位置各不相同。
可以肯定地说,参数通常可以放在典型文字值可以去的地方,但情况并非总是如此。例如,在 DB2 中,子句 FETCH FIRST 5 ROWS ONLY
不接受 ?
而不是文字 5
。
就您而言,典型的解决方案是使用 CONCAT()
。例如:
private static final String SQL_SEARCH_ALL =
"SELECT * FROM product WHERE name LIKE CONCAT('%',?,'%')";
当然你需要决定你想要发生什么是提供了一个空参数。那里可能有一个 COALESCE()
函数。
在 Java(或任何语言)中执行此操作的标准方法是使用单个 ?
占位符,然后将通配符表达式绑定到该占位符:
private static final String SQL_SEARCH_ALL = "SELECT * FROM product WHERE name LIKE ?";
String searchInput = "%cola%";
return jdbcTemplate.query(SQL_SEARCH_ALL,new Object[]{ searchInput },productRowMapper);