[KH정보교육원] 32일차_Statement 실습 계속, PreparedStatement
2021.11.24(수)
💻 Statement 실습
- (MEMBER 관리 프로그램) 계속/마무리
- 어떤 쿼리문을 처리하려고 하는지 먼저 정확히 알아야 한다!
🌿 PreparedStatement
🌱 Statement vs PreparedStatement 차이점
- Statement는 완성된 SQL문 vs PreparedStatement는 미완성된 SQL문
- 객체 생성 시
- stmt = conn.createStatement();
- pstmt = conn.prepareStatement(sql); // 객체 생성 시 미완성/구멍뚫은 상태의 SQL문(틀) 먼저 전달
- Statement로 SQL문 실행 시 결과 = stmt.executeXXXX(sql);
- PreparedStatement로 SQL문 실행 시 ?로 빈 공간을 실제 값으로 채워준 뒤 실행
- pstmt.setString(?위치, 실제값);
- pstmt.setInt(?위치, 실제값); -> 결과 = pstmt.executeXXXX();
🌱 처리 순서
- JDBC 사용하고 싶으면 API/도구/규약 이렇게 쓰라고 미리/이미 정해져 있는 것 → 이해할 필요 없고, 외워서 사용하면 됨/사용하는 방법만 알면 됨 vs 개발자 재량껏 할 수 있는 건 단계 6a)과 8)
1. JDBC Driver 등록: 해당 DBMS가 제공하는 클래스 등록
2. Connection 객체 생성: 접속하고자 하는 DB의 (접속)정보(url, 계정, 비밀번호)를 입력해서 DB에 접속하면서 생성
3a. PreparedStatement 객체 생성: Connection 객체를 이용해서 미완성된 SQL문을 담아서 생성
cf. 완성된 SQL문 담을 수도 있긴 함 e.g. SELECT * FROM MEMBER 같이 따옴표 쓸 필요 없는 쿼리문 등
Class.forName("oracle.jdbc.driver.OracleDriver"); // 수업시간에는 고정적으로 이 도구를 사용함; 에러 msg = 클래스를 못 찾는 예외가 발생할 수 있음
// 위에서 만든 변수 사용 -> . = 참조 연산자; .의 왼쪽 위치에 있는 오른쪽의 무언가를 사용/접근 -> url, 계정명, 비밀번호
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JDBC", "JDBC"); // 수업시간에는 고정적으로 사용하는 정보, Oracle/sql developer에 연결됨; 에러 msg = sql 예외가 발생할 수 있음
pstmt = conn.prepareStatement(sql);
3b. 현재 미완성된 SQL문을 완성 형태로 채움: 미완성된 경우에만 해당 vs 완성된 경우에는 생략 가능
"SELECT * FROM MEMBER WHERE USERNAME LIKE '%keyword%'"
와 같은 SQL문을 만들고 싶은 경우
// 방법1)
String sql = "SELECT * FROM MEMBER WHERE USERNAME LIKE '%' || ? || '%'"; // SQL || = 연결연산자 -> '%' || 'keyword' || '%' = '%keyword%' -> 이 방법이 유지/보수에는 더 좋을 듯(강사님 의견)
...
pstmt.setString(1, userNameKeyword);
// 방법2)
// String sql = "SELECT * FROM MEMBER WHERE USERNAME LIKE ?"; // 깍두기 %keyword%를 Java에서 붙여서 넘겨줌 -> 가독성은 이 방법이 더 나읏 듯(강사님 의견)
...
// pstmt.setString(1, "%" + userNameKeyword + "%");
// 안 되는 방법: String sql = "SELECT * FROM MEMBER WHERE USER LIKE '%?%'"; -> '%'keyword'%'로 완성되어 정상 수행 안 됨
// e.g. userNameKeyword = "끼";
// String sql = "SELECT * FROM MEMBER WHERE USER LIKE '%?%'";
// pstmt.setString(1, keyword); // "SELECT * FROM MEMBER WHERE USER LIKE '%'끼'%'" 이렇게 SQL문 완성되어 날아감
4. SQL문 실행: executeXXX(), sql 매개변수 없음 → SELECT문의 경우 executeQuery() 메소드 호출 vs 나머지 DML문(+테이블 만들기(create) 등 DDL문)의 경우 executeUpdate() 메소드 호출
5. 결과 받기: SELECT문의 경우 ResultSet 객체(조회된 데이터가 담겨있음)로 받음 → 6a. ResultSet에 담겨있는 데이터를 하나씩 뽑아서 VO 객체에 담기, 많으면 ArrayList로 관리 || 나머지 DML문의 경우 int형(처리된 행의 개수)으로 받음 -> 6b. 트랜잭션 처리; 성공이면 COMMIT vs 실패면 ROLLBACK
7. 다 쓴 JDBC용 객체들은 반드시 자원 반납 ← 생성된 순서의 역순으로 close()
8. Controller로 결과 반환: SELECT문의 경우 6a)에서 만들어진 결과 vs 나머지 DML문의 경우 처리된 행의 개수
📗 homework: PreparedStatement 이용해서 MEMBER 관리 프로그램 작성 완료