🌏 DataBase/MySQL

[DB] 10. ResultSet & PreparedStatement 클래스

ryang x2 2020. 10. 12. 00:07
728x90
반응형

# ResultSet 클래스 

Statement 객체로 SELECT문을 사용하여 얻어온 레코드 값들을 테이블의 형태로 갖는 객체입니다.

 

● 메서드
next() : 다음 데이터가 존재하는지를 불린 형으로 알려주는 메서드

 

● 싱글톤(Singleton) 

애플리케이션이 시작될 때 어떤 클래스가 최초 한 번만 메모리에 할당하고 그 메모리에 인스턴스를
만들어 사용하는 디자인 패턴입니다.

* 디자인 패턴
소프트웨어를 설계할 때 특정 부분에서 자주 발생하는 문제들을 해결하기 위해 재사용이 가능한 최적의 방법을
제시하여 프로그램을 개발하는 방법을 말합니다.

 

public class Dbconn {
        private static Connection dbConn;

        public static Connection getConnection() throws SQLException, ClassNotFoundException{
            String url = "jdbc:mariadb://127.0.0.1:3306/webdev";
            String user = "root";
            String pw = "1234";
            Class.forName("org.mariadb.jdbc.Driver");
            dbConn = DriverManager.getConnection(url, user, pw);

            return dbConn;
        }

 

# PreparedStatement 클래스 

- SQL 쿼리에 매개변수를 부여하여 실행할 수 있습니다.

EX)
Statement 클래스 사용시,
String sql = "SELECT * FROM TB_MEMBER WHERE mem_userid='" + mem_userid + "'";     
String sql = "INSERT INTO TB_MEMBER(...) VALUES('" + mem_userid + "','" + mem_name +..)     

PreparedStatement 클래스 사용시,     
String sql = "SELECT * FROM TB_MEMBER WHERE mem_userid=?";    
String sql = "INSERT INTO TB_MEMBER (...) VALUES (?,?,?...);

 

- 처음 컴파일 후 이후에 컴파일을 추가로 하지 않습니다.
- 여러 번 실행되는 SQL쿼리일 경우 빠른 속도를 냅니다.
- "insert into test values(?,?,?)";

 

● return문 

메서드를 종료하면서 메서드의 리턴 값을 보내고 싶을 때 사용합니다.
메소드 안에서 사용하는 분기문으로 현재 수행 중인 메서드를 종료시키고
메소드를 호출한 수행문의 위치로 분기하며 이동합니다.
* 리턴 값이 void 인 메서드라면 return 문만 사용합니다.

 

 

예시 1)

//        Statement stmt = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        Connection conn = null;
        
        try{
            conn = Dbconn.getConnection();
//            stmt = conn.createStatement();
            String sql = "SELECT mem_idx, mem_userid, mem_name, mem_gender, mem_birthday FROM tb_member";
            pstmt = conn.prepareStatement(sql); // 컴파일 후 실행
//            rs = stmt.executeQuery(sql);
            rs = pstmt.executeQuery();

            while(rs.next()) { // rs.next() 셀제 데이터의 커서를 바꿔준다. 데이터 값이 있으면 계속 돌아간다.
                String mem_idx = rs.getString("mem_idx");
                String mem_userid = rs.getString("mem_userid");
                String mem_name = rs.getString("mem_name");
                String mem_gender = rs.getString("mem_gender");
                String mem_birthday = rs.getString("mem_birthday");
                System.out.println(mem_idx + ", " + mem_userid + ", " + mem_name + ", " + mem_gender + ", " + mem_birthday);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
        
        }

 

 

예시 2) 문제
DB를 이용하여 로그인 프로세스 프로그램을 작성
아이디를 입력하세요.
비밀번호를 입력하세요.

DB에 아이디와 비밀번호가 일치하는 회원이 있다면,
로그인되었습니다.

DB에 아이디와 비밀번호가 일치하는 회원이 없다면,
아이디 또는 비밀번호를 확인하세요.

public class Main3 {
    public static void main(String[] args) {

        PreparedStatement pstmt = null;
        ResultSet rs = null;

        Scanner sc = new Scanner(System.in);
        System.out.println("아이디를 입력하세요.");
        String mem_userid = sc.next();
        System.out.println("비밀번호를 입력하세요");
        String mem_pass = sc.next();
        try{
            Connection conn = Dbconn.getConnection();

            String sql = "SELECT mem_idx FROM tb_member WHERE " + "mem_userid = ? and mem_pass=PASSWORD(?)";
            pstmt= conn.prepareStatement(sql);
            System.out.println(sql);
            pstmt.setString(1,mem_userid);
            pstmt.setString(2,mem_pass); // 컴파일 후 물음표 순서대로 파라미터 입력
            rs = pstmt.executeQuery();
            if(rs.next()){
                System.out.println("로그인 되었습니다.");
            }else {
                System.out.println("아이디 또는 비밀번호를 확인하세요.");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

아이디 / 비밀번호가 맞았을 때
아이디 / 비밀번호가 틀렸을 때

 

 

예시 3) 회원 가입

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Scanner;

public class Main4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("아이디를 입력하세요.");
        String mem_userid = sc.next();
        System.out.println("비밀번호를 입력하세요.");
        String mem_pass = sc.next();
        System.out.println("이름을 입력하세요.");
        String mem_name = sc.next();
        System.out.println("이메일을 입력하세요.");
        String mem_email = sc.next();
        System.out.println("주민번호를 입력하세요.");
        String mem_ssn = sc.next();
        System.out.println("생년월일을 입력하세요.");
        String mem_birthday = sc.next();
        System.out.println("성별을 입력하세요.");
        String mem_gender = sc.next();
        System.out.println("취미를 입력하세요.");
        String mem_hobby = sc.next();
        System.out.println("전화번호를 입력하세요.");
        String mem_hp = sc.next();
        System.out.println("우편번호를 입력하세요.");
        String mem_zipcode = sc.next();
        System.out.println("주소를 입력하세요.");
        String mem_address1 = sc.next();
        System.out.println("상세주소를 입력하세요.");
        String mem_address2 = sc.next();
        System.out.println("참고사항를 입력하세요.");
        String mem_address3 = sc.next();

        StringBuilder sql = new StringBuilder();
        sql.append("INSERT INTO tb_member (mem_userid, mem_pass, mem_name,");
        sql.append("mem_email, mem_ssn, mem_birthday, mem_gender, mem_hobby,");
        sql.append("mem_hp, mem_zipcode, mem_address1, mem_address2,");
        sql.append("mem_address3) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)");

        try{
            Connection conn = Dbconn.getConnection();
            PreparedStatement pstmt = conn.prepareStatement(sql.toString());
            pstmt.setString(1, mem_userid);
            pstmt.setString(2, mem_pass);
            pstmt.setString(3, mem_name);
            pstmt.setString(4, mem_email);
            pstmt.setString(5, mem_ssn);
            pstmt.setString(6, mem_birthday);
            pstmt.setString(7, mem_gender);
            pstmt.setString(8, mem_hobby);
            pstmt.setString(9, mem_hp);
            pstmt.setString(10, mem_zipcode);
            pstmt.setString(11, mem_address1);
            pstmt.setString(12, mem_address2);
            pstmt.setString(13, mem_address3);
            int result = pstmt.executeUpdate();
            if(result >= 1){
                System.out.println("회원가입 성공");
            }else{
                System.out.println("회원가입 실패");
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

좌) 적용하기 전 ----> 우) 적용 후

 

 

 

 

 

728x90
반응형