【问题标题】:Some information about the JDBC logic in Spring Framework application关于 Spring Framework 应用程序中 JDBC 逻辑的一些信息
【发布时间】:2013-02-04 10:17:36
【问题描述】:

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

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

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

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 字符串 rappresent 我的 SQL 查询必须执行才能在我的表中插入新行

我在理解这段代码的确切含​​义时遇到了一些问题:values(?, ?)

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

这样查询就可以执行了。

对吗?

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

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

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

【问题讨论】:

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


    【解决方案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 注入。

    【讨论】:

    • 这不仅仅是为了防止SQL注入。它还提高了性能(但多少取决于 DBMS)
    • @a_horse_with_no_name 我根本没有说是这样 - 我只是说这是主要目的。
    • @AndreaNobili update() 方法确实将?s 替换为您传递给该方法的值。它在幕后使用PreparedStatement
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2013-02-13
    • 2012-12-01
    • 2012-02-11
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多