[java] JDBCで挿入IDを取得する方法は?


Answers

シングルスレッドのJDBCベースのアプリケーションからMicrosoft SQL Server 2008 R2を起動し、RETURN_GENERATED_KEYSプロパティまたはPreparedStatementを使用せずに最後のIDを取り戻しています。 次のような感じです。

private int insertQueryReturnInt(String SQLQy) {
    ResultSet generatedKeys = null;
    int generatedKey = -1;

    try {
        Statement statement = conn.createStatement();
        statement.execute(SQLQy);
    } catch (Exception e) {
        errorDescription = "Failed to insert SQL query: " + SQLQy + "( " + e.toString() + ")";
        return -1;
    }

    try {
        generatedKey = Integer.parseInt(readOneValue("SELECT @@IDENTITY"));
    } catch (Exception e) {
        errorDescription = "Failed to get ID of just-inserted SQL query: " + SQLQy + "( " + e.toString() + ")";
        return -1;
    }

    return generatedKey;
} 

このブログの投稿は、3つの主要なSQL Serverの「最後のID」オプションをうまく分離していますhttp://msjawahar.wordpress.com/2008/01/25/how-to-find-the-last-identity-value-inserted-in-the-sql-server/ : http://msjawahar.wordpress.com/2008/01/25/how-to-find-the-last-identity-value-inserted-in-the-sql-server/ - 他の2つはまだ必要ありません。

Question

私はJavaでJDBCを使用してデータベース(私の場合はMicrosoft SQL Server)にレコードをINSERTしたいと思います。 同時に、私は挿入IDを取得したいと思います。 JDBC APIを使用してこれをどのように達成できますか?




それは通常のStatementのものでも使うことができます( PreparedStatementだけでなく)

Statement statement = conn.createStatement();
int updateCount = statement.executeUpdate("insert into x...)", Statement.RETURN_GENERATED_KEYS);
try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
  if (generatedKeys.next()) {
    return generatedKeys.getLong(1);
  }
  else {
    throw new SQLException("Creating failed, no ID obtained.");
  }
}



Statement.RETURN_GENERATED_KEYSを使用している「サポートされていない機能」エラーによると、これを試してください:

    String[] returnId = { "BATCHID" };
    String sql = "INSERT INTO BATCH (BATCHNAME) VALUES ('aaaaaaa')";
    PreparedStatement statement = connection
            .prepareStatement(sql, returnId);
    int affectedRows = statement.executeUpdate();

    if (affectedRows == 0) {
        throw new SQLException("Creating user failed, no rows affected.");
    }

    try (ResultSet rs = statement.getGeneratedKeys()) {
        if (rs.next()) {
            System.out.println(rs.getInt(1));
        }
        rs.close();

    }

BRANCHIDは自動生成されたIDです




comment代わりに、私はポストに答えるだけです。

インタフェースjava.sql.PreparedStatement

  1. columnIndexes «columnIndexesとSQL文を受け入れるprepareStatement関数を使用できます。 Statement.RETURN_GENERATED_KEYS commentまたはStatement.NO_GENERATED_KEYS [2]は、columnIndexesで許可される定数フラグが1つ以上の '?' INパラメータプレースホルダ。

    SYNTAX«

    Connection.prepareStatement(String sql, int autoGeneratedKeys)
    Connection.prepareStatement(String sql, int[] columnIndexes)
    

    例:

    PreparedStatement pstmt = 
        conn.prepareStatement( insertSQL, Statement.RETURN_GENERATED_KEYS );
    
  1. columnNames « 'id', 'uniqueID', ...など'id', 'uniqueID', ... columnNamesを一覧表示し'id', 'uniqueID', ... ターゲット表に、戻されるべき自動生成キーが入っています。 SQLステートメントがINSERTステートメントでない場合、ドライバーはそれらを無視します。

    SYNTAX«

    Connection.prepareStatement(String sql, String[] columnNames)
    

    例:

    String columnNames[] = new String[] { "id" };
    PreparedStatement pstmt = conn.prepareStatement( insertSQL, columnNames );
    

完全な例:

public static void insertAutoIncrement_SQL(String UserName, String Language, String Message) {
    String DB_URL = "jdbc:mysql://localhost:3306/test", DB_User = "root", DB_Password = "";

    String insertSQL = "INSERT INTO `unicodeinfo`( `UserName`, `Language`, `Message`) VALUES (?,?,?)";
            //"INSERT INTO `unicodeinfo`(`id`, `UserName`, `Language`, `Message`) VALUES (?,?,?,?)";
    int primkey = 0 ;
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        Connection conn = DriverManager.getConnection(DB_URL, DB_User, DB_Password);

        String columnNames[] = new String[] { "id" };

        PreparedStatement pstmt = conn.prepareStatement( insertSQL, columnNames );
        pstmt.setString(1, UserName );
        pstmt.setString(2, Language );
        pstmt.setString(3, Message );

        if (pstmt.executeUpdate() > 0) {
            // Retrieves any auto-generated keys created as a result of executing this Statement object
            java.sql.ResultSet generatedKeys = pstmt.getGeneratedKeys();
            if ( generatedKeys.next() ) {
                primkey = generatedKeys.getInt(1);
            }
        }
        System.out.println("Record updated with id = "+primkey);
    } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}





Related