프로그래밍/JSP

Statement와 PreparedStatement, ResultSet, ResultSetMetaData

주롱 2012. 9. 3. 13:52

1. Statement

- Statement는 실제 데이터베이스에 쿼리를 보내기 위해 필요한 객체.

- 삽입, 수정, 삭제, 검색을 처리하는 DML문을 사용할 때 이 인터페이스를 사용.

- 이 객체는 Connection 객체의 연결정보를 사용하므로 Connection 객체가 먼저 존재해야함.

- Statement 객체에서 자주 사용되는 객체는 아래와 같다.

- excuteQuery(String sql): SELECT 문을 실행할 때 사용(ResultSet 객체 반환)

- excuteUpdate(String sql): 삽입, 수정, 삭제와 관련된 SQL문 실행에 사용(int형으로 적용된 행수를 반환)

- close(): Statement 객체를 반환할 때 사용


2. PreparedStatement

- String sql = "INSERT INTO student (num,name) VALUES (?,'홍길동')";

- 위와 같이 미리 사용할 SQL Query를 작성함. VALUES에 첫번째 인자를 바인딩 변수로 잡음. 즉 첫번째 인자는 유동적인 값으로 잡고, 뒤 변수 '홍길동'은 문자열로 INSERT 함

- 바인딩 변수인 ?에 값을 집어 넣는 방법은 다음과 같다.

- stmt.setInt(1,i); //첫번째 인자(1)에 i 값을 삽입(setInt 이므로 정수형)

- 문자열을 넘겨주고 싶으면 setString() 메소드를 사용하면 됨


3. ResultSet

- Statement, PreparedStatement에서 SELECT 문을 통해 얻어온 레코드 값들을 테이블 형태로 갖는 객체.

- ResultSet에서 자주 사용하는 메소드는 아래와 같다.

- close(): ResultSet 객체를 반환.

- getXXX(int ColumnIndex): 레코드 값을 XXX타입으로 가져옴

- getXXX(String ColumnName): 레코드 값을 지정한 XXX 타입을 가져옴(Column 명 지정)

- next(): 다음행으로 커서를 이동

- 예제 코드: String sql = "SELECT * FROM student";

PreapredStatement pstmt = conn.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();

while(rs.next()){

out.println("<h3>"+rs.getInt(1)+","+rs.getString(2)+"</h3>");

- 위 예제를 보면 라인5에서 rs.hetInt(1)로 첫번째 컬럼의 Int형 데이터를 가져오고, rs.getString(2)에서 두번째 컬럼의 문자열을 가져옴

- 또한 conn.prepareStatement(sql) 명령과 ResultSet으로 미리 student 테이블의 데이터를 모두 가져온 후 getInt()를 통해 데이터를 출력하는것을 알 수 있다.

- 여기서 궁금한것은 getInt와 getString에서 동적쿼리가 생성될 경우 SQL Injection 위험이 존재하는가? 이다.

- 일단은 preparedStatement를 통해 데이터를 가져온 후 작업을 하기 때문에 불가능하다고 판단할 수 있다.