【问题标题】:Some doubts about the logic of JDBC in Spring FrameworkSpring Framework中JDBC逻辑的一些疑惑
【发布时间】:2013-02-19 12:09:08
【问题描述】:

我正在按照本教程学习 Spring Framework 上的 JDBC 使用:http://www.tutorialspoint.com/spring/spring_jdbc_example.htm

所以我的 MySql DB 上有一个名为 Student 的下表:

mysql> describe Student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| ID    | int(11)     | NO   | PRI | NULL    | auto_increment |
| NAME  | varchar(20) | NO   |     | NULL    |                |
| AGE   | int(11)     | NO   |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

正如您在教程链接中看到的,我有一个名为 StudentDAO 的接口,它描述了我的 DAO 对象的这个 Student 表上的 CRUD 操作

好的,看看 StudentJDBCTemplate 类:这是 StudentDAO 接口的一个实现,所以在这个类中,我拥有在界面。

好的...我对这个类中的 JDBC 方法的含义有些疑问。

例如当我有类似的东西时:

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;
}

好的...我认为这个方法在我的学生表中创建一个新记录

SQL 变量包含一个表示我的 查询 的字符串,在这里我有第一个疑问

当我有:

String SQL = "insert into Student (name, age) values (?, ?)";

究竟是什么意思?意思是我create()的两个入参代替了这个String里面的“name”和“age”?

嗯...这对我来说听起来很奇怪,因为这看起来像一个字符串(实际上是“”)

第二个疑问与以下行有关:

jdbcTemplateObject.update(SQL, name, age);

如果我在 SQL 字符串中有 SQL 查询,为什么还要传递变量名和年龄?

您能帮我理解一下 JDBC 的工作原理吗?

Tnx

安德烈亚

【问题讨论】:

标签: java database spring spring-mvc jdbc


【解决方案1】:

当我有:

String SQL = "insert into Student (name, age) values (?, ?)";

究竟是什么意思?意思是我create()的两个入参代替了这个String里面的“name”和“age”?

JDBC 将用适当的值替换两个? 占位符。这被视为一种很好的做法,因为它有助于防止 SQL 注入。

【讨论】:

  • 其实JDBC驱动甚至数据库服务器都会将?占位符替换为参数值。
  • @MarkRotteveel 感谢您澄清这一点。我会更新我的答案。
【解决方案2】:

这个

insert into Student (name, age) values (?, ?)

表示您要在表Student 中插入一条记录(行),并指定(按顺序)名称和年龄。每个 '?'指的是按顺序指定的列名,所以第一个'?'是名称值等的占位符。请注意,您可以插入记录并且(允许约束)仅指定列的子集,因此您可以只指定名称​​或年龄,或者如果该列存在。

这种占位符 (?) 机制的存在使您不必担心转义 name 等的值,并通过连接/替换生成 SQL 语句 that isn't valid。占位符允许您为名称插入任何字符串,而无需担心引号、SQL cmets 等,如果您只是使用串联构造字符串,则会导致问题,例如

String sql = "insert into Student... " + name + ", " + age;

注意姓名和年龄

jdbcTemplateObject.update(SQL, name, age);

引用 Java 变量而不是表列名。他们可以很容易地

jdbcTemplateObject.update(SQL, x, y);

在幕后,SPring 将使用PreparedStatements,阅读这些内容很有启发性。

【讨论】:

  • 拜托,你能更好地解释一下你的占位符机制是什么意思吗?在这种情况下,值究竟是什么意思(?,?)这意味着如果我只将名称值放入我的表中,我必须执行以下操作:插入学生(名称)值(?)对吗?如果是...如果我只将年龄值放在新表行中,我该怎么办? Tnx
  • 差不多就是这样。如果您编写了 SQL 并忘记了 JDBC,您将编写“插入学生(姓名,年龄)值('Andrea', 21)”
猜你喜欢
  • 2013-02-13
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2015-02-04
  • 2015-06-07
  • 1970-01-01
  • 2012-08-20
相关资源
最近更新 更多