【问题标题】:Parameterized sql queries with JDBC template使用 JDBC 模板的参数化 sql 查询
【发布时间】:2014-10-09 14:00:28
【问题描述】:

我遇到了一个问题,我的带有单个参数的参数化查询可以正常运行,但是当插入多个参数时,它就不起作用了。

以下方法可以正常工作:

public Employee getEmployeeByID(int id) {
    String sql = "SELECT firstname, lastname FROM employees WHERE employeeID = ?";
    List<Employee> list = getEmployeeList(sql, id);
    if (list.isEmpty()) {
        return null;
    }
    return list.get(0);
}

这里是getEmployeeList,它依赖于:

private List<Employee> getEmployeeList(String sql, Object... params) {
    List<Employee> list = new ArrayList<Employee>();
    for (Object o : template.query(sql, mapper, params)) {
        list.add((Employee) o);
    }
    return list;
}

请注意,template 是自动装配的 JDBCTemplate,mapper 是自动装配的 RowMapper。

但是,这种方法根本不起作用:

public List<Employee> getEmployeesBySearchCriteria(String criteria) {

    //business logic that determines the values
    //of Strings firstname, lastname, and keyword...

    String sql = "SELECT firstname, lastname FROM employees WHERE UPPER(firstname) LIKE UPPER('%?%') ? UPPER(lastname) LIKE UPPER('%?%')";

    return getEmployeeList(sql, firstname, keyword, lastname);

}

我收到以下错误:

java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).

我知道我可以手动将每个字符串附加到 sql 语句中,但我担心 sql 注入,我不知道为什么这不起作用。我的语法有问题吗?还是我完全错了?

【问题讨论】:

  • 这种方式不能绑定关键字。您需要使用字符串连接来完成该操作。
  • @Laurence 虽然这是一个解决方案,但由于可能存在 sql 注入,这是一个不可接受的解决方案。我很确定 Spring 有办法为我处理它,但我不太明白。
  • 对此不确定,但我记得遇到过这样的问题。它可能与'%?%' 部分有关。尝试仅使用? 并将% 直接添加到您的字符串中。
  • 在纯 SQL 术语中,您会为关键字使用白名单。我不知道 Spring 是否有某种魔力可以跨平台的方式让这件事变得更容易。
  • 你说得对,@Jul13nT,它不喜欢那个部分。将它附加到我的字符串参数中效果很好。继续回答这个问题,我会接受的。

标签: java mysql sql spring jdbc


【解决方案1】:

您不能在类似的情况下使用 ? 那样的 '%?%'。您需要删除 % 并将它们附加到您的字符串中。例如:

public List<Employee> getEmployeesBySearchCriteria(String criteria) {

    String sql = "SELECT firstname, lastname FROM employees WHERE UPPER(firstname) LIKE UPPER(?)";

    return getEmployeeList(sql, "%" + firstname + "%");

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    • 2014-05-13
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多