본문 바로가기
클라우드 활용 자바개발자 양성과정/02-2. JDBC

3. PreparedStatement

by moca7 2024. 7. 30.

 

ㅁ < Statement, PreparedStatement >

- 둘 다 sql문을 실행하고 결과를 받아내는 객체다. 

- Statement가 PreparedStatement의 부모다. (상속구조)

 

- Statement는 완성 형태의 sql문을 전달하면서 곧바로 실행한다.

완성 형태란 실제 데이터값들이 다 채워진 상태를 말한다.

 

- PreparedStatement는 미완성 형태의 sql문을 임시로 가지고 있다가 완성시킨 후 실행시킬 수 있다.

미완성 형태란 실제 데이터값이 채워질 공간을 ?(홀더)로 공간을 확보해둔 상태로 작성해둔 형태를 말한다.

ex) insert into 테이블 values(?, ?, ?)

 

 

ㅁ < Statement 방식 >

 

(1) Connection 객체를 통해 Statement 객체 생성

 

    stmt = conn.createStatement();

 

 

(2) sql문을 전달하면서 실행 후 결과받기

 

    결과 = stmt.executeXXX( 완성된 sql문 );

 

 

 

ㅁ < PreparedStatement 방식 >
- 장점. 쿼리문을 초기에 작성할 때 굉장히 간결하게 작성할 수 있다. 

- 거의 PreparedStatement를 주로 쓴다.

- 단점. sql문을 프린트문으로 잘 작성했는지 확인해볼 수 없다.

 

 

(1) Connection 객체를 통해 PreparedStataement 객체 생성

 

    pstmt = conn.prepareStatement( [미]완성된 sql문 );       //       객체를 생성할 때 sql문을 담는다.

 

 

(2) PreparedStatement에 담긴 sql문이 미완성된 상태일 경우 완성시키기

    

    pstmt.setXXX(홀더 순번, 채울값);

 

 

(3) sql문 실행 후 결과받기

 

    결과 = pstmt.executeXXX();      //      sql문 전달 x

 

 

 

ㅁ SELECT * FROM MEMBER같은 완성된 sql문은 그냥 Statement 쓰면 됨.

근데 사용자가 입력한 값들을 채워야 하는 경우는 PreparedStatement를 사용하면 훨씬 간결하게 작성 가능하다.

 

 

 

ㅁ PreparedStatement 예시

 

 

public int insertMember(Member m) {

 

    int result = 0;

 

    Connection conn = null;

    PreparedStatement pstmt = null;

 

    String sql = "INSERT INTO MEMBER VALUES(SEQ_UNO.NEXTVAL, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)";

 

 

    try {

        Class.forName("oracle.jdbc.driver.OracleDriver");

        conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC");

        pstmt = conn.prepareStatement(sql);        //        sql문을 담은채로 생성. (하필 미완성된 sql문)

 

        //   ? 자리에 실제 데이터값 채우기

        //   pstmt.setString(홀더 순번, 대체할 값)

        //   pstmt.setInt(홀더 순번, 대체할 값)

        pstmt.setString( 1, m.getUserId() );

        pstmt.setString( 2, m.getUserPwd() );

        pstmt.setString( 3, m.getUserName() );

        pstmt.setString( 4, m.getGender() );

        pstmt.setInt( 5, m.getAge() );

        pstmt.setString( 6, m.getEmail() );

        pstmt.setString( 7, m.getPhone() );

        pstmt.setString( 8, m.getHobby() );

 

        result = pstmt.executeUpdate();

 

        if(result > 0) { conn.commit(); }

        else { conn.rollback(); }

    }

    catch (ClassNotFoundException e) { e.printStackTrace(); }

    catch (SQLException e) { e.printStackTrace(); }

    finally {

        try {

            pstmt.close();

            conn.close();

        }

        catch (SQLException e) { e.printStackTrace(); }

    }

 

    return result;

}

 

 

- ?에 홑따옴표 포함.

- pstmt.setString(홀더순번, 대체할값)에도 홑따옴표 포함.

 

 

 

ㅁ 회원 이름으로 키워드 검색하는 경우(부분 검색)

- String sql = "SELECT * FROM MEMBER WHERE USER_NAME LIKE ?";

- pstmt.setString(1, "%" + userName + "%");