1

我正在学习如何在 Spring 应用程序中使用 JDBC,但我对此有些怀疑。

所以,让我解释一下我对一个实际例子的怀疑:

如果我有一个实现我的 DAO 接口的类,并且该类包含以下在我的数据库的 Student 表中插入新行的方法:

public void create(String name, Integer age) {
    String SQL = "insert into Student (name, age) values (?, ?)";

    jdbcTemplateObject.update(SQL, name, age);
    System.out.println("Created Record Name = " + name + " Age = " + age);
    return;
}

此方法有 2 个输入参数:与我的数据库表中的两列(NAME 和 AGE)相关的名称年龄

好的...我认为 SQL 字符串 rappresent 我的 SQL 查询必须执行才能在我的表中插入新行

我有一些问题要理解这段代码的确切含​​义:值(?,?)

我认为,当我在 JdbcTemplate 对象上调用 update() 方法时,会向它传递 SQL 查询以及名称和 *年龄值这些?占位符替换为这些值。

这样查询就可以执行了。

这样对吗?

是替换这些占位符的 update() 方法吗?

我还读到使用了这些占位符,所以我不必担心转义我的值......究竟是什么意思转义一个值

最后一个问题是关于PreparedStatment的使用……阅读我读过的 Spring 文档,我还可以将 PreparedStatment 传递给 update() 方法……有什么区别?在这种情况下是 Spring 使用 SQL 字符串和 2 输入参数创建一个新的 PreparedStatment 还是我使用了不同的东西?

4

1 回答 1

1

主要是为了避免SQL注入。

如果你刚刚这样做:

"insert into Student (name, age) values ('"+name+"', "+age+")"

name考虑如果是会发生什么"mary', 3), ('john', 13)--"

查询变为:

insert into Student (name, age) values ('mary', 3), ('john', 13)--', 24)

当您忽略 SQL 注释时--

insert into Student (name, age) values ('mary', 3), ('john', 13)

将插入 2 条记录。

您当然可以转义或过滤名称字符串,但这很容易出错并且很容易忘记并使某些查询易受攻击,不妨使用准备好的语句来使这成为不可能。

转义意味着在任何 SQL 元字符之前添加一个转义字符,以便其含义发生变化。

如果您对名称进行了转义,则查询将是:

insert into Student (name, age) values ('\', 3), (\'john\', 13)--', 24)

IE 这个名字实际上是"', 3), ('john', 13)--",并且没有发生 SQL 注入。

于 2013-02-19T16:39:32.487 回答