programing

JDBC에서 삽입 ID를 얻는 방법

goodsources 2022. 8. 14. 12:26
반응형

JDBC에서 삽입 ID를 얻는 방법

는 ★★★★ 싶다.INSERTJava(JDBC)는 Microsoft SQL Server(Microsoft SQL Server)를 사용합니다.아이디JDBC API는 JDBC API를 사용합니다.

자동 생성된 키일 경우 이를 사용할 수 있습니다.같은 방법으로 호출해야 합니다.Statement 사용되고 것과 같이INSERT먼저 를 반환하도록 JDBC 드라이버에 통지하기 위해 를 사용하여 스테이트먼트를 작성해야 합니다.

기본적인 예를 다음에 나타냅니다.

public void create(User user) throws SQLException {
    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_INSERT,
                                      Statement.RETURN_GENERATED_KEYS);
    ) {
        statement.setString(1, user.getName());
        statement.setString(2, user.getPassword());
        statement.setString(3, user.getEmail());
        // ...

        int affectedRows = statement.executeUpdate();

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

        try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
            if (generatedKeys.next()) {
                user.setId(generatedKeys.getLong(1));
            }
            else {
                throw new SQLException("Creating user failed, no ID obtained.");
            }
        }
    }
}

JDBC 드라이버에 의존하여 동작하고 있는 것에 주의해 주세요.현시점에서는 이전 버전의 대부분은 동작합니다만, 제 생각이 맞다면 Oracle JDBC 드라이버는 아직 다소 문제가 있습니다.MySQL 및 DB2는 이미 오랫동안 이 기능을 지원했습니다.포스트그레SQL이 이를 지원하기 시작한 것은 얼마 전입니다.MSSQL을 사용한 적이 없기 때문에 코멘트는 할 수 없습니다.

Oracle을 할 수 .CallableStatement a RETURNING acclause a.SELECT CURRVAL(sequencename) 의 구문) 에 있는 ('DB')INSERT동일한 트랜잭션에서 마지막으로 생성된 키를 가져옵니다.이 답변도 참조해 주세요.

  1. 생성된 열 생성

    String generatedColumns[] = { "ID" };
    
  2. 이 유전 컬럼을 당신의 진술에 전달합니다.

    PreparedStatement stmtInsert = conn.prepareStatement(insertSQL, generatedColumns);
    
  3. ResultSet에서 on StatementGeneratedKeys를

    ResultSet rs = stmtInsert.getGeneratedKeys();
    
    if (rs.next()) {
        long id = rs.getLong(1);
        System.out.println("Inserted ID -" + id); // display inserted record
    }
    

싱글 스레드 JDBC 기반 응용 프로그램에서 Microsoft SQL Server 2008 R2를 검색하여 RETURN_GERATED_KEYS 속성이나 Prepared Statement를 사용하지 않고 마지막 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;
} 

이 블로그 투고에서는 SQL Server의 3가지 주요 "마지막 ID" 옵션(http://msjawahar.wordpress.com/2008/01/25/how-to-find-the-last-identity-value-inserted-in-the-sql-server/)을 명확하게 구분하고 있습니다.다른 2가지 옵션은 아직 필요하지 않습니다.

' feature'했을 경우 feature' 가됩니다.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();
}

서 ★★★★★BATCHID아이디 '아이디.

댓글 대신 댓글로 대답하고 싶어요.


인터페이스 java.sql.준비 스테이트먼트

  1. columnIndexes you컬럼을 받아들이는 prepareStatement 함수를 사용할 수 있습니다.인덱스 및 SQL 문.[ Where ]카람허용되는 인덱스는 Statement입니다.RETURN_GERATED_KEYS1 또는 스테이트먼트.NO_GERATED_KEYS[2], 하나 이상의 '?' 매개 변수 자리 표시자를 포함할 수 있는 SQL 문입니다.

    구문 »

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

    예:

    PreparedStatement pstmt = 
        conn.prepareStatement( insertSQL, Statement.RETURN_GENERATED_KEYS );
    

  1. column Names 반환되는 자동 생성 키가 포함된 타겟테이블 내의 column Names like 를 나열합니다. SQL 문이 문이 아닌 경우 드라이버는 이러한 명령을 무시합니다.

    구문 »

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

SQL Server 2008을 사용하고 있지만 개발 제한이 있습니다.새로운 드라이버를 사용할 수 없습니다.com.microsoft.jdbc.sqlserver를 사용해야 합니다.SQLServerDriver"("com.microsoft.sqlserver.jdbc"는 사용할 수 없습니다.SQLServerDriver' (SQLServerDriver).

그래서 해결책은conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)java.drives를 던졌습니다.AbstractMethodError를 지정합니다.이 경우 Microsoft가 제안한 오래된 솔루션을 찾을 수 있습니다.JDBC를 사용하여 @@IDENTY 값을 취득하는 방법

import java.sql.*; 
import java.io.*; 

