결과 집합 사용자 정의
최신 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의 공식 문서를 참조하십시오.
GO TO FULL VERSION