본문 바로가기
Spring

JDBC 프로그래밍 객체 정리

by 코리늬 2018. 7. 31.

1. DriverManager 클래스

- DriverManager 클래스는 데이터 원본에 JDBC 드라이버를 통하여 커넥션을 만드는 역할을 한다.

  DriverManager는 Class.forName() 메소드를 통해서 생성되는데, 이 메소드는 인터페이스 드라이버를 구현하는 작업이다.


- Class.forName("com.mysql.jdbc.Driver") 처럼 특정 클래스를 로딩하면 자동으로 객체가 생성되고 DriverManager에 등록된다.

  드라이버 클래스를 찾지 못할 경우 forName() 메소드는 ClassNotFoundException 예외를 발생시키므로 반드시 예외 처리를 해    야한다.


- 일반적으로 드라이버 클래스들은 로드될 때 자신의 인스턴스를 생성하고, 자동적으로 DriverManager 클래스 메소드를 호출하여 그 인스턴스를 등록한다.

  DriverManger 클래스의 모든 메소드는 static 이기 때문에 반드시 객체를 생성시킬 필요가 없다.

  DriverManager 클래스는 Connection 인터페이스의 구현 객체를 생성하는데 getConnection() 메소드를 사용한다. 


2. Connection 인터페이스

- 특정 데이터 원본에 대한 커넥션은 Connection 인터페이스가 구현된 클래스의 객체로 표현된다. 어떤 SQL 문장을 실행시키기

     전에 우선 Connection 객체가 있어야 한다. Connection 객체는 특정 데이터 원본과 연결된 커넥션을 나타내고, 특정 SQL 문장을

 정의하고 실행시킬 수 있는 statement 객체를 생성할 때도 Connection 객체를 사용한다.


- 또한 Connection 객체는 데이터베이스에 대한 데이터인 메타데이터에 관한 정보를 데이터 원본에 질의하는데 사용한다. 이때

 사용 가능한 테이블의 이름, 특정 테이블의 열의 정보 등이 포함된다.


3. Statement 인터페이스

- Statement 인터페이스는 Connection 객체에 의해 프로그램에 리턴되는 객체에 의해 구현되는 일종의 메소드 집합을 정의한다.

 Statement 객체는 Statement 인터페이스를 구현한 객체로, 항상 인수가 없는 Connection 클래스의 createStatement() 메소드를

 호출함으로써 얻어진다.

try {

Statement stmt = connection.createStatement();

}catch(SQLException sqle){

System.err.println(sqle);

}


- Statement 객체를 생성하면 Statement 객체의 executeQuery() 메소드를 호출하여 SQL 질의를 실행시킬 수 있다. 메소드의 인수

로는 SQL 질의 문장을 담은 String 객체를 전달한다. Statement 객체는 단순한 질의문을 사용할 경우 좋다.


4. PreparedStatement 인터페이스


- PreparedStatement 인터페이스는 Connection 객체의 prepareStatement() 메소드를 사용해서 객체를 생성한다. 

PreparedStatement 객체는 SQL 문장이 미리 컴파일되고, 실행시간동안 인수 값을 위한 공간을 확보할 수 있다는 점에서 

Statement 객체와 다르다.


- PreparedStatement 객체는 동일한 질의문을 특정 값만 바꾸어서 여러 번 실행해야 할 때, 많은 데이터를 다루기 때문에 질의문

을 정리해야 할 필요가 있을 때, 인수가 많아서 질의문을 정리해야 될 필요가 있을 때 사용하면 유용하다.


- 또한 Statement 객체의 SQL은 실행될 때 매번 서버에서 분석되어야 하는 반면, PreparedStatement 객체는 한 번 분석되면 재사용이 용이하다는 장점이 있다.


- PreparedStatement 인터페이스는 각각 인수에 대해 위치홀더(placeholder)를 사용하여 SQL 문장을 정의할 수 있게 해준다.

위치홀더는 물음표 (?)로 표현된다. 위치홀더는 SQL문장에 나타나는 토큰(token)인데, 이것은 SQL 문장이 실행되기 전에 실제 값

