#005. Statement / PreparedStatement / ResultSet 실습 해보기...
1. Statement, ResultSet 테스트를 위해 jdbc 패키지에 StateDemo 클래스를 만들어 아래의 코드를 작성해 보자.
코드 | package jdbc; import java.sql.*; public class StateDemo { public static void main(String[] args) throws Exception { StringBuilder sb = new StringBuilder(); sb.append (" select no, name, email, age, sex "); sb.append (" from emp.person ");
Class.forName("oracle.jdbc.OracleDriver"); String url = "jdbc:oracle:thin:@127.0.0.1:1522:xe"; String user = "emp"; String pass = "pass"; Connection conn = DriverManager.getConnection(url, user, pass); Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sb.toString()); while ( rs.next() ) { int 번호 = rs.getInt("no"); String 이름 = rs.getString(2); int 나이 = rs.getInt("age"); String 이멜 = rs.getString("email"); String 성별 = rs.getString(5);
System.out.println("번호:"+번호+"\t이름:"+이름 +"\t나이:"+나이+"\t이멜:"+이멜 +"\t성별:"+성별); } rs.close(); stmt.close(); conn.close(); } } |
결과 | 번호:1 이름:김동혁 나이:2 이멜:donghyuk@nate.com 성별:M 번호:1 이름:김동혁 나이:2 이멜:donghyuk@nate.com 성별:M ….. |
설명 | 문장5~7: sb 객체에 쿼리문을 작성했다. 문장9~12: jdbc 로 oracle 에 연결을 위한 conn 객체를 만들었다. 문장13: Statement 클래스의 stmt 객체를 conn 으로부터 생성을 받는다. 문장15: sb 객체의 쿼리문을 실행 후 ResultSet 클래스의 객체인 rs 로 결과를 받았다. 문장16: rs.Next() 메서드를 통해 데이터가 있는지 확인하고, 다음위치로 커서를 이동한다. 문장17~19: 각 타입에 맞도록 rs.getInt() , rs.getString() 으로 데이터를 꺼내오고, ()안에는 컬럼의 index 번호 또는 컴럼명이 들어간다. Index 는 1부터 시작한다. 위 쿼리가 파라메터가 달라지면, oracle 에서 다른 쿼리로 인식해 실행계획을 다시 세우고 쿼리를 실행하기 때문에 오라클의 자원을 낭비하게 된다. 또한 Inject 공격을 당할 수 있다. 그래서 statement 사용을 권장하지 않는다. |
2. PreparedStatement, ResultSet 테스트를 위해 jdbc 패키지에 PreparedDemo 클래스를 만들어 아래의 코드를 작성해 보자.
코드 | package jdbc; import java.sql.*; public class PreparedDemo { public static void main(String[] args) throws Exception { String name = "이연희"; int age = 24; String email = "lee@nate.com"; String sex = "F";
StringBuilder sb = new StringBuilder(); sb.append (" update emp.person "); sb.append (" set name=?, age=?, email=?, sex=? "); sb.append (" where no=? ");
Class.forName("oracle.jdbc.OracleDriver"); String url = "jdbc:oracle:thin:@127.0.0.1:1522:xe"; String user = "emp"; String pass = "pass"; Connection conn = DriverManager.getConnection(url, user, pass); PreparedStatement pstmt = conn.prepareStatement(sb.toString());
pstmt.setString(1, name); pstmt.setInt(2, age); pstmt.setString(3, email); pstmt.setString(4, sex); pstmt.setInt(5, 1); pstmt.executeUpdate();
pstmt.close(); conn.close(); } } |
결과 | |
설명 | 문장5~6: 저장할 데이터를 변수에 담아 놨다. 문장8~11: update 쿼리를 작성하고, 파라메터를 쿼리문에 연결해서 문장을 만드는 것이 아니라 들아 가야 하는 곳에 ? 로 표시를 한다. ?의 index는 1부터 시작된다. 문장13~16: jdbc 로 oracle 에 연결을 위한 conn 객체를 만들었다. 문장17: conn.prepareStatement 메서드를 통해 PreparedStatement 클래스인 pstmt 객체를 생성하고 쿼리문을 저장한다.. 문장19~21: 쿼리문 중 파라메터로 표시한 ? 에 값을 rs.setString(), rs.setInt() 메서드를 사용해 데이터를 넣어준다. 메서드중 첫번째 파라메터는 ? 의 index 위치 (1부터사용), 두번째는 값을 넣어주게 된다. 문장22: 작성된 쿼리문에 파라메터를 대인한 문장을 실행한다. 위 방법은 파라메터가 달라져도 오라클에서 쿼리의 실행계획은 같게 된다. 쿼리문의 변형을 할 수 없기 때문에 Inject 공격을 신경 쓰지 않아도 된다. 그래서 PreparedStatement 사용을 권장한다. |
3. 본문 2에서 update 한 내용을 SQL툴에서 확인해보자.
코드 | select * from person |
결과 | 1 이연희 lee@nate.com 24 F 99 김동혁 donghyuk@nate.com 2 M ….. |
설명 | 첫번째 데이터가 이연희…. 로 변경된 것을 확인 할 수 있다. |
JDBC 사용시에 쿼리문은 PreparedStatement 를 사용하자…^^*
잡담. 지금까지 jdbc 기초 사용법에 대해서 알아봤습니다. 오늘도 수고하셨습니다. ^^" 파이팅~
'Developer > Java-jdbc' 카테고리의 다른 글
#004. Statement / PreparedStatement / ResultSet 알아보기... (1) | 2011.04.20 |
---|---|
#003. Static block (초기화 블럭) 에 대해서 알아보기... (0) | 2011.04.20 |
#002. JDBC 로 Oracle 연결 테스트 해보기... (0) | 2011.04.20 |
#001. JDBC 설치하고, Eclipse 에 적용 해보자... (0) | 2011.04.18 |