JdbcTemplate - 替换问号

时间:2015-11-17 13:43:27

标签: spring jdbc spring-boot spring-jdbc jdbctemplate

我有一个SQL查询。

String sql = "SELECT ? FROM Users WHERE Lastname=?";

我使用JDBCTemplate

中的方法queryForList
Object [] myparams = {"name", "Doe"};
int [] mytypes = {Types.VARCHAR, Types.VARCHAR};
List<Map<String,Object>> listOfMaps = jdbc.queryForList(sql, myparams, mytypes);

输出不正确,因为第一个问号出现问题。我认为问号将被myparams数组中的参数替换,但它没有那样工作。

是否可以做我想要实现的目标,但不能手动将参数添加到字符串中?

2 个答案:

答案 0 :(得分:2)

您只能将问号用于where语句中的参数。

答案 1 :(得分:1)

JDBC和Spring都没有提供从较小的部分构建SQL查询的方法。

您可以尝试使用特殊图案来标记要替换的部件。一般来说,这不是一个好习惯(由于可能的SQL注入攻击)

 String sql = "SELECT ${columns} FROM Users WHERE Lastname=?"
     .replace("${columns}", "name");

为确保安全,您必须确保攻击者无法注入"name"。尝试使用字符串常量(final static String)或枚举。永远不要接受来自外部的值(网络浏览器,环境变量)而不验证它们。