无法将值放入 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);
我有 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);