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(一篇文章精通系列)