으로 대체된다. 이러한 방법을 이용하면 특정 값으로 문자열을 연결하는 방법보다 훨씬 쉽게 SQL문장을 만들 수 있다.


try{

String sql = "insert into member1 value(?.?)";

pstmt = conn.prepareStatement(sql);

pstmt.setString(1, id);

pstmt.setString(2, passwd);

}catch(SQLException sqle){

System.err.println(sqle);

}


- PreparedStatement 객체는 각각의 SQL 타입을 처리할 수 있는 setXxxx() 메소드를 제공한다. 여기서 Xxx는 해당 테이블의 

데이터 타입을 나타낸다. 문자열이면 setString(), int면 setInt()가 된다.


- setXxx(num, var) 메소드는 두 개의 매개 변수를 가지고 있다. num은 파라미터 인덱스로서 위치홀더와 대응된다.

첫 번째 위치홀더에 대응되면 1이고 다음 위치홀더와 대응부터 1씩 값을 증가시키면 된다. var는 해당 필드에 저장할 데이터

값이다.


- PreparedStatement 객체가 제공하는 setXxx(num, var) 메소드


setString(int parameterIndex, String x)

setInt(int parameterIndex, int x)

setLong(int parameterIndex, long x)

setObject(int parameterIndex, Object x)

setDate(int parameterIndex, Date x)

setTimestamp(int parameterIndex, Timestamp x)

setDouble(int parameterIndex, double x)

setFloat(int parameterIndex, float x)


- PreparedStatement 객체가 Statement 객체보다 좋다


장점 

> 동일한 질의문을 특정 값만 바꾸어서 여러 번 실행해야 할 때, 많은 데이터를 다루기 때문에 질의문을 정리해야 할 필

> 요가 있을 때, 인수가 많아서 질의문을 정리해야 할 필요가 있을 때 좋다.

> 미리 컴파일되기 때문에 쿼리의 수행 속도가 빠르다.

Statement 객체는 작은 따옴표를 큰 따옴표로 표시해야하지만 PreparedStatement 는 쿼리 실행시 자동 처리해준다.


5. CallableStatement 인터페이스


- CallableStatement 인터페이스는 Connection 객체의 prepareCall() 메소드를 사용해서 객체를 생성한다.

CallableStatement  객체는 주로 스토어드 프로시저를 사용하기 위해 사용된다.

스토어드 프로시저란 해당 데이터베이스 SQL문을 저장한 것을 말한다. 미리 저장된 쿼리를 사용하기 때문에 수행 속도가 빠르다.


try {

CallableStatement cstmt = connection.prepareCall();

}catch(SQLException sql){

System.err.println(sql);

}


- CallableStatement는 데이터베이스에 저장된 스토어드 프로시저를 단지 호출하는 것만으로 처리가 가능하다.

conn.prepareCall("{call query1}")


6. ResultSet 인터페이스 


- SQL 문 중에서 Select 문을 사용할 경우 성공 시 ResultSet을 반환한다. ResultSet 은 SQL 질의에 의해 생성된 테이블을

담고있다. 또한 ResultSet 객체는 커서를 가진다.


- 커서는 초기에 첫 번째 행의 직전을 가리키도록 되어 있는데, ResultSet 객체의 next() 메소드를 사용하면 다음 위치로 커서를 

옮길 수 있다.


first() : 커서를 첫 번째 행으로 옮긴다.

last() : 커서를 마지막 행을 옮긴다.

beforeFirst() : 커서를 첫번째 행 이전으로 옮긴다.

afterLast() : 커서를 마지막 행 다음으로 옮긴다.

next() : 커서를 다음 행으로 옮긴다.

previous() : 커서를 이전 행으로 옮긴다.


- ResultSet에서 행을 처리하는데 반복문을 사용하며 next() 메소드가 유효한 행이 있으면 true, 없으면 false를 리턴하는 것을

사용해 while문으로 제어할 수 있다.


while(rs.next()){

... 

}


- ResultSet 객체에서 현재 행에서 필드명 혹은 레코드셋에서의 위치를 통해서 어떤 필드의 값을 가져올 수 있는데, 이때

getXxxx() 메소드를 제공한다.

댓글