代码之家  ›  专栏  ›  技术社区  ›  Buhake Sindi Tesnep

带statement.return_生成的_键的PreparedStatement

  •  75
  • Buhake Sindi Tesnep  · 技术社区  · 14 年前

    一些JDBC驱动程序返回的唯一方法 Statement.RETURN_GENERATED_KEYS 是做以下事情:

    long key = -1L;
    Statement statement = connection.createStatement();
    statement.executeUpdate(YOUR_SQL_HERE, Statement.RETURN_GENERATED_KEYS);
    ResultSet rs = statement.getGeneratedKeys();
    if (rs != null && rs.next()) {
        key = rs.getLong(1);
    }
    

    有什么方法可以做同样的事吗 PreparedStatement ?


    编辑

    我问我是否能做同样的事情的原因 准备声明 考虑以下情况:

    private static final String SQL_CREATE = 
                "INSERT INTO
                USER(FIRST_NAME, MIDDLE_NAME, LAST_NAME, EMAIL_ADDRESS, DOB) 
                VALUES (?, ?, ?, ?, ?)";
    

    USER 桌子有一个 PRIMARY KEY (USER_ID) 这是一个 BIGINT AUTOINCREMENT (因此,为什么你在 SQL_CREATE 字符串。

    现在,我填充 ? 使用 PreparedStatement.setXXXX(index, value) . 我想回来 ResultSet rs = PreparedStatement.getGeneratedKeys() . 我怎样才能做到这一点?

    5 回复  |  直到 7 年前
        1
  •  128
  •   Buhake Sindi Tesnep    14 年前

    您可以使用 prepareStatement 采取额外的方法 int 参数

    PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
    

    对于某些JDBC驱动程序(例如,Oracle),您必须显式列出所生成键的列名或索引:

    PreparedStatement ps = con.prepareStatement(sql, new String[]{"USER_ID"})
    
        2
  •  62
  •   Prasad Khode    9 年前

    你的意思是这样的?

    long key = -1L;
    
    PreparedStatement preparedStatement = connection.prepareStatement(YOUR_SQL_HERE, PreparedStatement.RETURN_GENERATED_KEYS);
    preparedStatement.setXXX(index, VALUE);
    preparedStatement.executeUpdate();
    
    ResultSet rs = preparedStatement.getGeneratedKeys();
    
    if (rs.next()) {
        key = rs.getLong(1);
    }
    
        3
  •  9
  •   darioo    14 年前

    我现在没有编译器,我会问一个问题来回答:

    你试过这个吗?它能用吗?

    long key = -1L;
    PreparedStatement statement = connection.prepareStatement();
    statement.executeUpdate(YOUR_SQL_HERE, PreparedStatement.RETURN_GENERATED_KEYS);
    ResultSet rs = statement.getGeneratedKeys();
    if (rs != null && rs.next()) {
        key = rs.getLong(1);
    }
    

    免责声明:很明显,我还没有编纂过这本书,但你明白了。

    PreparedStatement 是的子接口 Statement ,所以我不明白为什么这不起作用的原因,除非一些JDBC驱动程序有问题。

        4
  •  1
  •   Dharmendrasinh Chudasama    7 年前
    String query = "INSERT INTO ....";
    PreparedStatement preparedStatement = connection.prepareStatement(query, PreparedStatement.RETURN_GENERATED_KEYS);
    
    preparedStatement.setXXX(1, VALUE); 
    preparedStatement.setXXX(2, VALUE); 
    ....
    preparedStatement.executeUpdate();  
    
    ResultSet rs = preparedStatement.getGeneratedKeys();  
    int key = rs.next() ? rs.getInt(1) : 0;
    
    if(key!=0){
        System.out.println("Generated key="+key);
    }
    
        5
  •  0
  •   Buhake Sindi Tesnep    12 年前
    private void alarmEventInsert(DriveDetail driveDetail, String vehicleRegNo, int organizationId) {
    
        final String ALARM_EVENT_INS_SQL = "INSERT INTO alarm_event (event_code,param1,param2,org_id,created_time) VALUES (?,?,?,?,?)";
        CachedConnection conn = JDatabaseManager.getConnection();
        PreparedStatement ps = null;
        ResultSet generatedKeys = null;
        try {
            ps = conn.prepareStatement(ALARM_EVENT_INS_SQL, ps.RETURN_GENERATED_KEYS);
            ps.setInt(1, driveDetail.getEventCode());
            ps.setString(2, vehicleRegNo);
            ps.setString(3, null);
            ps.setInt(4, organizationId);
            ps.setString(5, driveDetail.getCreateTime());
            ps.execute();
            generatedKeys = ps.getGeneratedKeys();
            if (generatedKeys.next()) {
                driveDetail.setStopDuration(generatedKeys.getInt(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
            logger.error("Error inserting into alarm_event : {}", e
                    .getMessage());
            logger.info(ps.toString());
        } finally {
            if (ps != null) {
                try {
    
                    if (ps != null)
                        ps.close();
                } catch (SQLException e) {
                    logger.error("Error closing prepared statements : {}", e
                            .getMessage());
                }
            }
        }
        JDatabaseManager.freeConnection(conn);
    }
    
    推荐文章