स्टेटमेंट के साथ तैयार किया गया। RETURN_GENERATED_KEYS


83

एक ही रास्ता है कि कुछ 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?


संपादित करें

कारण मैंने पूछा कि क्या मैं 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()। इसे कैसे प्राप्त किया जा सकता है?


2
बहुत से लोग गलत समझ लेते हैं और ReadyedStatement # executeUpdate (arg) का उपयोग करते हैं। Java doc का कहना है कि This method with argument cannot be called on a PreparedStatement or CallableStatement.इसका मतलब है कि हमें executeUpdate () का उपयोग तर्क के बिना करना होगा भले ही executeUpdate(arg)विधि ReadyedStatement वर्ग में विरासत में मिली हो, लेकिन हमें इसका उपयोग करने की आवश्यकता नहीं है अन्यथा हमें SQLException मिलेगी।
अमित जी

जवाबों:


141

आप या तो prepareStatementएक अतिरिक्त intपैरामीटर लेने वाली विधि का उपयोग कर सकते हैं

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

कुछ JDBC ड्राइवरों के लिए (उदाहरण के लिए, Oracle) आपको स्पष्ट रूप से जनरेट की गई कुंजी के कॉलम नामों या सूचकांकों को सूचीबद्ध करना होगा:

PreparedStatement ps = con.prepareStatement(sql, new String[]{"USER_ID"})

मैंने आपका उत्तर स्वीकार कर लिया है क्योंकि आपने उसी परिणाम को प्राप्त करने के लिए और तरीके दिखाए हैं।
बुहके सिंडी

67

क्या आपका मतलब इस तरह की किसी चीज से है?

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);
}

कैसे उत्पन्न की गई कुंजी परिणाम शून्य हो सकती है?
एलिकएल्ज़िन-किलोका

10

अभी मेरे पास कंपाइलर नहीं है, मैं एक प्रश्न पूछकर उत्तर दूंगा:

क्या आपने यह कोशिश की है? क्या यह काम करता है?

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 के subinterface है वक्तव्य , तो मैं एक कारण नहीं दिख रहा है क्यों यह नहीं होगा काम करते हैं, जब तक कि कुछ JDBC ड्राइवर को गाड़ी नहीं है।


यह नहीं है कि मैं क्या देख रहा हूँ मुझे पता है कि PreparedStatementएक उपवर्ग है Statement.... मेरी अद्यतन पोस्ट देखें।
बुहके सिंडी

2
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);
}

यदि कुंजी उत्पन्न होती है तो कुंजी अन्यथा कुंजी = 0 यदि उत्पन्न नहीं होती है
धर्मेंद्रसिंह चुडासमा

0
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);
}

1
क्या आपको अपने कनेक्शन को अंत में ब्लॉक नहीं करना चाहिए, इसके बाहर नहीं (यदि आप किसी भी प्रकार का रनटाइम अपवाद प्राप्त करते हैं तो आप कनेक्शन छोड़ देंगे)?
जूल्स

@niraj - ps.RETURN_GENERATED_KEYS के बजाय हम स्टेटमेंट लिख सकते हैं। RETURN_GENERATED_KEYS क्योंकि यह java.sql.Statement वर्ग में स्थिर चर है।
अमित जी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.