본문 바로가기
Computer Science/Database

[Database] JDBC - Statement, ResultSet

by pilgyeong 2023. 1. 17.

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

 

Statement (Java Platform SE 8 )

Specifies that this Statement will be closed when all its dependent result sets are closed. If execution of the Statement does not produce any result sets, this method has no effect. Note: Multiple calls to closeOnCompletion do not toggle the effect on thi

docs.oracle.com

 

 


 

 

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

 

ResultSet (Java Platform SE 8 )

Retrieves the value of the designated column in the current row of this ResultSet object as a boolean in the Java programming language. If the designated column has a datatype of CHAR or VARCHAR and contains a "0" or has a datatype of BIT, TINYINT, SMALLIN

docs.oracle.com