我正在学习本教程后的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
安德烈
答案 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注入。