有关Spring Framework应用程序中JDBC逻辑的一些信息

时间:2013-02-19 16:28:58

标签: java spring spring-mvc jdbc prepared-statement

我正在学习如何在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字符串代表我的SQL查询必须执行才能在表格中插入新行

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

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

因此可以执行查询。

是不是?

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

我还读过这些占位符被使用,所以我不必担心逃避我的价值......究竟是什么意思逃避价值

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

1 个答案:

答案 0 :(得分: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)

I.E名称实际上是"', 3), ('john', 13)--"并且没有发生SQL注入。