Java 对Spring框架中JDBC逻辑的质疑

Java 对Spring框架中JDBC逻辑的质疑,java,database,spring,spring-mvc,jdbc,Java,Database,Spring,Spring Mvc,Jdbc,在本教程之后,我正在研究JDBC在Spring框架上的使用: 因此,我的MySql数据库中有一个名为Student的表: mysql> describe Student; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+---

在本教程之后,我正在研究JDBC在Spring框架上的使用:

因此,我的MySql数据库中有一个名为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=“插入学生(姓名、年龄)值(?,)”

到底什么意思?这意味着my create()的两个输入参数将取代这个字符串中的“name”和“age”

嗯……这听起来很奇怪,因为这看起来像一根弦(实际上是whithin“”)

scond疑点与以下行有关:

jdbcTemplateObject.update(SQL, name, age);
如果在SQL字符串中有SQL查询,为什么还要传递变量名和年龄

你能帮助我更好地理解JDBC是如何工作的吗

Tnx

安德里亚

这个

insert into Student (name, age) values (?, ?)
表示您正在将记录(行)插入表
Student
,并(按顺序)指定姓名和年龄。每个“?”都是指按顺序指定的列名,因此第一个“?”是名称值等的占位符。请注意,您可以插入一条记录,并且(允许的约束)只能指定列的子集,因此,如果该列存在,您可以只指定名称或年龄或其他内容

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

String sql = "insert into Student... " + name + ", " + age;
请注意,中的名称和年龄

jdbcTemplateObject.update(SQL, name, age);
请参考Java变量,而不是表列名。它们也可能很容易被发现

jdbcTemplateObject.update(SQL, x, y);
在SPring将使用的封面下,阅读这些内容很有启发性

当我有:

String SQL=“插入学生(姓名、年龄)值(?,)”

到底什么意思?这意味着my create()的两个输入参数将取代这个字符串中的“name”和“age”


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

请阅读相关内容,您能更好地解释一下占位符机制的含义吗?在这种情况下,值的确切含义是什么?这意味着,如果我只在表中输入name值,我必须执行以下操作:插入学生(name)值(?)对吗?如果是…如果我只将年龄值放入新表行中,我必须做什么?差不多就是这样。如果您编写了SQL而忘记了JDBC,您会写“insert into Student(name,age)values('Andrea',21)”,实际上,JDBC驱动程序甚至数据库服务器将用参数值替换
占位符。@MarkRotteveel感谢您的澄清。我会更新我的答案。