无法将值放入Java Spring启动中的SQL语句中
我有无法将值放入Java Spring启动中的SQL语句中,java,sql,spring-boot,jdbctemplate,Java,Sql,Spring Boot,Jdbctemplate,我有私有静态最终字符串SQL\u SEARCH\u ALL=“SELECT*FROM product WHERE name LIKE“%”?%”SQL语句,其中我需要传递一个查询字符串。当我传递一个类似于'%cola%'的字符串,而不是?标记时,它工作正常 我使用JdbcTemplate传递paramater,就像以前一样 return jdbcTemplate.query(SQL_SEARCH_ALL, new Object[]{searchInput}, productRowMapper);
私有静态最终字符串SQL\u SEARCH\u ALL=“SELECT*FROM product WHERE name LIKE“%”?%”代码>SQL语句,其中我需要传递一个查询字符串。当我传递一个类似于'%cola%'
的字符串,而不是?
标记时,它工作正常
我使用JdbcTemplate传递paramater,就像以前一样
return jdbcTemplate.query(SQL_SEARCH_ALL, new Object[]{searchInput}, productRowMapper);
返回零个对象
我在将值传递到此语句时遇到问题。JDBC参数不是在使用?
标记的任何地方替换的字符串;这将打开对SQL注入的查询。根据每个数据库和每个JDBC驱动程序,?
参数标记的允许位置各不相同
可以肯定地说,参数通常可以到达典型文本值可以到达的地方,但情况并非总是如此。例如,在DB2中,子句只获取前5行
不接受?
而不是文本5
在您的情况下,典型的解决方案是使用CONCAT()
。例如:
private static final String SQL_SEARCH_ALL =
"SELECT * FROM product WHERE name LIKE CONCAT('%', ?, '%')";
当然,如果提供了null参数,您需要决定希望发生什么。这里可能有一个COALESCE()
函数。在Java(或任何语言)中执行此操作的标准方法是使用单个?
占位符,然后将通配符表达式绑定到该占位符:
private static final String SQL\u SEARCH\u ALL=“SELECT*FROM product WHERE name LIKE?”;
字符串searchInput=“%cola%”;
返回jdbcTemplate.query(SQL_SEARCH_ALL,新对象[]{searchInput},productRowMapper);
这可能不起作用,因为您试图将通配符?
占位符连接到两侧的%
。相反,这里应该使用一个?
占位符。@TimBiegeleisen我不知道你在说什么。该语句可以正常工作,例如ps.setString(1,“lamp”)如果使用了code>,则它会发现lamp
显示在其名称
列的任何地方的任何产品,并且我所知道的每个JDBC库都允许在该位置使用?
。@rzwitserloot不同意您之前的评论。@TimBiegeleisen您误解了这个答案。去试试吧,它很好用。@rzwitserroot我刚刚用Lombok库做了一个小的Spring Boot项目。好东西,它有助于使我的Java代码尽可能少。