[Java] ResultSet, PreparedStatement 인터페이스
ResultSet
ResultSet 인터페이스
- 결과를 저장할 수 있는 객체
- 저장된 값을 로우 단위로 불러올 수 있음
- 로우(행) 단위로 데이터를 가져올 경우 타입을 지정하여 불러올 수 있음
싱글톤 패턴
- 디자인 패턴 중 하나로 매번 드라이버를 로드하지 않고 프로세스에서 객체를 단 하나만 만들어 재활용 할 수 있도록 공유자원을 생성하는 방법
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Dbconn {
private static Connection conn;
// SQLException, ClassNotFoundException 예외 발생 시 상위 메소드로 책임전가
public static Connection getConnection() throws SQLException, ClassNotFoundException {
String url = "jdbc:mysql://127.0.0.1/aiclass?useSSL=false";
String userid = "root";
String userpw = "1234";
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, userid, userpw);
return conn;
}
public static void dbclose() {
try {
conn.close();
conn = null;
}catch (Exception e) {
e.printStackTrace();
}
}
}
클래스로 따로 빼서 매번 작성하지 않아도 됨.
⭐ 디자인 패턴
소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 발생했을 때 재사용할 수 있는 해결책
PreparedStatement
PreparedStatement 인터페이스
- Statement와 PreparedStatement의 차이는 캐시 사용 유무
- 객체를 캐시에 담아 재사용
- 반복적으로 쿼리를 수행한다면 statement에 비해 성능이 좋음 (미리 컴파일)
- statement는 보안상 취약점이 발견되었기 때문에 PreparedStatement를 사용하는 것을 권고하고 있음
- 코드가 길어질 수 있음
statement
String sql = "insert into tb_member (mem_userid, mem_userpw, mem_name ...")
values ("'" + mem_userid + "', '" + mem_userpw + "', ''", mem_name + "'" ...);
PrparedStatement
String sql = "insert into tb_member (mem_userid, mem_userpw, mem_name ...")
values (?, ?, ?, .. );
pstmt = conn.pepareStatement(sql); // 컴파일(캐시에 올림)
pstmt.setString(1, mem_userid);
pstmt.setString(2, mem_userpw);
pstmt.setString(3, mem_name);
..
pstmt.executeUpdate();
회원목록
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class Jdbc6 {
public static void main(String[] args) {
System.out.println("******** 회원목록 *******");
StringBuilder sql = new StringBuilder();
sql.append("select mem_idx, mem_userid, mem_name, mem_hp from tb_member");
try {
Connection conn = Dbconn.getConnection(); // Db 연결
Statement stmt = conn.createStatement(); // sql 문장을 실행하게 해주는 인터페이스
ResultSet rs = stmt.executeQuery(sql.toString()); // select 결과를 객체로 리턴받는 인터페이스
while (rs.next()) { // 다음 로우가 있을 때 까지 반복
// 각 필드의 타입에 따라 get+자료형 을 사용해서 데이터를 가져올 수 있음.
// int 형의 mem_idx의 값을 가져옴
System.out.print("번호 : " + rs.getInt("mem_idx") + " ");
// String 형의 mem_userid를 가져옴
System.out.print("아이디 : " + rs.getString("mem_userid") + " ");
// String 형의 mem_name을 가져옴
System.out.print("이름 : " + rs.getString("mem_name") + " ");
// String 형의 mem_hp를 가져옴
System.out.print("연락처 : " + rs.getString("mem_hp"));
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
로그인
import java.sql.*;
import java.util.Scanner;
public class Jdbc7 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("아이디를 입력하세요 : ");
String id = sc.next();
System.out.print("비밀번호를 입력하세요 : ");
String pw = sc.next();
StringBuilder sql = new StringBuilder();
sql = "select mem_userid, mem_userpw from tb_member where mem_userid =? and mem_userpw=?";
try {
Connection conn = Dbconn.getConnection();
prepareStatement pstmt = conn.prepareStatement();
pstmt.setString(1, id);
pstmt.setString(2, pw);
ResultSet rs = pstmt.executeQuery(sql);
if (rs.next()) {
System.out.println("로그인 되었습니다.");
} else {
System.out.println("아이디 또는 비밀번호가 틀렸습니다.");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
select mem_userid, mem_userpw from tb_member where mem_userid = 'apple' and mem_userpw = '1111';