[JSP] JDBC 프로그래밍에 사용되는 객체

2019. 7. 17. 17:29 Java 관련/JSP,Servlet

JDBC 프로그래밍에 사용되는 객체




1. DriverManager 클래스


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

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



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

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


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

DriverManager 클래스의 모든 메소드는 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 객체를 사용하는 것보다 좋다.


- PreparedStatement 객체의 장점


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


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


> Statement 객체는 쿼리 실행 시 작은 따옴표(')가 들어 있으면 작은 따옴표를 두 개 ('')로 표시해야 한다. 그러나 PreparedStatement 객체는 작은 따옴표의 문제를 쿼리 실행 시 자동으로 처리하므로 신경 쓸 필요가 없다.




5. CallableStatement 인터페이스


- CallableStatement 인터페이스는 Connection 객체의 prepareCall() 메소드를 사용해서 객체를 생성한다. CallableStatement 객체는 주로 스토어드 프로시저(Stored Procedure)를 사용하기 위해 사용된다.


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


try{


CallableStatement cstmt = connection.prepareCall();


}catch(SQLException sqle){

System.err.println(sqle);

}


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


conn.prepareCall("{call query1}")


 종류

설명 

{call procedure_name[(?,?,..)]} 

단순히 호출만 한다.

{? = call procedure_name[(?,?,..)]} 

호출을 한 후 결과를 가지고 온다. 

{call procedure_name} 

파라미터가 없는 스토어드 프로시저 





6. ResultSet 인터페이스


- SQL 문 중에서 Select 문을 사용한 질의의 경우 성공 시 결과물로 ResultSet을 반환한다. ResultSet은 SQL 질의에 의해 생성된 테이블을 담고 있다. 또한 ResultSet 객체는 '커서(cursor)' 라고 불리는 것을 가지고 있는데, 그것으로 ResultSet에서 특정 행에 대한 참조를 조작할 수 있다.


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


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

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

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

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

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

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


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


while(rs.next(){

...

}


- ResultSet 객체에서 현재 행에서 필드명 혹은 레코드셋에서의 위치를 통해서 어떤 필드의 값을 가져올 수 있는데, 이때 getXxx() 메소드를 제공한다.


- 해당 필드의 데이터 타입이 문자열이면 getString()이 되고, 해당 필드의 데이터 타입이 int이면 getInt()가 된다.


getString()    getDate()    getBytes()    getDoutble()    

getInt()    getTimestamp()    getObject()    getLong()



출처: https://hyeonstorage.tistory.com/111?category=554979 [개발이 하고 싶어요]