createStatement()와 prepareStatement()는 JDBC(Java Database Connectivity)에서 SQL 문을 실행하는 데 사용되는 두 가지 메서드다
이전은
createStatement()를 이용했었는데 prepareStatement()를 사용하여 로그인을 해보자
파라미터화된(prepared) 문을 사용하지 않기 때문에 동일한 쿼리를 여러 번 실행할 경우 성능이 저하될 수 있다.
매번 새로운 쿼리를 실행하므로 데이터베이스가 매번 새로운 쿼리를 컴파일해야 한다.
데이터베이스에 대한 SQL 쿼리를 실행하기 전에 준비된(prepared) 상태로 만들어주는 역할을 한다.
일반적으로 SQL 쿼리에는 사용자가 제공한 데이터(예: 사용자 입력)를 포함해야 하는 경우가 많습니다. 이러한 경우에는 보안 및 성능상의 이유로 사용자가 입력한 데이터를 직접 SQL 쿼리에 삽입하는 것보다는 파라미터화된(prepared) 문을 사용하는 것이 좋습니다.
package main;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Scanner;
public class LoginMain {
public static void main(String[] args) throws Exception {
System.out.println("==========JDBC(pstmt)로그인");
// JDBC 드라이버 로딩
String driver = "oracle.jdbc.driver.OracleDriver";
Class.forName(driver);
// 데이터베이스 연결 정보 준비
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String id = "C##KH";
String pwd = "1234";
// 데이터베이스 연결 == 커넥션 객체 얻기
Connection conn = DriverManager.getConnection(url, id, pwd);
// 유저 입력받기
Scanner sc = new Scanner(System.in);
System.out.print("아이디: ");
String inputId = sc.nextLine();
System.out.print("비번: ");
String inputPwd = sc.nextLine();
// SQL 준비
String sql = "SELECT* FROM MEMBER WHERE ID= ? AND PWD= ?";
// SQL 실행을 위한 statement 준비 및 쿼리 완성(==물음표 채우기)
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, inputId);
pstmt.setString(2, inputPwd);
// statement 에 SQL 담아주고 실행 및 결과 리턴받기
ResultSet rs = pstmt.executeQuery();
// 결과 출력
while (rs.next()) {
String dbId = rs.getString("ID");
String dbPwd = rs.getString("PWD");
String dbNick = rs.getString("NICK");
MemberVo vo = new MemberVo(dbId, dbPwd, dbNick);
System.out.println(vo);
}
// 사용한 자원 반납
// ~~~~~
}
}