1. Statement
- Statement를 이용해서 실제 수행할 쿼리를 작성할 수 있다. 수행 결과를 ResultSet 객체로 받아오고, 정적 쿼리를 작성할 수 있다.
Statement 주요 메소드
ResultSet executeQuery(string sql)
- SQL을 수행하고 ResultSet을 받아온다. 결과를 받아오기 때문에 주로 SELECT문 작성 시 사용
int executeUpdate(string sql)
- INSERT, UPDATE, DELETE 또는 DDL 등 결과를 받아오지 않는 SQL 작성 시 사용
- return 값은 변경사항이 적용된 row의 수이다. 결과가 없다면, 0을 리턴
boolean execute(string sql)
- 여러 개의 결과를 얻어오는 SQL문 작성 시 사용
- 첫 번째 결과가 ResultSet이면 true : getResultSet() 함수를 호출해서 결과를 얻음
- 첫 번째 결과가 ResultSet이 아니면(또는 결과가 없거나 결과 업데이트 count인 경우) false : getUpdateCount() 함수를 호출해서 결과를 얻음 (참고: '-1'은 현재 값이 없거나 ResultSet인 경우)
- 첫 번째 결과를 후속 함수로 얻었으면, 그 다음 결과는 getMoreResults() 함수로 execute() 리턴값과 같은 방식으로 해석
- 더 이상 가져올 결과가 없다는 것은 다음과 같이 확인
((stmt.getMoreResults() == false) && (stmt.getUpdateCount() == -1))
int[] executeBatch()
- addBatch(string sql)로 쌓인 SQL을 배치로 수행하며, 모든 커맨드가 성공하면 update된 count를 배열로 리턴함
void addBatch(string sql)
- 현재 Statement 객체에 배치로 실행할 SQL 명령어를 추가한다. 단, 추가만 하지 실행하지 않음
위 함수들 말고도 많은 기능을 지원한다. Statement 클래스에는 실제 DB와의 동작을 수행할 수 있는 함수들이 제공되므로 Statement 클래서의 Javadoc을 정독해볼 것. Java에서 DB를 이용하는 거의 모든 기능들은 이 기능에 기반하여 만들어진다.
https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html
2. ResultSet
- ResultSet은 쿼리 결과를 cursor를 이용해서 다룰 수 있도록 하는 객체이다.
- ResultSet은 쿼리의 결과를 테이블 형태로 상정하고, 특정 row을 가리키고 있는 cursor를 가진다. 쿼리의 결과가 단건일수도, 여러 건일수도 있다. 결과 전체를 리스트나 배열에 주면 되지 않냐고 생각할 수 있지만, 쿼리 결과가 많다면 그 결과를 한 번에 어플리케이션의 메모리에 모두 로드할 수 없을 수도 있기 때문에 cursor를 사용한다.
2.1 ResultSet의 Cursor 사용
- cursor는 방향성이 존재한다. 시작은 첫 번째 row의 이전을 가리키고 있다. 커서가 가리키는 내용은 업데이트가 불가능하다.
- 단, 설정으로 방향을 반대로 바꿀 수도 있고, 내용이 업데이트 가능하게 만들 수도 있다.
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
2.2 ResultSet 주요 메소드
public boolean next()
- cursor를 현재보다 한 row 다음으로 보냄
public boolean previous()
- cursor를 현재보다 한 row 이전으로 보냄
public boolean first()
- result set의 첫 번째로 cursor를 이동
public boolean last()
- result set의 마지막으로 cursor를 이동
public boolean absolute(int row)
- result set의 특정 row로 cursor를 이동
public boolean relative(int row)
- 현재 cursor 위치로부터 정해진 순번의 row로 cursor를 이동. (+/- 모두 가능)
public int getInt(int columnIndex)
- 현재 cursor가 가리키고 있는 데이터 행의 주어진 column index에 해당하는 컬럼의 값을 int로 가져옴
public int getInt(string columnName)
- 현재 cursor가 가리키고 있는 데이터 행의 주어진 column 이름에 해당하는 컬럼의 값을 Int로 가져옴
public int getString(int columnIndex)
- 현재 cursor가 가리키고 있는 데이터 행의 주어진 column index에 해당하는 컬럼의 값을 String으로 가져옴
public int getString(string columnName)
- 현재 cursor가 가리키고 있는 데이터 행의 주어진 column 이름에 해당하는 컬럼의 값을 String으로 가져옴
public Blob getBlob(int columnIndex)
- BLOB은 binary(이진수) 형태의 대형 객체를 저장할 때 사용함 (이미지, 동영상, 파일 등)
- 현재 cursor가 가리키고 있는 데이터 행의 주어진 column index에 해당하는 컬럼의 값을 Blob으로 가져옴
public Clob getClob(int columnIndex)
- CLOB은 character(문자) 형태의 대형 객체를 저장할 때 사용함 (대용량 텍스트, 문서파일, 대용량 파일)
- 현재 cursor가 가리키고 있는 데이터 행의 주어진 column index에 해당하는 컬럼의 값을 Clob으로 가져옴
public Clob getClob(string columnName)
- 현재 cursor가 가리키고 있는 데이터 행의 주어진 column name에 해당하는 컬럼의 값을 Clob으로 가져옴
참고. https://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html
'Computer Science > Database' 카테고리의 다른 글
[Database] ORM(Object Relation Mapping) (0) | 2023.01.24 |
---|---|
[Database] JDBC - Prepared Statement, CallableStatement (0) | 2023.01.19 |
[Database] JDBC - DriverManager, Connection (MySQL 접속) (0) | 2023.01.13 |
[JDBC] JDBC (Java Database Connectivity) (0) | 2023.01.12 |
[데이터베이스 핵심 요약] 10. 인덱스(index) (0) | 2022.11.13 |