无法在 Java Spring Boot 中将值放入 SQL 语句中

问题描述

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