[JDBC] PreparedStatement 개념 및 예제

Statement 클래스

- SQL 구문을 실행하는 역할

- 스스로는 SQL 구문 이해 못함(구문해석 X) -> 전달역할

- SQL 관리 O + 연결 정보 X


PreparedStatement 클래스

- Statement 클래스의 기능 향상

- 인자와 관련된 작업이 특화(매개변수)

- 코드 안정성 높음. 가독성 높음.

- 코드량이 증가 -> 매개변수를 set해줘야하기 때문에..

- 텍스트 SQL 호출


Statement 클래스의 sql


String name = "홍길동";

String memo = "메모 테스트 입니다. 홍길동's 메모장";

String priority = "1";


String sql = String.format("insert into tblMemo values(memoSeq.nextval,'%s','%s',default,%s)", name, memo, priority); 


-> 이런식으로 매개변수를 줘야함.


PreparedStatement 클래스의 sql


sql = "insert into tblMemo values(memoSeq.nextval,?,?,default,?)";

pstat = conn.prepareStatement(sql);


//매개변수 값 대입 + 매개변수 유효화 처리.

pstat.setString(1, name);

pstat.setString(2, memo);

pstat.setString(3, priority);


PrepareStatement 예제


- Connection 객체 가져오는 DBUtil 클래스의 getConnection() 메소드를 사용할 것임.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class DBUtil {
    public static Connection getConnection() {
        Connection conn = null;
        String url = "jdbc:oracle:thin:@localhost:1521:xe";
        String id = "hr";
        String pw = "java1234";
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(url, id, pw);
            return conn;
        } catch (Exception e) {
            System.out.println("DBUtil.getConnection() : " + e.toString());
        }
        return null;
    }
}
cs


1. 정적 쿼리(매개변수가 없거나.. 쿼리 구문이 변화가 없는 쿼리) -> executeUpdate() 메소드 사용.(숫자 반환)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Example{
    private static void m3() {        
        Connection conn = null;
        PreparedStatement stat = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection();
            String sql = "delete from tblMemo";
            stat = conn.prepareStatement(sql);
            System.out.println(stat.executeUpdate());
            stat.close();
            conn.close();
        } catch (Exception e) {
            System.out.println("JDBCTest.m2()" + e.toString());
        }        
    }
}
cs


2. 단일컬럼 가져올때( count(*) 함수의 결과 가져오는 경우같은 경우)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Example{
    private static void m() {        
        //식별자(컬럼, 테이블)를 매개변수로 하는 업무
        //사용자입력(테이블명) : tblAddressBook
        //결과 : 행의갯수 출력.
        
        String tableName = "zipcode";
        Connection conn = null;
        Statement stat = null;
        ResultSet rs = null;
        
        try {
            conn = DBUtil.getConnection();
            stat = conn.createStatement();
            
            String sql = String.format("select count(*) as cnt from %s",tableName);
            rs= stat.executeQuery(sql);
            if(rs.next()) {
                System.out.println("행의 갯수 : "+rs.getInt("cnt"));
            }    
            stat.close();
            conn.close();
        } catch (Exception e) {
            System.out.println("JDBCTest.m2()" + e.toString());
        }        
    }
}
cs


String sql = "select count(*) as cnt from ?"; 이렇게는 사용할 수 없음, table은 값이 dataType을 가지는 존재가 아니기 때문에..

String sql = "select count(*) as cnt from table where city = ?"; -> 매개변수가 서울 인 경우 stat.setString(1,'서울');로 처리할 수가 있음, 하지만 setString()시 테이블명을 넣지는 않음. 엄밀히 말해서 Oracle Object에 해당하는 것은 올 수 없음.


3. 다중 루프 쿼리, 부모 & 자식 테이블의 내용을 동시에 출력하는 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Example{
    private static void m() {        
        //주요정보 출력(유저 명단)        
        Connection conn = null;
        PreparedStatement stat = null;
        ResultSet rs = null;
        try {
            conn = DBUtil.getConnection();
            String sql = "select * from tblUser order by id asc";
            stat = conn.prepareStatement(sql);
            System.out.println("==== 유저목록 ====");
            rs= stat.executeQuery();
            while(rs.next()) {
                System.out.printf("%s\t%s\t%s\t\n"
                        ,rs.getString("id")
                        ,rs.getString("name")
                        ,rs.getString("grade"));
            }
            rs.close();
            stat.close();
            conn.close();
        } catch (Exception e) {
            System.out.println("JDBCTest.m2()" + e.toString());
        }    
    }
}
cs


댓글

Designed by JB FACTORY