PreparedStatement를 이용한 회원 정보 실습
Servlet 비즈니스 로직 처리1 에서는
Servlet 비즈니스 로직 처리1 (Servlet, DAO, VO)
서블릿의 데이터베이스 연동하기 - 서블릿에서 데이터베이스와 연동하여 조회한 데이터를 얻은 후 클라이언트의 웹 브라우저로 응답하는 과정 실습 - 클라이언트로부터 요청을 받으면, 서블릿
steel-blue.tistory.com
MemberDAO에서 Statement 인터페이스를 이용하여 데이터 베이스와 연동했음.
하지만 Statement를 이용해서 데이터베이스와 연동할 경우,
연동할 때마다 DBMS에서 다시 SQL문을 컴파일해야 하므로 속도가 느리다.
이럴 경우 PreparedStatement 인터페이스를 사용하면
SQL문을 미리 컴파일해서 재사용하므로
Statement 인터페이스보다 훨씬 빠르게 데이터베이스 작업을 수행할 수 있다.
따라서 데이터베이스와 연동할 때, 빠른 처리가 필요할 때는
'PreparedStatement' 인터페이스를 사용해야 한다.
PreparedStatement 인터페이스의 특징
- PreparedStatement 인터페이스는 Statement 인터페이스를 상속하므로 지금까지 사용한 메서드를 그대로 사용
- Statement 인터페이스 : DBMS에 전달하는 SQL문 - 단순한 문자열. DBMS가 문자열을 컴파일하고 실행
PreparedStatement 인터페이스 : 컴파일된 SQL문을 DBMS에 전달 - 성능 향상
- PreparedStatement 인터페이스에서는 실행하려는 SQL문에 "?"을 넣어 "?"의 값만 바꾸어 손쉽게 SQL문 설정 가능
public class MemberDAO {
private PreparedStatement pstmt;
private Connection con;
public List<MemberVO> listMembers(){
List<MemberVO> list = new ArrayList<MemberVO>();
try {
//connDB(); // 네가지 정보로 데이터베이스를 연결합니다.
con = SingletonHelper.getConnection("oracle");
String query = "select * from t_member";
System.out.println(query);
pstmt = con.prepareStatement(query);
ResultSet rs = pstmt.executeQuery(); //SQL문으로 회원정보를 조회합니다.
while(rs.next()) {
//조회한 레코드의 각 컬럼 값을 받아 옵니다.
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String email = rs.getString("email");
Date joinDate = rs.getDate("joinDate");
//각 컬럼 값을 다시 MemberVO 객체의 속성에 설정합니다.
MemberVO vo = new MemberVO();
vo.setId(id);
vo.setPwd(pwd);
vo.setName(name);
vo.setEmail(email);
vo.setJoinDate(joinDate);
//설정된 MemberVO 객체를 다시 ArrayList에 저장합니다.
list.add(vo);
}
rs.close();
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
//조회한 레코드의 개수만큼 MemberVO 객체를 저장한 ArrayList를 반환합니다.
return list;
}
private void connDB() {
try {
Class.forName("oracle.jdbc.OracleDriver");
System.out.println("Oracle 드라이버 로딩 성공");
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","bituser","1004");
System.out.println("Connection 생성 성공");
stmt = con.createStatement();
System.out.println("Statement 생성 성공");
} catch (Exception e) {
e.printStackTrace();
}
}
}
connDB() 메서드는 쓰지 않고 SingletonHelper 클래스를 따로 만들어 데이터연결함.
JDBC SingletonHelper
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class SingletonHelper { /* * if(dsn.equals(..
steel-blue.tistory.com
Statement()
Statement stmt;
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
=> query 단순한 문자열
DBMS가 이 문자열을 컴파일하고 실행한다.
PreparedStatement()
PreparedStatement pstmt;
pstmt = con.preparedStatement(query);
ResultSet rs = pstmt.executeQuery();
=> 컴파일된 SQL문을 DBMS에 전달