JDBC的数据库更新

插入

更改成相应的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); // grade
        ps.setObject(3, "Bob"); // name
        ps.setObject(4, "M"); // gender
        int 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); // grade
        ps.setObject(2, "Bob"); // name
        ps.setObject(3, "M"); // gender
        int n = ps.executeUpdate(); // 1
        try (ResultSet rs = ps.getGeneratedKeys()) {
            if (rs.next()) {
                long id = rs.getLong(1); // 注意:索引从1开始
            }
        }
    }
}

我们从中能看到的是在创建PreparedStatement​的时候,多加了一个参数:Statement.RETURN_GENERATED_KEYS​,确保在执行插入操作时,可以立即返回由数据库生成的自增主键,这个操作能解决两个问题:

  1. 若是先插入数据,再查询获取主键,这两者语句的执行时带有时间差的,如果这个时候其他的线程也对其进行了插入,那么获得的主键可能就是之后插入的,而不是之前的了
  2. 多个程序同时访问数据库时,直接依赖查询的结果可能不准确。比如,如果你查询的是最后一条记录,但并不保证是你刚刚插入的记录。

值得注意的是,这个地方没有使用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(); // 删除的行数
    }
}

posted @ 2025-01-10 17:05  ENchantEd丨  阅读(52)  评论(0)    收藏  举报