public class IdentitySample
{
    public static void main(String args[])
    {
        try
        {
            String URL = "jdbc:microsoft:sqlserver://yourServer:1433;databasename=pubs";
            String userName = "yourUser";
            String password = "yourPassword";

            System.out.println( "Trying to connect to: " + URL); 

            //Register JDBC Driver
            Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();

            //Connect to SQL Server
            Connection con = null;
            con = DriverManager.getConnection(URL,userName,password);
            System.out.println("Successfully connected to server"); 

            //Create statement and Execute using either a stored procecure or batch statement
            CallableStatement callstmt = null;

            callstmt = con.prepareCall("INSERT INTO myIdentTable (col2) VALUES (?);SELECT @@IDENTITY");
            callstmt.setString(1, "testInputBatch");
            System.out.println("Batch statement successfully executed"); 
            callstmt.execute();

            int iUpdCount = callstmt.getUpdateCount();
            boolean bMoreResults = true;
            ResultSet rs = null;
            int myIdentVal = -1; //to store the @@IDENTITY

            //While there are still more results or update counts
            //available, continue processing resultsets
            while (bMoreResults || iUpdCount!=-1)
            {           
                //NOTE: in order for output parameters to be available,
                //all resultsets must be processed

                rs = callstmt.getResultSet();                   

                //if rs is not null, we know we can get the results from the SELECT @@IDENTITY
                if (rs != null)
                {
                    rs.next();
                    myIdentVal = rs.getInt(1);
                }                   

                //Do something with the results here (not shown)

                //get the next resultset, if there is one
                //this call also implicitly closes the previously obtained ResultSet
                bMoreResults = callstmt.getMoreResults();
                iUpdCount = callstmt.getUpdateCount();
            }

            System.out.println( "@@IDENTITY is: " + myIdentVal);        

            //Close statement and connection 
            callstmt.close();
            con.close();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }

        try
        {
            System.out.println("Press any key to quit...");
            System.in.read();
        }
        catch (Exception e)
        {
        }
    }
}

이 솔루션은 나에게 효과가 있었다!

도움이 됐으면 좋겠네요!

다음 Java 코드를 사용하여 새로 삽입된 ID를 얻을 수 있습니다.

ps = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, quizid);
ps.setInt(2, userid);
ps.executeUpdate();

ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) {
    lastInsertId = rs.getInt(1);
}

일반 사용 가능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.");
  }
}

휴지 상태의 NativeQuery에서는 SingleResult 대신 ResultList를 반환해야 합니다. 휴지 상태의 경우 네이티브 쿼리가 수정되기 때문입니다.

INSERT INTO bla (a,b) VALUES (2,3) RETURNING id

맘에 들다

INSERT INTO bla (a,b) VALUES (2,3) RETURNING id LIMIT 1

단일 결과를 얻으려고 하면 대부분의 데이터베이스가 발생합니다(적어도 Postgre).SQL)을 사용하여 구문 오류를 발생시킵니다.그 후 목록(일반적으로 한 항목만 포함)에서 결과 ID를 가져올 수 있습니다.

내 경우 ->

ConnectionClass objConnectionClass=new ConnectionClass();
con=objConnectionClass.getDataBaseConnection();
pstmtGetAdd=con.prepareStatement(SQL_INSERT_ADDRESS_QUERY,Statement.RETURN_GENERATED_KEYS);
pstmtGetAdd.setString(1, objRegisterVO.getAddress());
pstmtGetAdd.setInt(2, Integer.parseInt(objRegisterVO.getCityId()));
int addId=pstmtGetAdd.executeUpdate();              
if(addId>0)
{
    ResultSet rsVal=pstmtGetAdd.getGeneratedKeys();
    rsVal.next();
    addId=rsVal.getInt(1);
}

Spring JDBC를 사용하는 경우 Spring의 GeneratedKey를 사용할 수 있습니다.삽입된 ID를 가져오는 홀더 클래스.

이 답을 보세요...Spring Jdbctemplate.update(String sql, obj...args)를 사용하여 ID를 삽입하는 방법

JDBC(MySQL로 테스트 완료)를 사용하고 있고 마지막으로 삽입된 ID만 원하는 경우 쉽게 얻을 수 있는 방법이 있습니다.사용하고 있는 방법은 다음과 같습니다.

public static Integer insert(ConnectionImpl connection, String insertQuery){

    Integer lastInsertId = -1;
    try{
        final PreparedStatement ps = connection.prepareStatement(insertQuery);
        ps.executeUpdate(insertQuery);
        final com.mysql.jdbc.PreparedStatement psFinal = (com.mysql.jdbc.PreparedStatement) ps;
        lastInsertId = (int) psFinal.getLastInsertID();
        connection.close();
    } catch(SQLException ex){
        System.err.println("Error: "+ex);
    }

    return lastInsertId;
}

또, (혹시나 하는 경우) 를 입수하는 방법ConnectionImpl는 다음과 같습니다.

public static ConnectionImpl getConnectionImpl(){
    ConnectionImpl conexion = null;

    final String dbName = "database_name";
    final String dbPort = "3306";
    final String dbIPAddress = "127.0.0.1";
    final String connectionPath = "jdbc:mysql://"+dbIPAddress+":"+dbPort+"/"+dbName+"?autoReconnect=true&useSSL=false";
    
    final String dbUser = "database_user";
    final String dbPassword = "database_password";
    try{
        conexion = (ConnectionImpl) DriverManager.getConnection(connectionPath, dbUser, dbPassword);
    }catch(SQLException e){
        System.err.println(e);
    }
    
    return conexion;
}

커넥터/J를 프로젝트 참조 라이브러리에 추가해야 합니다.

이 경우 커넥터/J 버전은 5.1.42입니다.변경 사항을 적용해야 할 수도 있습니다.connectionPath버전 8.0.28과 같은 최신 버전의 커넥터/J를 사용하는 경우

파일에서 다음 리소스를 가져오는 것을 잊지 마십시오.

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.mysql.jdbc.ConnectionImpl;

이것이 도움이 되기를 바랍니다.

Connection cn = DriverManager.getConnection("Host","user","pass");
Statement st = cn.createStatement("Ur Requet Sql");
int ret  = st.execute();

언급URL : https://stackoverflow.com/questions/1915166/how-to-get-the-insert-id-in-jdbc

반응형