현재 라인 관리

우리는 첫 번째 프로그램을 작성했고 완벽하게 작동했습니다. 우리는 쿼리를 작성하고 실행했으며 결과적으로 executeQuery() 메서드가 객체를 반환했습니다.결과 집합쿼리의 모든 결과를 포함하는 입니다. 이제 우리는 이러한 결과를 얻는 방법을 알아 내려고 노력할 것입니다.

쿼리 결과에는 다양한 유형의 수천 개의 행과 수백 개의 열이 포함될 수 있으므로 이는 생각만큼 간단한 작업이 아닙니다. 예를 들어 사진을 데이터베이스에 저장한 다음 사진을 바이트 집합으로 가져오거나 다운로드할 InputStream 으로 가져올 수 있습니다.

그러나 " 현재 결과 라인 " 이라는 개념으로 가장 간단한 것부터 시작하겠습니다 . 결과에는 일반적으로 많은 행이 있으므로 객체결과 집합내부에 현재 줄에 대한 포인터가 있습니다. 그리고 next() 메서드를 사용하여 읽을 수 있도록 순차적으로 줄을 바꿉니다 .

이 접근 방식은 주로 최적화를 위해 수행됩니다. JDBC 드라이버는 문자열을 순차적으로 읽을 때까지 데이터베이스에서 문자열을 로드하지 않을 수 있습니다. FileInputStream 도 처음부터 끝까지 순차적으로 읽습니다. 따라서 이 접근 방식은 사용자에게 친숙하고 이해하기 쉬울 것입니다.

그러나 정말로 필요한 경우 RandomAccessFile 클래스를 사용하여 어디에서나 파일을 읽을 수 있습니다 .

ResultSet 클래스는 또한 비슷한 것을 허용하고 결과를 따라 현재 행을 어디로든 이동할 수 있도록 합니다. 이를 위해 다음과 같은 방법이 있습니다.

방법 설명
1 다음() 다음 줄로 전환
2 이전의() 이전 줄로 전환
isFirst() 현재 줄 먼저?
4 isBeforeFirst() 우리는 첫 번째 줄 앞에 있습니까?
5 isLast() 현재 줄이 마지막 줄입니까?
6 isAfterLast() 마감일이 지났습니까?
7 절대(정수 n) N 번째 라인을 현재로 만듭니다.
8 상대(정수 n) 현재 행을 N 위치 앞으로 이동합니다. N은 <0일 수 있습니다.
9 getRow() 줄 번호를 반환합니다.

방법은 매우 간단하지만 두 가지 설명이 필요합니다. 결과는 그대로 양쪽에 빈 줄로 표시됩니다. 따라서 처음에는 현재 행이 결과의 첫 번째 행 앞에 있습니다. 그리고 첫 번째 행을 가져오려면 next() 메서드를 적어도 한 번 호출해야 합니다 .

마지막 행에서 next() 메서드를 호출 하면 마지막 행 다음 행으로 이동합니다 . 데이터를 읽을 수는 없지만 오류는 발생하지 않습니다. 여기서 isAfterLast() 메서드는 결과로 true를 선언합니다.

예:

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");

System.out.println( results.getRow() );        	// 0
System.out.println( results.isBeforeFirst() );  // true
System.out.println( results.isFirst() );          	// false

results.next();

System.out.println( results.getRow() );        	// 1
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// true

results.next();

System.out.println( results.getRow() );        	// 2
System.out.println( results.isBeforeFirst() );  // false
System.out.println( results.isFirst() );          	// false

현재 행에서 데이터 가져오기

현재 라인을 완벽하게 관리하는 방법을 배웠습니다. 이제 데이터를 얻는 방법을 알아 보겠습니다. 이를 위해 객체결과 집합하나의 템플릿으로 모두 설명할 수 있는 특수 메서드가 있습니다.

getType(numberColumns)

그러나 열에 이름이 있으면 열 이름으로도 얻을 수 있습니다.

getType(nameColumns)

예:

while (results.next()) {
        	Integer id = results.getInt(“id”);
        	String name = results.getString(“name”);
        	System.out.println(results.getRow() + ". " + id + "\t"+ name);
}

아래에서 SQL 데이터 유형과 ResultSet 메서드를 연결하는 데 도움이 되는 표를 제공합니다.

SQL 데이터 유형 getXXX() 메서드
getString()
VARCHAR getString()
지능 getInt()
뜨다 getDouble()
클롭 getClob()
얼룩 getBlob()
날짜 getDate()
시간 getTime()
타임스탬프 getTimestamp()

요점은 당신이 이해한다고 생각합니다.

ResultSet에 대한 다른 데이터 얻기

열 번호와 이름으로 현재 줄에서 데이터를 읽는 방법을 알아냈습니다. 그런데 열 이름을 번호로 어떻게 알 수 있습니까? 아니면 결과의 열 수입니까?

한편으로 요청서를 작성하면 이 모든 것을 알아야 할 것 같습니다. 반면에 쿼리 결과를 화면에 표시하는 프로그램을 작성할 수 있습니다. 쿼리가 전달되고 SQL 서버가 반환한 모든 것을 화면(콘솔, 웹 페이지)에 표시하기만 하면 됩니다. 우리에게.

JDBC에는 이를 위한 특수 객체인 ResultSetMetaData 인터페이스가 있습니다 . 이 유형의 개체를 얻는 것은 매우 간단합니다.

Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
ResultSetMetaData resultSetMetaData = results.getMetaData();

ResultSetMetaData 인터페이스 에는 몇 가지 매우 흥미로운 메서드가 있습니다. 다음은 가장 인기 있는 것입니다.

1 getColumnCount() 결과 열의 수를 반환합니다.
2 getColumnName(int 열) 열 이름을 반환
getColumnLabel(int 열) 열에 대한 설명을 반환합니다.
4 getColumnType() 반환 열 유형: 숫자(특수 코드)
5 getColumnTypeName() 반환 열 유형: 문자열
6 getColumnClassName() 열 유형에 대한 Java 클래스 이름을 반환합니다.
7 getTableName() 테이블 이름을 반환
8 getCatalogName() 열의 디렉토리 이름을 반환합니다.
9 getSchemaName() 데이터베이스의 스키마 이름을 반환합니다.
10 isAutoIncrement(int 열) 열이 AUTO INCREMENT를 지원합니까?
열하나 isNullable() 열에 NULL이 포함될 수 있습니까?

이를 사용하여 테이블에 대해 조금 알아봅시다.

ResultSetMetaData metaData = results.getMetaData();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
{
        	String name = metaData.getColumnName(column);
        	String className = metaData.getColumnClassName(column);
        	String typeName = metaData.getColumnTypeName(column);
        	int type = metaData.getColumnType(column);

        	System.out.println(name + "\t" + className + "\t" + typeName + "\t" + type);
}

중요한! 열 번호는 1부터 지정됩니다. 그런데 행도 마찬가지입니다. 얼마나 이례적인 일입니까?

그리고 이것은 프로그램을 실행한 후 얻은 결과입니다.

"C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe...
ID java.lang.Integer 지능 4
이름 java.lang.string VARCHAR 12
수준 java.lang.Integer 지능 4
만든 날짜 java.sql.날짜 날짜 91
종료 코드 0으로 프로세스 완료