“参数索引超出范围(2>参数数量,即1)。”对于两个参数的声明

时间:2018-12-18 15:00:43

标签: spring prepared-statement spring-jdbc jdbctemplate

我正在按照本教程学习Spring JdbcTemplate,它具有以下示例,可以很好地工作:

public void deleteDog(String name, Long id) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.update("DELETE FROM dog WHERE name='" + name + "' AND id=" + id);
}

但这对我来说似乎是一个SQL注入漏洞,所以我尝试将其重写如下:

public void deleteDog(String name, Long id) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.update("DELETE FROM dog WHERE name='?' AND id=?", name, id);
}

现在我得到的是“参数索引超出范围(2>参数数量,即1)”。但是它显然在DELETE语句中对参数有两个问号...同样,从该教程进行的更新在这种风格下可以很好地使用三个参数:

    jdbcTemplate.update("INSERT INTO dog(name, rescued, vaccinated) VALUES (?, ?, ?)",
            name, rescued, vaccinated);

因此,看起来好像我在误用带有多个参数的update方法。我在这里误会什么?

1 个答案:

答案 0 :(得分:0)

使用PreparedStatement的参数时删除'周围的字符:

public void deleteDog(String name, Long id) {
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.update("DELETE FROM dog WHERE name=? AND id=?", name, id);
}