我正在学习如何在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还是使用不同的东西?
答案 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注入。