-1

我正在按照本教程研究 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 接口的一个实现所以在这个类中,我拥有在接口内声明的 CRUD 方法的所有实现。

好的...我对此类中的 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 = "插入学生(姓名,年龄)值(?,?)";

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

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

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

jdbcTemplateObject.update(SQL, name, age);

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

你能帮助我理解 JDBC 是如何工作的吗?

肿瘤坏死因子

安德烈亚

4

2 回答 2

1

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

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

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

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

注意姓名和年龄

jdbcTemplateObject.update(SQL, name, age);

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

jdbcTemplateObject.update(SQL, x, y);

在幕后,SPring 将使用PreparedStatements,阅读这些内容很有指导意义。

于 2013-02-19T12:11:26.510 回答
1

当我有:

String SQL = "插入学生(姓名,年龄)值(?,?)";

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

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

于 2013-02-19T12:23:03.003 回答