• Oracle Java JDBC: Get Primary Key Of Inserted Record


     

    oracle-logoHere is a small write-up which should help those who still write plain Java JDBC code. I know we have some wonderful persistence frameworks like Hibernate that make ones life comfortable but the reality is we still have to deal with plain old JDBC apis. If you are poor chap like me, below code should make your life easy.

    Problem statement:

    I just inserted a record in Oracle database using Java JDBC. The primary key column was auto populated by a sequence value. How should I get the last inserted records auto generated primary key?

    Solution:

    The solution should be getGeneratedKeys(). This method was added in JDBC 3.0 and it should be used to get last auto generated key value.

    See code snippet below:

    PreparedStatement prepareStatement = connection.prepareStatement("insert...",
            new String[] { "your_primary_key_column_name" });
     
    prepareStatement.executeUpdate();
     
    ResultSet generatedKeys = prepareStatement.getGeneratedKeys();
    if (null != generatedKeys && generatedKeys.next()) {
         Long primaryKey = generatedKeys.getLong(1);
    }

    The above code should give us auto generated primary key value. The one thing to note here is method prepareStatement(). We passed two arguments first the insert query string and second an array of column name. The column name should be the primary key column name of table where you inserting the record.

    Check below source code to see complete solution.

    Full solution

    We have a database table called STUDENTS. We also have an oracle sequence called STUDENT_SEQ that we uses to generate primary key for STUDENTS table.

    CREATE TABLE STUDENTS
    (
       STUDENT_ID   NUMBER NOT NULL PRIMARY KEY,
       NAME         VARCHAR2 (50 BYTE),
       EMAIL        VARCHAR2 (50 BYTE),
       BIRTH_DATE   DATE
    );
     
     
    CREATE SEQUENCE STUDENT_SEQ
       START WITH 0
       MAXVALUE 9999999999999999999999999999
       MINVALUE 0;

    In Java, we use plain JDBC calls to insert a record in STUDENTS table. We uses sequence STUDENT_SEQto generate primary key. Once the record is inserted, we want the last inserted primary value.

    String QUERY = "INSERT INTO students "+
                   "  VALUES (student_seq.NEXTVAL,"+
                   "         'Harry', 'harry@hogwarts.edu', '31-July-1980')";
     
    // load oracle driver
    Class.forName("oracle.jdbc.driver.OracleDriver");
     
    // get database connection from connection string
    Connection connection = DriverManager.getConnection(
            "jdbc:oracle:thin:@localhost:1521:sample", "scott", "tiger");
     
    // prepare statement to execute insert query
    // note the 2nd argument passed to prepareStatement() method
    // pass name of primary key column, in this case student_id is
    // generated from sequence
    PreparedStatement ps = connection.prepareStatement(QUERY,
            new String[] { "student_id" });
     
    // local variable to hold auto generated student id
    Long studentId = null;
     
    // execute the insert statement, if success get the primary key value
    if (ps.executeUpdate() > 0) {
     
        // getGeneratedKeys() returns result set of keys that were auto
        // generated
        // in our case student_id column
        ResultSet generatedKeys = ps.getGeneratedKeys();
     
        // if resultset has data, get the primary key value
        // of last inserted record
        if (null != generatedKeys && generatedKeys.next()) {
     
            // voila! we got student id which was generated from sequence
            studentId = generatedKeys.getLong(1);
        }
     
    }

    The above code is filled with comments and is pretty self explanatory. Finally we have last inserted value in studentId variable.

    The getGeneratedKeys() method is key here. It gives us the result set of all auto generated key values. In our case as we have only one auto generated value (for student_id column) we get only single record in this result set.

  • 相关阅读:
    结对编程作业——毕设导师智能匹配
    结对项目之需求分析与原型设计
    Excel绘制之甘特图
    Excel绘图之数据波动条形图
    Excel绘图之漏斗图
    Excel绘图之四象限散点图
    软件工程实践总结
    发送手机验证码
    个人作业——软件产品案例分析
    用例图
  • 原文地址:https://www.cnblogs.com/hephec/p/4563150.html
Copyright © 2020-2023  润新知