* Statement 와 PreparedStatement의 특징
  - 둘 다 sql문을 실행하고 결과를 받아내는 객체 (둘 중에 하나를 이용하면 됨)
  - Statement가 PreparedStatement의 부모(상속구조)
 

 * Statement와 PreparedStatement의 차이점
  - Statement 는 sql을 바로 전달하면서 실행시키는 객체
  (즉, sql문을 완성형태로 만들어 둬야됨! == 사용자가 입력한 값들이 다 채워진 형태로)
   
   1) Connection 객체를 통해 Statement 객체 생성
      > stmt = conn.createStatement();
   2) Statement 객체를 통해 sql문 실행 결과 받기 
      > 결과 = stmt.excuteQuery|Update(완성된 sql문);
 
  - PreparedStatement 는 "미완성된 sql문"을 잠시 보관해둘 수 있는 객체 
  (즉, 사용자가 입력한 값들을 채워두지 않고 각각 들어갈 공간만 미리 확보해놔도됨)
 
    1) Connection 객체를 통해 PreparedStatement 객체 생성
      > pstmt = conn.prepareStatement([미]완성된 sql문);
    2) pstmt 에 담긴 sql문이 미완성된 상태일 경우 우선 완성시켜야함 
       > pstmt.setXXX(1,"대체할값");
         pstmt.setXXX(2,"대체할값");
         ..
   3) 해당 완성된 sql문을 실행 결과 받기 
      > 결과 = pstmt.excuteQuery|Update();
              

***JDBC과정에서 Statement -> PreparedStatement로 변경시 

실행할 sql문을 미완성된 형태로 둘 수 있음
==> 미리 사용자가 입력한 값들이 들어갈 수있게 물음표로 공간 확보 ( ? == 홀더)

 PreparedStatement 객체 생성후 빈공간(?) 를 사용자가 입력한 값으로 채워 sql문 완성시켜 줘야함 
SetString(홀더 순번, 대체할 값) / SetInt(홀더 순번, 대체할값) 

예시)

public int insertMember(Member m) {
		int result = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		//실행할 sql문(미완성된 형태로 둘 수 있음)
		String sql = "INSERT INTO MEMBER VALUES(SEQ_USERNO.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(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.getAddress());
			pstmt.setString(9, 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;
	}
복사했습니다!