이 자습서에서는 JDBC ResultSet을 사용하여 데이터를 검색하는 방법을 설명합니다. 또한 예제를 통해 ResultSetMetaData 및 DatabaseMetaData 인터페이스에 대해 알아봅니다.
JDBC 자습서 시리즈 의 JDBC DriverManager 자습서에서 JDBC 사용 방법을 배웠습니다. DriverManager 및 해당 메서드, Java 애플리케이션의 JDBC PreparedStatement.
이 자습서에서는 JDBC의 나머지 인터페이스에 대해 설명합니다. 이전 튜토리얼에서 Statement, PreparedStatement 및 CallableStatement 인터페이스에 대해 다루었습니다.
여기에서는 JDBC ResultSet, ResultSetMetaData 및 DatabaseMetaData 인터페이스와 해당 메소드 및 Java 프로그램에서 메소드를 사용하는 방법에 대해 알아봅니다.
JDBC ResultSet 인터페이스
ResultSet 인터페이스는 java.sql 패키지에 있습니다. Java 프로그램에서 SQL 문을 실행한 후 데이터베이스 테이블에서 반환되는 데이터를 저장하는 데 사용됩니다. ResultSet의 객체는 결과 데이터에 커서 위치를 유지합니다. 기본적으로 결과 데이터의 첫 번째 행 이전의 커서 위치입니다.
next() 메서드는 커서를 정방향으로 다음 위치로 이동하는 데 사용됩니다. 더 이상 레코드가 없으면 FALSE를 반환합니다. 명령문 객체를 사용하여 executeQuery() 메서드를 호출하여 데이터를 검색합니다. 이것은 Statement 또는 PreparedStatement 또는 CallableStatement 객체일 수 있습니다. 준비된 진술 및열 테이블의 스키마 이름을 반환합니다
ResultSetMetaData를 반환합니다. 예
package com.STH.JDBC; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class ResultSetMetaData_Example { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub String QUERY= " select * from employee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { Statement statemnt1 = conn.createStatement(); ResultSet rs1 =null; rs1 = statemnt1.executeQuery(QUERY); ResultSetMetaData rsmd = rs1.getMetaData(); System.out.println(" We are using ResultSetMetaData "); System.out.println("No: of Columns: "+ rsmd.getColumnCount()); System.out.println("ColumnName of Column 1: "+ rsmd.getColumnName(1)); System.out.println("Data Type of Column 2: " + rsmd.getColumnTypeName(2)); System.out.println("Table Name of the Column 1: " + rsmd.getTableName(1)); System.out.println("Schema Name of the Column 1: " + rsmd.getSchemaName(1)); } } }
OUTPUT:
설명:
위 프로그램에서, 우리는 ResultSetMetaData 인터페이스에서 getColumnCount(), getColumnName(), getColumnTypeName(), getTableName() 및 getSchemaName() 메소드를 구현했습니다.
DatabaseMetaData
DatabaseMetaData 인터페이스는 데이터베이스에 대한 정보를 다음과 같이 제공합니다. DatabaseName, 데이터베이스 버전 등.
DatabaseMetaData 인터페이스의 중요한 메소드:
메소드 이름 | 설명 |
---|---|
String getDriverName() | Java 프로그램에서 사용 중인 JDBC 드라이버의 이름을 반환합니다 |
String getDriverVersion() | JDBC 드라이버 버전 번호를 반환합니다. |
String getUserName() | 사용 중인 데이터베이스의 사용자 이름을 반환합니다. |
String getDatabaseProductName() | 반환합니다. 우리가 데이터베이스의 이름using |
String getDatabaseProductVersion() | 사용 중인 데이터베이스의 버전 번호를 반환합니다. |
ResultSet getSchemas() | 연결된 Database에서 사용할 수 있는 스키마의 이름을 반환합니다. |
String getStringFunctions() | 연결된 데이터베이스에서 사용할 수 있는 문자열 함수 목록을 반환합니다. |
String getTimeDateFunctions() | It 연결된 데이터베이스에서 사용할 수 있는 시간 및 날짜 함수 목록을 반환합니다. |
String getURL() | 데이터베이스에 대한 URL을 반환합니다 |
Boolean isReadOnly() | 데이터베이스가 읽기 전용 모드인지 여부를 반환합니다. |
Boolean supportsBatchUpdates() | 데이터베이스가 일괄 업데이트를 지원하는지 여부를 반환합니다. |
Boolean supportsSavepoints() | Database가 Savepoints를 지원하는지 여부를 반환합니다. |
Boolean supportsStatementPooling() | Database가 Statement Pooling을 지원하는지 여부를 반환합니다. |
Boolean supportsStoredProcedures() | 데이터베이스가 저장 프로시저를 지원하는지 여부를 반환합니다. |
Boolean supportsOuterJoins() | 데이터베이스가 Outer Join을 지원하는지 여부를 반환합니다. |
여기서 DatabaseMetaData 인터페이스의 몇 가지 중요한 메서드를 나열했습니다. 다음을 참조할 수 있습니다.DatabaseMetaData 인터페이스에서 사용할 수 있는 모든 메소드를 볼 수 있는 Oracle 의 공식 사이트입니다.
DatabaseMetaData 예:
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; public class DatabaseMetaData_Example { public static void main(String[] args) throws ClassNotFoundException, SQLException { // TODO Auto-generated method stub Class.forName("oracle.jdbc.driver.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE"); DatabaseMetaData dbmd = conn.getMetaData(); System.out.println("Using DatabaseMetaData"); System.out.println("Driver Name: " + dbmd.getDriverName()); System.out.println("Driver Version: "+ dbmd.getDriverVersion()); System.out.println("UserName of the Database: " + dbmd.getUserName()); System.out.println("Database Product Name:" + dbmd.getDatabaseProductName()); System.out.println("Database Product Version: " + dbmd.getDatabaseProductVersion()); System.out.println("List of String Functions in the Database: " + dbmd.getStringFunctions()); System.out.println("List of Time & Date functions in the Database: " + dbmd.getTimeDateFunctions()); System.out.println("URL of the Database: " + dbmd.getURL()); System.out.println("Database is read - only? " +dbmd.isReadOnly()); System.out.println("Support Batch Updates? " + dbmd.supportsBatchUpdates()); System.out.println("Support savepoints? " + dbmd.supportsSavepoints()); System.out.println("Support Statement Pooling? "+ dbmd.supportsStatementPooling()); System.out.println("Support Stored Procedures? " + dbmd.supportsStoredProcedures()); System.out.println("Support Outer Join? "+ dbmd.supportsOuterJoins()); } }
OUTPUT:
설명:
위 프로그램에서 getDriverName(), getDriverVersion()을 사용/구현했습니다. , getUserName(), getDatabaseProductName(), getDatabaseProductVersion(), getStringFunctions(), getTimeDateFunctions(), getURL(), isReadOnly(), supportsBatchUpdates(), supportsStatementPooling(), supportsSavepoints(), supportsStoredProcedures() 및 supportsOuterJoins() 메서드 DatabaseMetaData 인터페이스.
주의 사항:
- JDBC ResultSet 인터페이스는 데이터베이스의 데이터를 저장하고 Java 프로그램에서 사용하는 데 사용됩니다.
- 또한 ResultSet을 사용하여 updateXXX() 메서드를 사용하여 데이터를 업데이트할 수 있습니다.
- ResultSet 개체는 결과 데이터의 첫 번째 행 앞에 커서를 가리킵니다. next() 메서드를 사용하여 ResultSet 전체를 반복할 수 있습니다.
- ResultSet 개체에서 더 멀리 이동할 수 있는 ResultSet의 탐색 메서드가 있습니다.
- ResultMetaData는 ResultSet에 대한 자세한 정보를 다음과 같이 가져오는 데 사용됩니다. 컬럼 이름, 컬럼 수, 컬럼의 데이터 유형 등
- DatabaseMetData는 우리가 연결한 데이터베이스에 대한 정보를 얻기 위해 사용됩니다
자주 묻는 질문
Q #1) 무슨 소용이야?ResultSet?
답변: ResultSet은 DB에서 데이터를 저장하고 검색하는 데 사용됩니다. executeQuery() 메서드가 실행되면 ResultSet 객체를 반환합니다. 프로그램에서 해당 ResultSet 개체를 사용하여 논리를 수행할 수 있습니다.
Q #2) ResultSet이 비어 있는지 여부를 확인하는 방법은 무엇입니까?
답변: IsResultSet Empty를 확인하는 데 사용할 수 있는 length(), size()와 같은 미리 정의된 메서드가 없습니다. next() 메서드를 사용하여 반복할 수 있으며 True를 반환하면 비어 있지 않고 False를 반환하면 ResultSet이 비어 있음을 의미합니다.
Q #3) ResultSet이 가능합니까? null일 수 있습니까?
답변: 아니요, executeQuery() 메서드는 null일 수 없는 ResultSet 객체를 반환합니다.
Q #4) 업데이트 가능한 ResultSet이란 무엇입니까?
답변: 업데이트 가능한 ResultSet 개체는 열의 데이터를 업데이트하고 열에 데이터를 삽입하고 행을 삭제하는 데 사용됩니다. ResultSet을 업데이트 가능한 것으로 만들기 위해서는 스크롤 타입을 민감하거나 둔감하게 만들고 CONCUR 타입을 업데이트 가능하게 만들어야 합니다.
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE.
Q #5) 연결된 데이터베이스 이름은 어떻게 얻나요?
답변: DatabaseMetaData 객체의 getDatabaseProductName() 메서드를 사용할 수 있습니다.
결론
이 자습서에서는 ResultSet, ResultSetMetaData 및 DatabaseMetaData 인터페이스와 JDBC 프로그램에서 일반적으로 사용되는 중요한 메서드입니다. 우리는 또한 보았다ResultSet을 사용하여 DB의 데이터를 업데이트하는 방법. ResultSetMetadata에는 Column Name, Column 개수 등과 같은 ResultSet에 대한 정보가 포함됩니다.
DatabaseMetaData에는 데이터베이스 정보가 포함됩니다.
Statement 인터페이스
Statement statemnt1 = conn.createStatement(); ResultSet rs1 = statemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
PreparedStatement 인터페이스
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”);
우리는 X가 열의 데이터 유형인 결과를 반복하면서 열의 데이터를 가져오려면 getX() 메서드를 사용하십시오. 열 이름 또는 인덱스를 사용하여 getX() 메서드를 사용하여 값을 가져올 수 있습니다.
while(rs1.next()) { int empNum = rs1.getInt("empNum"); String lastName = rs1.getString("lastName"); String firstName = rs1.getString("firstName"); String email = rs1.getString("email"); String deptNum = rs1.getString("deptNum"); String salary = rs1.getString("salary"); System.out.println(empNum + "," +lastName+ "," +firstName+ "," +email +","+deptNum +"," +salary); }
getX() 메서드에서 열 이름 대신 열의 인덱스 번호를 언급할 수도 있습니다.
while(rs1.next()) { int empNum = rs1.getInt(1); String lastName = rs1.getString(2); String firstName = rs1.getString(3); String email = rs1.getString(4); String deptNum = rs1.getString(5); String salary = rs1.getString(6); System.out.println(empNum + "," +lastName+ "," +firstName+ "," +email +","+deptNum +"," +salary); }
ResultSet 유형
기본적으로 실행된 SQL 문의 출력으로 반환된 ResultSet의 데이터/값을 정방향으로 반복할 수 있습니다. Scrollable ResultSet을 사용하여 값을 다른 방향으로 반복할 수 있습니다. Statement, PreparedStatement, CallableStatement 객체를 생성하면서 ResultSet의 타입과 동시성을 지정할 수 있다.
ResultSet에는 3가지 타입이 있다.
- TYPE_FORWARD_ONLY: 커서가 처음부터 끝까지, 즉 정방향으로 이동하는 기본 옵션입니다.
- TYPE_SCROLL_INSENSITIVE: 이 유형에서는 커서가 앞뒤 방향으로 이동하도록 합니다. 저장된 데이터를 반복하는 동안 데이터를 변경하면 누군가 DB의 데이터를 변경해도 데이터 세트에서 업데이트되지 않습니다. 데이터 세트에는 SQL 쿼리가Data.
- TYPE_SCROLL_SENSITIVE: TYPE_SCROLL_INSENSITIVE와 유사하지만 SQL 쿼리가 데이터를 반환한 후 누군가 데이터를 업데이트하는 반면 이를 반복하면 데이터 세트에 대한 변경 사항이 반영된다는 차이점이 있습니다.
ResultSet 동시성
ResultSet에는 두 가지 동시성 모드가 있습니다.
- ResultSet.CONCUR_READ_ONLY: 기본 동시성 모드입니다. ResultSet의 데이터만 읽을 수 있습니다. 업데이트를 적용할 수 없습니다.
- ResultSet.CONCUR_UPDATABLE: ResultSet 개체의 데이터를 업데이트할 수 있습니다.
일부 데이터베이스는 모두에 대해 동시성 모드를 지원하지 않습니다. ResultSet 유형. 이 경우, supportsResultSetConcurrency() 메서드를 사용하여 원하는 유형과 동시성 모드를 지원하는지 확인해야 합니다.
ResultSet 인터페이스의 메서드
ResultSet 메서드에는 4가지 범주가 있습니다.
- 탐색 방법
- 게터 방법
- 세터 방법
- 기타 방법
먼저 탐색 방법에 대해 논의한 다음 더 진행하겠습니다.
#1) 탐색 방법
이 방법은 데이터 집합에서 커서를 이동하는 데 사용됩니다.
- Boolean absolute(int row): 파라미터에 언급된 특정 행으로 커서를 이동시키고 작업이 성공하면 true를 반환하고 그렇지 않으면 false를 반환하는 데 사용됩니다.
- 보이드afterLast(): ResultSet 커서를 마지막 행 뒤로 이동시킵니다.
- Void beforeFirst(): ResultSet 커서를 첫 번째 행 앞으로 이동하게 합니다.
- Boolean first(): ResultSet 커서를 첫 행으로 이동시킨다. 작업이 성공하면 True를 반환하고 그렇지 않으면 False를 반환합니다.
- Boolean last(): ResultSet 커서를 마지막 행으로 이동시킵니다. 작업이 성공하면 True를 반환하고 그렇지 않으면 False를 반환합니다.
- Boolean next(): ResultSet 커서를 다음 행으로 이동시킵니다. 레코드가 더 있으면 True, 없으면 False를 반환합니다.
- Boolean previous(): ResultSet 커서를 이전 행으로 이동시킵니다. 작업이 성공하면 True를 반환하고 그렇지 않으면 False를 반환합니다.
- Boolean relative(): 커서를 정방향 또는 역방향으로 지정된 행 수만큼 이동합니다.
- Int getRow(): ResultSet 객체가 현재 가리키는 현재 행 번호를 반환합니다.
- Void moveToCurrentRow(): 커서를 다시 현재 삽입 행인 경우 현재 행.
- Void moveToInsertRow(): 특정 행으로 커서를 이동하여 해당 행을 Database에 삽입합니다. 현재 커서 위치를 기억합니다. 따라서 moveToCurrentRow() 메서드를 사용하여 삽입 후 현재 행으로 커서를 이동할 수 있습니다.
이 자습서에서는모든 프로그램은 Java로 작성됩니다. Java 8 버전과 Oracle DB를 사용했습니다.
>>여기에서 Oracle 소프트웨어를 다운로드할 수 있습니다.
>>여기에서 Java 버전 8을 다운로드할 수 있습니다.
단계별 Java 설치 프로세스가 있습니다.
JDBC ResultSet 예제 프로그램:(탐색 방법 사용)
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class ResultSet_Example { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub //Select query String select_query = "select * from employee_details"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Connecting to Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:X E")) { //Creating DatabaseMetaData object DatabaseMetaData dbmd = conn.getMetaData(); //Checking whether the driver supports scroll sensitive type and concur updatable boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Creating prepared Statement PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(); //Moving the cursor to point first row rs.first(); System.out.println("FIRST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point last row rs.last(); System.out.println("LAST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point before first row rs.beforeFirst(); System.out.println("Cursor is pointing at before the first row. Use next() to move in forward direction"); //Moving the cursor to point first row using next() rs.next(); System.out.println("FIRST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point after last row rs.afterLast(); System.out.println("Cursor is pointing at after the last row. Use previous() to move in backward direction"); //Moving the cursor to point last row using previous() rs.previous(); System.out.println("LAST ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point third row rs.absolute(3); System.out.println("Cursor is pointing at 3rd row"); System.out.println("THIRD ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point previous row of third row rs.relative(-1); System.out.println("Cursor is pointing to the 1 row previous to the 3rd row"); System.out.println("Second ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point 4th row after the 2nd row rs.relative(4); System.out.println("Cursor is pointing to the 4th row after the 2nd row"); System.out.println("SIXTH ROW \n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point current row System.out.println(" Current Row = " + rs.getRow()); } } catch (SQLException e) { e.printStackTrace(); } } }
OUTPUT:
Employee_details 테이블의 데이터
설명:
위 프로그램에서 우리는 first(), last(), beforeFirst(), afterLast(), next( ), ResultSet의 이전(), 절대(), 상대() 및 getRow() 메소드. 이러한 메소드를 사용하기 위해 우리는 prepareStatement 메소드에서 ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE 값을 설정합니다.
다음으로 ResultSet의 Getter 메소드가 무엇인지 설명합니다:
#2) Getter Methods
ResultSet은 Database에서 테이블의 데이터를 저장했습니다. Getter 메서드는 ResultSet에서 테이블의 값을 가져오는 데 사용됩니다. 이를 위해 열 인덱스 값 또는 열 이름을 전달해야 합니다.
다음은 ResultSet의 getter 메서드입니다.
- int getInt (int ColumnIndex): 지정된 컬럼 Index의 값을 int 데이터 타입으로 가져오는데 사용된다.
- float getFloat(int ColumnIndex): 가져오는데 사용된다. float 데이터 유형으로 지정된 컬럼 Index의 값.
- java.sql.dategetDate(int ColumnIndex): 지정된 컬럼 Index의 값을 날짜 값으로 가져오는데 사용됩니다.
- int getInt(String ColumnName): getDate(String ColumnName): 지정된 열의 값을 int 데이터 형식으로 가져옵니다.
- float getFloat(String ColumnName): 지정된 열의 값을 float 데이터 형식으로 가져오는 데 사용됩니다.
- Java.sql.date getDate(String ColumnName): 지정된 컬럼의 값을 날짜 값으로 가져오기 위해 사용한다.
getter 메소드가 있다. ResultSet 인터페이스의 모든 기본 데이터 유형(Boolean, long, double) 및 문자열에 대해. 데이터베이스에서도 배열 및 이진 유형의 데이터를 얻을 수 있습니다. 이를 위한 메서드도 있습니다.
#3) Setter/Updater 메서드
ResultSet Updater 메서드를 사용하여 데이터베이스의 값을 업데이트할 수 있습니다. Getter 메소드와 유사하지만 데이터베이스에서 업데이트할 특정 열에 대한 값/데이터를 전달해야 합니다.
다음은 ResultSet의 업데이트 메소드입니다.
- void updateInt(int ColumnIndex, int Value): 지정된 열 Index의 값을 int 값으로 업데이트하는 데 사용됩니다.
- void updateFloat(int ColumnIndex, float f): 지정된 열 Index의 값을 float 값으로 업데이트하는 데 사용됩니다.
- void updateDate(int ColumnIndex, Date d): 지정된 컬럼 Index의 값을 갱신하는데 사용됩니다.날짜 값으로.
- void updateInt(String ColumnName, int Value): 지정된 열의 값을 주어진 int 값으로 업데이트하는 데 사용됩니다.
- void updateFloat(String ColumnName, float f): 지정된 열의 값을 주어진 float 값으로 업데이트하는 데 사용됩니다.
- Java.sql.date getDate(String ColumnName): 지정된 날짜 값으로 지정된 열의 값을 업데이트하는 데 사용됩니다.
모든 기본 데이터 유형(Boolean, long, double) 및 String에 대한 Updater 메소드가 있습니다. ResultSet 인터페이스에서도 마찬가지입니다.
Updater 메소드는 ResultSet 객체의 데이터만 업데이트합니다. insertRow 또는 updateRow 메소드를 호출한 후 DB에서 값이 업데이트됩니다.
행 업데이트:
updateX() 메소드를 호출하여 행의 데이터를 업데이트할 수 있습니다. , 업데이트할 열 이름 또는 인덱스 및 값을 전달합니다. updateX 메서드에서 X 대신 모든 데이터 유형을 사용할 수 있습니다. 지금까지 ResultSet 개체의 데이터를 업데이트했습니다. DB의 데이터를 업데이트하려면 updateRow() 메서드를 호출해야 합니다.
Inserting a Row:
moveToInsertRow()를 사용하여 커서를 이동해야 합니다. 새 행을 삽입합니다. 탐색 방법 섹션에서 이미 다루었습니다. 다음으로 updateX() 메서드를 호출하여 행에 데이터를 추가해야 합니다. 모든 열에 데이터를 제공해야 합니다. 그렇지 않으면 해당 특정의 기본값을 사용합니다.column.
데이터를 업데이트한 후에는 insertRow() 메서드를 호출해야 합니다. 그런 다음 moveToCurrentRow() 메서드를 사용하여 커서 위치를 새 행 삽입을 시작하기 전의 행으로 되돌립니다.
ResultSet 예:
package com.STH.JDBC; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class ResultSet_Example1 { public static void main(String[] args) throws ClassNotFoundException { // TODO Auto-generated method stub String select_query = "select empnum,lastName,firstName from employee_details"; String insert_query = "insert into employee_details values(?,?,?,?,?,?)"; Class.forName("oracle.jdbc.driver.OracleDriver"); //Connecting to Oracle DB try(Connection conn = DriverManager.getConnection("jdbc:oracle:thin:system/pass123@localhost:1521:XE")) { //Creating DatabaseMetaData object DatabaseMetaData dbmd = conn.getMetaData(); //Checking whether the driver supports scroll insensitive type and concur updatable boolean isSupportResultSetType = dbmd.supportsResultSetConcurrency(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); if(isSupportResultSetType == true) { // Creating prepared Statement PreparedStatement pstatemnt1 = conn.prepareStatement(select_query,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs = pstatemnt1.executeQuery(select_query); //Moving the cursor to point last row of the table rs.last(); System.out.println("LAST ROW: Before inserting new Employee"); System.out.println("LAST ROW: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); // Setting the values to insert in the EMPLOYEE_DETAILS Table //Moving the cursor to point insert a row to table rs.moveToInsertRow(); //Update EMPNUM value rs.updateInt(1, 1017); //Update LAST NAME value rs.updateString(2, "Bond"); //Update FIRST NAME value rs.updateString(3, "James"); //Insert a new row rs.insertRow(); //Moving the cursor to point 5th row rs.absolute(5); System.out.println("Befor Updating EMPNUM of the 5th ROW"); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); System.out.println(" Updating EMP id of the 5th EMPLOYEE"); //Updating EMPNUM of 5th row rs.updateInt(1,3005); rs.updateRow(); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); //Moving the cursor to point last row rs.last(); System.out.println("LAST ROW: EMPNUM = " + rs.getInt(1)); System.out.println("\n EMP NUM = " + rs.getInt("empNum") + "\n LAST NAME = "+ rs.getString(2)+"\n FIRST NAME = " + rs.getString(3)); } } catch (SQLException e) { e.printStackTrace(); } } }
OUTPUT:
설명:
위 프로그램에서 우리가 수행한 작업은 먼저 SELECT 쿼리를 사용하여 ResultSet 개체의 Employee_details 테이블 데이터. 그런 다음 ResultSet의 last() 메서드를 사용하여 employee_details 테이블의 마지막 행의 데이터를 표시했습니다. moveToInsertRow() 메서드는 커서가 현재 행을 가리키도록 합니다. 이제 현재 행이 마지막 행입니다.
updateXXX() 메서드는 값을 행으로 업데이트하는 데 사용되며 insertRow() 메서드는 새 행. absolute() 메서드를 사용하여 커서가 5번째 행을 가리키도록 했습니다. UpdateInt() 메서드는 테이블에서 5번째 직원의 새 ID로 EMNUM을 업데이트하는 데 사용되었습니다. 이후 EMNUM의 갱신 여부를 확인하기 위해 데이터를 출력하였다.
last()를 이용하여 커서가 테이블의 마지막 행을 가리키도록 하여 출력하였다. 위 로직을 수행하기 위해서는 prepareStatement 메소드에 ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE 값을 설정해야 합니다.
#4) 기타 메소드
- void close(): ResultSet 인스턴스를 닫고ResultSet 인스턴스와 관련된 리소스.
- ResultSetMetaData getMetaData(): ResultSetMetaData 인스턴스를 반환합니다. 쿼리 출력의 열 유형 및 속성에 대한 정보가 있습니다. 다음 섹션에서 ResultSetMetaData에 대해 자세히 알아볼 것입니다.
ResultSetMetaData
메타데이터란?
메타데이터 데이터에 대한 데이터를 의미합니다. 이 인터페이스를 사용하면 ResultSet에 대한 자세한 정보를 얻을 수 있습니다. java.sql 패키지에서 사용할 수 있습니다. 모든 ResultSet 개체는 하나의 ResultSetMetaData 개체와 연결됩니다.
이 개체에는 열의 데이터 유형, 열 이름, 열 수, 테이블 이름, 스키마 이름 등과 같은 열 속성의 세부 정보가 있습니다. ResultSet의 getMetaData() 메소드를 사용하여 ResultSetMetaData 객체를 얻을 수 있습니다.
ResultSetMetaData의 구문:
PreparedStatement pstatemnt1 = conn.prepareStatement(insert_query); ResultSet rs1 = pstatemnt1.executeQuery(“Select * from EMPLOYEE_DETAILS”); ResultSetMetaData rsmd = rs.getMetaData();
ResultSetMetaData 인터페이스의 중요한 메소드:
메서드 이름 | 설명 |
---|---|
String getColumnName(int column) | 특정 열의 열 이름을 반환합니다. |
String getColumnTypeName(int column) | 다음의 데이터 유형을 반환합니다. 매개 변수로 전달한 특정 열 |
String getTableName(int column) | 열의 테이블 이름을 반환합니다. |
String getSchemaName(int column) | It |