1

私は現在、ビデオ チュートリアルを見ていますが、次のコードで本当に混乱しています。

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.getGeneratedKeys()ですが、Statement オブジェクトを実行した結果、自動生成されたキーを返すのに、なぜgetInt()メソッドを呼び出す必要があるのでしょうか。

また、デフォルトでは、カーソルは挿入された行の前を指してnext()get.GeneratedKeys()ます。next()を取得する前にカーソルが最初の結果行に移動するように、メソッドを最初に呼び出すべきではありませんGeneratedKeyか?

4

1 に答える 1

5

2つのこと。一部のデータベースは、行ごとに複数の生成されたキーを返すことができます。それらは整数である必要はなく、GUID 文字列などである可能性があります。getInt(1)したがって、上記のコードを呼び出す必要があります。次に、あなたは間違っています。JDBC によって返される ResultSet は最初の行のに配置されるため、next() を呼び出す必要があります。ResultSet に行がない場合、 next() を呼び出すとfalse、結果がないことを示す戻り値が返されます。

于 2013-11-09T06:45:01.937 に答える