java - Statement.getGenerateKeys() 方法

标签 java

我目前正在观看视频教程,我对这段代码感到非常困惑:

public static boolean insert(Member mbr) throws Exception {

    String SQL = "INSERT INTO test (first_name, last_name) " +
                "VALUES (?, ?)";
    ResultSet keys = null;
    try (
            Connection con = DBUtil.getConnection(DBType.MYSQL);
            PreparedStatement stmt = con.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
        ) {

        stmt.setString(1, mbr.getFname());
        stmt.setString(2,  mbr.getLname());
        int affected = stmt.executeUpdate();

        if (affected == 1) {
            keys = stmt.getGeneratedKeys();
            keys.next();
            int newKey = keys.getInt(1);
            mbr.setMemberid(newKey);
        } else {
            System.err.println("No rows affected");
            return false;
        } 
    } finally {
        if (keys != null) keys.close();
    }
    return true;
}

关于stmt.getGenerateKeys()方法,既然它返回的是执行Statement对象时自动生成的key,为什么还需要调用getInt() 方法?

此外,默认情况下,光标指向插入行之前,那么为什么要在 get.GenerateKeys() 之前调用 next() 方法呢?是否应该先调用 next() 方法,以便在获取 GenerateKey 之前光标会转到第一个结果行?

最佳答案

有两件事。某些数据库可以每行返回多个生成的键,并且它们不必是整数,它们可以是 GUID 字符串或其他内容。因此,您需要在上面的代码中调用getInt(1)。其次,你错了,JDBC返回的ResultSet位于第一行之前,因此需要调用next()。如果 ResultSet 没有行,则调用 next() 返回 false 表示没有结果。

关于java - Statement.getGenerateKeys() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19873190/

相关文章:

Java ImageView 字符串作为 src

接口(interface)、EJB 和 Servlet 中的 Javadoc

java - 在内部存储android中存储浮点值

Java:将浮点十进制数转换为整数的幂

java - 用于在 Java Swing 中删除的 KeyStroke

java - Hibernate 如何检测实体对象的脏状态?

java - Android SDK组件中的SDK工具和Build Tool有什么区别?

java - 为什么我会出现差一错误?

java - 如何让鼠标移动在 JPanel 内的多个不同 ImageIcons 上正常工作?

java - Eclipse 包资源管理器未正确显示