gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:48:01 24 4
gpt4 key购买 nike

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

那么,让我通过一个实际例子来解释一下我的疑问:

如果我有一个实现 DAO 接口(interface)的类,并且该类包含以下在数据库的 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 个输入参数:nameage,它们与我的数据库表中的两列(NAME 和 AGE)相关

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

我无法理解这段代码的确切含​​义:values(?, ?)

我认为当我在 JdbcTemplate 对象上调用 update() 方法时,传递给它的 SQL 查询以及 name 和 *age 值这些?占位符将替换为这些值。

因此可以执行查询。

对吗?

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

我还了解到使用了这些占位符,因此我不必担心转义我的值...转义值到底意味着什么?

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

最佳答案

主要是为了避免SQL注入(inject)。

如果您刚刚这样做:

"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)

即名称字面上是 "', 3), ('john', 13)--" 并且没有发生 SQL 注入(inject)。

关于java - 有关 Spring Framework 应用程序中 JDBC 逻辑的一些信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14962480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com