【问题标题】:JdbcTemplate - replace question markJdbcTemplate - 替换问号
【发布时间】: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 语句中的列

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


【解决方案1】:

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

【讨论】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-06-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2018-08-23
    相关资源
    最近更新 更多