无法将值放入 Java Spring 引导中的 SQL 语句

Cannot put value into SQL Statement in Java Spring Boot

我有 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);

returns 零个对象。

我在将值传递到此语句时遇到问题。

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);