JdbcTemplate - 替换问号

Posted

技术标签:

【中文标题】JdbcTemplate - 替换问号【英文标题】:JdbcTemplate - replace question mark 【发布时间】:2015-11-17 13:43:26 【问题描述】:

我有一个 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 数组中的参数替换,但它没有那样工作。

是否可以做我想要实现的,但不能通过手动向字符串添加参数?

【问题讨论】:

where语句中只能用于参数的问号。不适用于 select 语句中的列 【参考方案1】:

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

【讨论】:

好的,但是还有其他方法可以做我想做的事吗?哪个以安全的方式将字符串插入到查询中? 不,为什么不能使用“Select *”? 因为查询可以返回一个巨大的对象列表,并且可能只需要一些列。我不想在查询后解析列表。 好的,那么您可以针对不同的业务案例使用不同的选择查询。 "我不想在查询后解析列表" 【参考方案2】:

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

您可以尝试一种特殊的图案来标记您要更换的部件。通常这是不好的做法(由于可能的 sql 注入攻击)

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

为了确保安全,您必须确保"name" 不会被攻击者注入。尝试使用字符串常量 (final static String) 或枚举。切勿在未经验证的情况下接受来自外部(Web 浏览器、环境变量)的值。

【讨论】:

以上是关于JdbcTemplate - 替换问号的主要内容,如果未能解决你的问题,请参考以下文章

Java之Spring JdbcTemplate(一篇文章精通系列)

使用 JDBCTemplate 在“IN”子句中将 List<String> 作为查询参数传递时获取 PSQL 异常

Spring对JDBC的支持

springjdbc

spring heibernate 调用存储过程

将问号 (?) 替换为 (\\?)