插入
更改成相应的SQL语句就差不多了,只不过最后的不是executeQuery()
,而是executeUpdate()
示例代码如下:
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {try (PreparedStatement ps = conn.prepareStatement("INSERT INTO students (id, grade, name, gender) VALUES (?,?,?,?)")) {ps.setObject(1, 999); // 注意:索引从1开始ps.setObject(2, 1); // gradeps.setObject(3, "Bob"); // nameps.setObject(4, "M"); // genderint n = ps.executeUpdate(); // 1}
}
更改的地方:
- SQL语句的更改
- 运行使用
executeUpdate()
自增主键的获取
本身有主键的数据库有主键的时候是不需要设置主键的,会自己分配。对于使用自增主键的程序,有些时候我们需要获取其自增主键,所以我们这个地方就来看如何获取。
(
主键:是数据库中用于唯一标识表中每一条记录的列或一组列。主键列的值必须是唯一的,且不能为 NULL
,确保表中的每一行都有一个独特的标识。
自增主键:自己可以指定一个主键,不用在每次插入数据的时候专门去单独给个主键值,他自己会设置值,并且会在每次插入新记录时自动递增,无需手动指定
)
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {try (PreparedStatement ps = conn.prepareStatement("INSERT INTO students (grade, name, gender) VALUES (?,?,?)",Statement.RETURN_GENERATED_KEYS)) {ps.setObject(1, 1); // gradeps.setObject(2, "Bob"); // nameps.setObject(3, "M"); // genderint n = ps.executeUpdate(); // 1try (ResultSet rs = ps.getGeneratedKeys()) {if (rs.next()) {long id = rs.getLong(1); // 注意:索引从1开始}}}
}
我们从中能看到的是在创建PreparedStatement
的时候,多加了一个参数:Statement.RETURN_GENERATED_KEYS
,确保在执行插入操作时,可以立即返回由数据库生成的自增主键,这个操作能解决两个问题:
- 若是先插入数据,再查询获取主键,这两者语句的执行时带有时间差的,如果这个时候其他的线程也对其进行了插入,那么获得的主键可能就是之后插入的,而不是之前的了
- 多个程序同时访问数据库时,直接依赖查询的结果可能不准确。比如,如果你查询的是最后一条记录,但并不保证是你刚刚插入的记录。
值得注意的是,这个地方没有使用SELECT LAST_INSERT_ID()
去获取主键,而是使用了getGeneratedKeys()
,这样做能够确保在并发环境下能够正确获取到当前插入记录的主键,而不会被其他并发插入操作影响。(因为LAST_INSERT_ID()
是获取最近一次插入操作生成的自增主键,一旦有并发的插入就会使得"最近"不是我们所认为的"最近")
而getGeneratedKeys()
方法会返回一个 ResultSet
对象,这个对象包含了数据库自动生成的主键的值,读取该对象的每一行来获取自增主键的值。如果一次插入多条记录,那么这个ResultSet
对象就会有多行返回值。如果插入时有多列自增,那么ResultSet
对象的每一行都会对应多个自增值(自增列不一定必须是主键)。
更新与删除
更新与删除的语句与插入在语法几乎相同,只需要更改SQL语句就行,这里就不多讲了,看下示例的代码就行
更新
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {try (PreparedStatement ps = conn.prepareStatement("UPDATE students SET name=? WHERE id=?")) {ps.setObject(1, "Bob"); // 注意:索引从1开始ps.setObject(2, 999);int n = ps.executeUpdate(); // 返回更新的行数}
}
删除
try (Connection conn = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) {try (PreparedStatement ps = conn.prepareStatement("DELETE FROM students WHERE id=?")) {ps.setObject(1, 999); // 注意:索引从1开始int n = ps.executeUpdate(); // 删除的行数}
}
这可能是最好的Spring教程!
感谢您看到这里 这可能是最好的Spring教程系列 更多的文章可以到这查看这可能是最好的Spring教程!即便无基础也能看懂的入门Spring,仍在持续更新。,我还在荔枝更新出最详细的Spring教程