자바 표 기록 삽입 후 증가 하 는 id (회전) (3 가지 방법 코드 첨부)

원문
http://www.sthelse.com/2010/07/java-to-insert-in-the-main-table-record-id-from-the-table-for-the-main-table-as-a-foreign-key.html#comment-2264
MySQL 에서 auto 사용 하기increment 형식의 id 필드 는 표 의 메 인 키 로 하고 다른 표 의 외 키 로 사용 하여 '메 인 테이블 구조' 를 형성 합 니 다. 이것 은 데이터베이스 디자인 에서 흔히 볼 수 있 는 용법 입 니 다.그러나 구체 적 으로 id 를 생 성 할 때 우리 의 작업 순 서 는 보통 주 표 에 기록 을 삽입 한 다음 에 자동 으로 생 성 된 id 를 얻 고 이 를 바탕 으로 표 의 기록 을 삽입 하 는 것 입 니 다.
이 안에 어려움 이 있 습 니 다. 메 인 시트 기록 을 삽입 한 후에 해당 하 는 id 를 어떻게 얻 는 지 하 는 것 입 니 다.일반적인 방법 은 "select max (id) from tablename" 을 통 해 이 루어 집 니 다. 그러나 이러한 방법 은 병행 하 는 상황 을 고려 해 야 합 니 다. 업무 중 에 메 인 시트 에 "X 자물쇠" 를 넣 고 max (id) 의 값 을 얻 은 후에 잠 금 을 풀 어야 합 니 다. 이런 방법 은 절차 가 비교적 많 고 번 거 로 우 며 동시성 도 좋 지 않 습 니 다. 더 간단 한 방법 이 있 습 니까?
 
정 답 중 하 나 는 select LAST INSERT ID () 를 통 해 작 동 합 니 다. 언뜻 보기 에는 select max (id) 와 비슷 하지만 실제로는 스 레 드 가 안전 합 니 다. 즉, 데이터베이스 에 구체 적 으로 연 결 된 것 입 니 다. 다음은 실험 을 통 해 설명 합 니 다.
1. 연결 1 에 A 표 에 기록 을 삽입 하고 A 표 는 auto increment 형식의 필드 를 포함 합 니 다.
2. 연결 2 에서 A 표 에 기록 을 하나 더 삽입 합 니 다.
3. 결과: 연결 1 에서 select LAST INSERT ID () 를 실행 한 결과 와 연결 2 에서 select LAST INSERT ID () 를 실행 한 결 과 는 다 르 며, 두 연결 에서 select max (id) 를 실행 한 결 과 는 같 습 니 다. 사실 MSSQL 에서 SCOPE IDENTITY () 와 IDENT CURRENT () 의 차 이 는 여기 와 유사 합 니 다. SCOPE IDENTITY () 를 사용 합 니 다.IDENTITY 필드 에 삽 입 된 현재 세 션 의 값 을 얻 을 수 있 으 며, IDENT CURRENT () 를 사용 하면 세 션 을 구분 하지 않 고 특정한 IDENTITY 필드 에 삽 입 된 최대 값 을 얻 을 수 있 습 니 다.
주: select last insert id () 를 사용 할 때 주의해 야 합 니 다. 한 번 에 여러 개의 기록 을 삽입 할 때 첫 번 째 삽 입 된 id 값 만 얻 을 수 있 으 니 주의 하 십시오!
물론 JDBC 에 추가 기록 을 한 후 API 를 사용 하여 새로운 추가 기록 의 메 인 키 값 을 얻 는 또 다른 편리 한 방법 도 사용 할 수 있다.
이 는 Statement 의 getGenerated Keys 방법 을 사 용 했 습 니 다. Statement 이 기록 을 추가 하면 getGenerated Keys 방법 으로 새로운 추가 기록 을 얻 을 수 있 는 key 를 직접 호출 할 수 있 습 니 다.
테스트 프로그램 은 다음 과 같 습 니 다.
 
Java        

    import java.sql.Connection;  
    import java.sql.DriverManager;  
    import java.sql.ResultSet;  
    import java.sql.Statement;  
      
    public class GetGenerateKey {  
      
        public static void main(String[] args) throws Exception {  
            create();  
        }  
      
        public static void create()throws Exception {  
            System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");  
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc", "root", "");  
            Statement st = conn.createStatement();  
            String sql = "insert into user (name, birthday, money) values ('beck', '1949-10-01', 60)";  
            st.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);  
            ResultSet rs = st.getGeneratedKeys();  
            if (rs.next()) {  
                int id = rs.getInt(1);  
                System.out.println ("     key  :" + id);  
            }  
            st.close();  
            conn.close();  
        }  
    }  

 
 
 
프로그램 실행 결과: 기록 생 성 키: 9
데이터베이스 기록:
  1 +----+----------+------------+-------+ 2 | id | name     | birthday   | money | 3 +----+----------+------------+-------+ 4 | 9  | beck     | 1949-10-01 |    60 | 5 +----+----------+------------+-------+
요약: 이 API 방법 은 새로운 기록 을 얻 을 수 있 는 key 값 을 다시 실행 하지 않 아 도 된다 는 장점 을 제공 합 니 다. 작업량 과 서버 의 부담 을 줄 였 습 니 다.
주의 하 세 요. execute Update 방법 을 실행 할 때 키 생 성 을 되 돌려 주 는 옵션 을 지정 해 야 합 니 다.
===========================================================
2 가지 방법의 자바 코드
 
Java        

    //              id      
        PreparedStatement pstmt = conn.prepareStatement(sql.toString(),PreparedStatement.RETURN_GENERATED_KEYS);  
      
        for (int i = 0; i < pars.length; i++) {  
            pstmt.setObject(i+1, pars[i]);  
        }  
        pstmt.executeUpdate();   
          
        long autoIncKeyFromApi = -1;  
        ResultSet rs = pstmt.getGeneratedKeys();  
        if (rs.next()) {  
          autoIncKeyFromApi = rs.getInt(1);  
        }  
          
        return autoIncKeyFromApi;  

 
 
Java        

    qRunner.update(conn,sql.toString(),pars);  
              
            Long zsysqID = (Long) qRunner.query(conn, "SELECT LAST_INSERT_ID()", new ScalarHandler(1));   
          

좋은 웹페이지 즐겨찾기