关于Spring Framework中JDBC逻辑的一些疑问

时间:2013-02-19 12:09:09

标签: java database spring spring-mvc jdbc

我正在学习本教程后的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变量包含一个表示我的查询的字符串,在这里我有第一个疑问

当我有:

字符串SQL =“插入学生(姓名,年龄)值(?,?)”;

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

mmm ...这听起来很奇怪,因为这看起来像一个字符串(事实上是whithin“”)

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

jdbcTemplateObject.update(SQL, name, age);

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

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

TNX

安德烈

2 个答案:

答案 0 :(得分:1)

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

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

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

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

请注意

中的姓名和年龄
jdbcTemplateObject.update(SQL, name, age);

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

jdbcTemplateObject.update(SQL, x, y);

在封面下,SPring将使用PreparedStatements,并且有助于阅读这些内容。

答案 1 :(得分:1)

  

当我有:

     

字符串SQL =“插入学生(姓名,年龄)值(?,?)”;

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

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