Java

[Java] ResultSet, PreparedStatement 인터페이스

에띠 2022. 4. 26. 13:40
728x90

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';

 

 

 

728x90