ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JDBC - PreparedStatement 사용
    servlet/JDBC 2022. 2. 4. 00:25
    728x90
    반응형

     

     

     

    PreparedStatement 사용

    Statement 사용 시 불편한 점을 해결해준다. 또한 속도가 더 빠르다.

     

    PreparedStatement pstmt = null;
    •  Statement 인터페이스를 상속받는 하위 인터페이스

     

    ResultSet rset = null;
    •  SELECT 결과 집합을 받아올 용도의 인터페이스

     

    pstmt = con.prepareStatement("SELECT EMP_ID, EMP_NAME FROM EMPLOYEE WHERE EMP_ID = ?");
    pstmt.setString(1, empId);
    •  Statement 인터페이스와는 달리 PreparedStatement 인터페이스는 생성 시 쿼리문도 전달
    •  위치홀더에 해당 값을 setString(위치홀더인덱스, 변수)로 세팅 (위치홀더인덱스는 1부터 시작한다)

     

    rset = pstmt.executeQuery();
    •  executeQuery()로 쿼리문 실행하고 결과를 ResultSet으로 반환 받음

     

    if(rset.next()) {
        System.out.println(rset.getString("EMP_ID") + ", " + rset.getString("EMP_NAME"));
    }
    • 결과 집합을 순서대로 해당 값들을 가져올 수 있다.
    • ResultSet의 커서 위치를 하나 내리면서 행이 존재하면 true 존재하지 않으면 false를 반환

     

    전체 코드

    public class Application2 {
    
    	public static void main(String[] args) {
    		
    		/* 1. Connection 생성 */
    		Connection con = getConnection();
    		
    		PreparedStatement pstmt = null;
    		ResultSet rset = null;
    		String empId = "200";
    		
    		try {
    			
    			/* 2. PreparedStatement 생성 - 쿼리문 전달하며 */
    			pstmt = con.prepareStatement("SELECT EMP_ID, EMP_NAME FROM EMPLOYEE WHERE EMP_ID = ?");
    			pstmt.setString(1, empId);
    			
    			/* 3. executeQuery()로 쿼리문 실행하고 결과를 ResultSet으로 반환 받음 */
    			rset = pstmt.executeQuery();
    			
    			/* 4. ResultSet에 담긴 결과 값을 컬럼 이름을 이용해 꺼내오기 */
    			if(rset.next()) {
    				/* next() : ResultSet의 커서 위치를 하나 내리면서 행이 존재하면 true 존재하지 않으면 false를 반환 */
    				System.out.println(rset.getString("EMP_ID") + ", " + rset.getString("EMP_NAME"));
    			}
    			
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			/* 5. 사용한 자원 반납 */
    			close(rset);
    			close(pstmt);
    			close(con);
    		}
    		
    	}
    
    }

     

     

    참고
    Statement는 SQL injection에 취약하지만
    PreparedStatement는 내부적으로 SQL injection을 막아준다.

     

     

     

     

     

     

     

     

     

     

     

    728x90
    반응형

    'servlet > JDBC' 카테고리의 다른 글

    JDBC - CRUD INSERT, UPDATE, DELETE  (0) 2022.02.04
    JDBC - Statement 사용  (0) 2022.02.03
    Oracle JDBC 사용 방법  (0) 2022.02.03
    JDBC 10 - 최종 결과물  (0) 2021.12.03
    JDBC 9 - 사용자 인터페이스 붙이기(공지사항 목록)  (0) 2021.12.02

    댓글

Designed by Tistory.