본문 바로가기

Developer/Java-jdbc

#005. Statement / PreparedStatement / ResultSet 실습 해보기...

#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 기초 사용법에 대해서 알아봤습니다. 오늘도 수고하셨습니다. ^^" 파이팅~