CodeGym /행동 /All lectures for KO purposes /ResultSet을 사용한 고급 작업

ResultSet을 사용한 고급 작업

All lectures for KO purposes
레벨 1, 레슨 821
사용 가능

결과 집합 사용자 정의

최신 JDBC API를 사용하면 개체를 크게 사용자 지정할 수 있습니다.성명그리고결과 집합. 예를 들어,결과 집합데이터베이스의 행을 변경할 수 있습니다.

statement 객체를 생성할 때 우리는 우리의 희망 사항을 전달할 수 있습니다. 이러한 소원은 세 그룹으로 나눌 수 있습니다.

  • 기본 연결 유형
  • 동시 액세스 제어
  • 지속성 및 트랜잭션

이러한 매개변수는 개체를 만들 때 전달할 수 있습니다.성명또는준비된 진술. 예:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

우리는 이러한 것들을 깊이 연구하지는 않겠지만 다른 사람의 코드에서 비슷한 것을 발견하면 이것이 가능하다는 것을 알고 싶습니다.

결과 집합 유형

ResultSet은 특정 유형일 수 있습니다. 유형은 ResultSet의 일부 특성 및 기능을 정의합니다.

모든 유형이 모든 데이터베이스 및 JDBC 드라이버에서 지원되는 것은 아닙니다. 데이터베이스와 JDBC 드라이버가 사용하려는 유형을 지원하는지 확인해야 합니다. DatabaseMetaData.supportsResultSetType(int type) 메소드는 주어진 유형이 지원되는지 여부에 따라 true 또는 false를 반환합니다 .

작성 당시에는 세 가지 유형의 ResultSet이 있습니다.

  • ResultSet.TYPE_FORWARD_ONLY
  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.TYPE_SCROLL_SENSITIVE

기본 유형은 TYPE_FORWARD_ONLY입니다.

TYPE_FORWARD_ONLY 는 ResultSet이 앞으로만 이동할 수 있음을 의미합니다. 즉, 1행, 2행, 3행 등에서만 이동할 수 있습니다. ResultSet에서는 뒤로 이동할 수 없습니다. 10번째 행을 읽은 후 9번째 행에서 데이터를 읽을 수 없습니다.

TYPE_SCROLL_INSENSITIVE 는 ResultSet이 앞뒤로 이동(스크롤)될 수 있음을 의미합니다. 현재 위치를 기준으로 상대 위치로 이동하거나 절대 위치로 이동할 수도 있습니다.

이 유형의 ResultSet는 ResultSet가 열려 있는 동안 기본 데이터 소스에 대한 변경 사항에 영향을 받지 않습니다 . 즉, ResultSet의 항목이 다른 스레드나 프로세스에 의해 데이터베이스에서 변경되면 이미 열려 있는 데이터베이스에는 반영되지 않습니다.결과 집합이 유형의.

TYPE_SCROLL_SENSITIVE는 ResultSet이 앞뒤로 이동(스크롤)될 수 있음을 의미합니다. 현재 위치를 기준으로 상대 위치로 이동하거나 절대 위치로 이동할 수도 있습니다.

이 유형의 ResultSet는 ResultSet가 열려 있는 동안 기본 데이터 소스의 변경 사항에 민감합니다 . 즉, ResultSet의 항목이 다른 스레드나 프로세스에 의해 데이터베이스에서 변경되면 이미 열려 있는결과 집합이 유형의.

동시성

ResultSet의 동시성은 ResultSet이 업데이트될 수 있는지 아니면 읽기만 가능한지를 결정합니다.

일부 데이터베이스 및 JDBC 드라이버는 ResultSet 업데이트를 지원하지만 전부는 아닙니다. DatabaseMetaData.supportsResultSetConcurrency(int concurrency) 메서드는 주어진 동시성 모드가 지원되는지 여부에 따라 true 또는 false를 반환합니다 .

ResultSet은 다음 두 수준의 동시성 중 하나를 가질 수 있습니다.

  • 결과 집합.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY 는 ResultSet이 읽기만 가능함을 의미합니다.

CONCUR_UPDATABLE은 ResultSet을 읽고 수정할 수 있음을 의미합니다.

데이터베이스에서 데이터를 변경하는 예

이러한 매개변수를 사용하여 생성된 Statement 및 해당 ResultSet를 제어할 수 있습니다.

예를 들어 업데이트 가능한 ResultSet를 만들고 이를 사용하여 데이터베이스를 변경할 수 있습니다. 문을 만들 때 다음 조건을 준수하는 것이 중요합니다.

  • 하나의 테이블만 지정됨
  • 조인 또는 그룹 기준 절을 포함하지 않음
  • 쿼리 열은 기본 키를 포함해야 합니다.

위의 조건이 충족되면 업데이트된 ResultSet을 사용하여 데이터베이스의 테이블을 업데이트할 수 있습니다. Statement 객체를 생성할 때 다음 매개변수를 지정해야 합니다.

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

이러한 문을 실행한 결과는 업데이트 가능한 결과 집합입니다. 업데이트 방법은 ResultSet 커서를 업데이트하려는 행으로 이동한 다음 updateXXX () 메서드를 호출하는 것입니다 .

updateXXX 메서드는 getXXX() 메서드 와 유사하게 작동합니다 . updateXXX() 메소드에는 두 개의 매개변수가 있습니다. 첫 번째는 업데이트 중인 열의 번호이며 열 이름 또는 일련 번호일 수 있습니다. 두 번째는 업데이트해야 하는 데이터이며 이 데이터 유형은 XXX와 동일해야 합니다.

실제로 데이터베이스의 행을 업데이트하려면 ResultSet 커서가 변경된 행을 떠나기 전에 updateRow() 메서드 를 호출해야 합니다 . 그렇지 않으면 변경 사항이 데이터베이스에 적용되지 않습니다.

테이블에 새 행을 추가할 수도 있습니다.

먼저 커서를 빈 줄로 이동해야 합니다. 이렇게 하려면 moveToInsertRow() 메서드를 호출합니다 .

그런 다음 updateXXX() 메서드를 사용하여 이 행을 데이터로 채워야 합니다 .

그런 다음 inserterRow() 메서드를 호출하여 기본에 행을 추가 해야 합니다 .

마지막으로 moveToCurrentRow() 메서드를 호출하여 커서를 다시 반환해야 합니다 .

중요한! 모든 DBMS가 확장 문에 대해 이러한 옵션을 지원하는 것은 아닙니다. 문제가 있는 경우 특정 DBMS의 공식 문서를 참조하십시오.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION