본문 바로가기
JDBC

JDBC (select, delte,PreparedStatement)

by code2772 2022. 10. 19.

[ 목차 ]

    728x90
    반응형

    회원가입(기본)

    import java.sql.*;
    import java.util.Scanner;
    
    public class Jdbc1 {
        public static void main(String[] args) {
            String url = "jdbc:mysql://127.0.0.1/aidev?useSSL=false";
            String uid = "root";
            String upw = "1234";
    
            Scanner sc = new Scanner(System.in);
            System.out.println("😊😊😊😊😊 회원가입 😊😊😊😊😊");
            System.out.println("아이디를 입력하세요 > ");
            String mem_userid = sc.next();
            System.out.println("비밀번호를 입력하세요 > ");
            String mem_userpw = sc.next();
            System.out.println("이름을 입력하세요 > ");
            String mem_name = sc.next();
            System.out.println("휴대폰번호를 입력하세요 > ");
            String mem_hp = sc.next();
            System.out.println("이메일 입력하세요 > ");
            String mem_email = sc.next();
            System.out.println("성별을 입력하세요 > ");
            String mem_gender = sc.next();
            System.out.println("취미를 입력하세요 > ");
            String mem_hobby = sc.next();
            System.out.println("주민등록번호 앞자리를 입력하세요 > ");
            String mem_ssn1 = sc.next();
            System.out.println("주민등록번호 뒷자리를 입력하세요 > ");
            String mem_ssn2 = 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();
            String sql = "insert into tb_member (mem_userid, mem_userpw, mem_name, ";
            sql += "mem_hp, mem_email, mem_gender, mem_hobby, mem_ssn1, mem_ssn2, ";
            sql += "mem_zipcode, mem_address1, mem_address2, mem_address3) values (";
            sql += "'"+mem_userid+"', '"+mem_userpw+"', '"+mem_name+"', ";
            sql += "'"+mem_hp+"', '"+mem_email+"', '"+mem_gender+"', ";
            sql += "'"+mem_hobby+"', '"+mem_ssn1+"', '"+mem_ssn2+"', ";
            sql += "'"+mem_zipcode+"', '"+mem_address1+"', '"+mem_address2+"', ";
            sql += "'"+mem_address3+"')";
    
    //        System.out.println(sql);
    
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");//sql 패키지를 가저오자
                Connection conn = DriverManager.getConnection(url, uid, upw);
                Statement stmt = conn.createStatement();
                int result = stmt.executeUpdate(sql);
                if(result >= 1) System.out.println("회원가입이 완료되었습니다");
                else System.out.println("회원가입에 실패하였습니다");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e){//연결이 안되었을때는(getConnection 빨간줄 생성)
                e.printStackTrace();
            }
        }
    }

     

    문제. jdbc1을 참고하여 jdbc2 클래스에 회원가입 수정 프로그램을 작성해보자
    1. 아이디를 기준으로 수정
    2. sql 쿼리를 저장할 객체는 StringBuilder 사용

     

    import java.sql.*;
    import java.util.ArrayList;
    import java.util.Scanner;
    //문제. jdbc1을 참고하여 jdbc2 클래스에 회원가입 수정 프로그램을 작성해보자
    //        1. 아이디를 기준으로 수정
    //        2. sql 쿼리를 저장할 객체는 StringBuilder 사용
    public class Jdbc2 {
        public static void main(String[] args) {
            String url = "jdbc:mysql://127.0.0.1/aidev?useSSL=false";
            String uid = "root";
            String upw = "1234";
    
            Scanner sc = new Scanner(System.in);
            System.out.println("😊😊😊😊😊 회원수정😊😊😊😊😊");
            System.out.println("변경할 아이디를 입력하세요 > ");
            String mem_userid = sc.next();
            System.out.println("비밀번호를 입력하세요 > ");
            String mem_userpw = sc.next();
            System.out.println("이름을 입력하세요 > ");
            String mem_name = sc.next();
            System.out.println("휴대폰번호를 입력하세요 > ");
            String mem_hp = sc.next();
            System.out.println("이메일 입력하세요 > ");
            String mem_email = sc.next();
            System.out.println("성별을 입력하세요 > ");
            String mem_gender = sc.next();
            System.out.println("취미를 입력하세요 > ");
            String mem_hobby = sc.next();
            System.out.println("주민등록번호 앞자리를 입력하세요 > ");
            String mem_ssn1 = sc.next();
            System.out.println("주민등록번호 뒷자리를 입력하세요 > ");
            String mem_ssn2 = 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("update tb_member set ")
                    .append("mem_userpw ='"+ mem_userpw+ "', ")
                    .append("mem_name ='"+ mem_name+ "', ")
                    .append("mem_hp ='"+ mem_hp+ "', ")
                    .append("mem_email ='"+ mem_email+ "', ")
                    .append("mem_gender ='"+ mem_gender+ "', ")
                    .append("mem_hobby ='"+ mem_hobby+ "', ")
                    .append("mem_ssn1 ='"+ mem_ssn1+ "', ")
                    .append("mem_ssn2 ='"+ mem_ssn2+ "', ")
                    .append("mem_zipcode ='"+ mem_zipcode+ "', ")
                    .append("mem_address1 ='"+ mem_address1+ "', ")
                    .append("mem_address2 ='"+ mem_address2+ "', ")
                    .append("mem_address3 ='"+ mem_address3+ "' where mem_userid=' "+mem_userid+"'");
    
       System.out.println(sql);
    
            try {
                // class 라는 이름을 가진 클래스는 jvm에서 동작할 클래스들의 정보를 묘사하는 일종의 메타클래스
                // DB와 연결할 드라이바 클래스를 찾아서 로드
                Class.forName("com.mysql.cj.jdbc.Driver");
                Connection conn = DriverManager.getConnection(url, uid, upw);
                Statement stmt = conn.createStatement();
                int result = stmt.executeUpdate(sql.toString());
                if(result >= 1) System.out.println("회원가입이 완료되었습니다");
                else System.out.println("회원가입에 실패하였습니다");
            } catch (ClassNotFoundException e) {//Class.forName에 해당하는 예외처리를 해줘야한다
                e.printStackTrace();
            } catch (SQLException e){//SQL Server에서 경고 또는 오류를 반환할 때 throw되는 예외이다.
                e.printStackTrace();
            }
        }
    }

    Delete

    import java.sql.Connection;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Scanner;
    
    public class Jdbc3 {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            System.out.println("😢😢😢😢 회원탈퇴 😢😢😢😢");
            System.out.println("탈퇴할 아이디를 입력하세요");
            String mem_userid = sc.next();
    
    
            StringBuilder sql = new StringBuilder();
            sql.append("delete from tb_member ")
                    .append("where mem_userid='" + mem_userid + "'");
    
            try{
                Connection conn = Dbconn.getConnection();
                Statement stmt = conn.createStatement();
                int result = stmt.executeUpdate(sql.toString());
                if(result>=1) System.out.println("탈퇴되었습니다.");
                else System.out.println("탈퇴 실패되었습니다.");
            }catch (ClassNotFoundException e){
                e.printStackTrace();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
    }
    
    싱글톤 패턴 이용한 DB연결
    싱글톤 패턴 : 디자인 패턴 중 하나로 매번 드라이버를 로드하지 않고 프로세스에서 객체를 단 하나만 만들어
    재활용할 수 있도록 공유자원을 생성하는 방법
    
    ✔ 디자인 패턴
    소프트웨어를 설계할 때 특정 맥락에서 자주 발생하는 고질적인 문제들이 발생했을 때 재사용할 수 있는
    해결책을 다룬 알고리즘
    
    PreparedStatement 인터페이스
    - Statement와 PreparedStatement의 차이는 캐시 사용 유무
    - 객체를 캐시에 담아 재사용
    - 반복적으로 쿼리를 수행한다면 statement에 비해 성능이 많이 좋음
    - statement 보안상 취약점이 발견되었기 때문에 PreparedStatement를 사용하는 것을 권장하고 있음
    - 코드가 길어질 수 있음
    
        statement
        StringBuilder sql = new StringBuilder();
                sql.append("delete from tb_member")
                        .append("where mem_userid ='"+mem_userid+"'");
    
        PreparedStatement
        StringBuilder sql = new StringBuilder();
                    sql.append("delete from tb_member")
                            .append("where mem_userid ='"+mem_userid=?");
       PreparedStatement pstmt = conn.PreparedStatement(sql.toString());
       pstmt.setString(1, mem_userid);
       pstmt.executeUpdate();
    
    Result 인터페이스
    - 결과를 저장할 수 있는 객체
    - 저장된 값을 로우 단위로 불러올 수 있음
    - 로우 단위로 데이터를 가져올 경우 타입을 지정하여 불러올 수 있음
    
        StingBuilder sql = new StringBuilder();
        sql.append("select * from tb_member where mem_userid = ? and mem_pw =?");
        Connection conn = Dbconn.getConnection();
        PreparedStatement pstmt = Conn.prepareStatement(sql.toString);
        pstmt.setString(1, mem_userid);
        pstmt.setString(2, mem_userpw);
        pstmt.executeQuery();

    PreparedStatement(한줄 출력)

    
    public class Jdbc4 {
        public static void main(String[] args) {
            System.out.println("😁회원목록😁");
            StringBuilder sql = new StringBuilder();
            sql.append("select * from tb_member");// *로 했기 때문에 다른 모든것을 가저올 수 있다.
            try{
                Connection conn = Dbconn.getConnection();
                PreparedStatement pstmt = conn.prepareStatement(sql.toString());
                ResultSet rs = pstmt.executeQuery();// sql에서 테이블을 받아오는 것이다. Resultset에 담아짐
                rs.next();//처음 컬럼이아닌 필드를 가리키고 있어서 다음 커서인 컬럼을 가리킨다.
                // 꺼내오는 방법은 필드명이다.
                int mem_idx = rs.getInt("mem_idx");// 첫 번쨰 mem_idx를 저장
                String mem_userid = rs.getString("mem_userid");
                String mem_name = rs.getString("mem_name");
                String mem_hp = rs.getString("mem_hp");
                System.out.println("번호 : "+mem_idx);
                System.out.println("아이디 : "+mem_userid);
                System.out.println("이름 : "+mem_name);
                System.out.println("휴대폰번호 : "+mem_hp);
    
            }catch (ClassNotFoundException e){
                e.printStackTrace();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
    }
    

    PreparedStatement(전체 출력)

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class Jdbc5 {
        public static void main(String[] args) {
            System.out.println("😁회원목록😁");
            StringBuilder sql = new StringBuilder();
            sql.append("select * from tb_member");// *로 했기 때문에 다른 모든것을 가저올 수 있다.
            try{
                Connection conn = Dbconn.getConnection();
                PreparedStatement pstmt = conn.prepareStatement(sql.toString());
                ResultSet rs = pstmt.executeQuery();// sql에서 테이블을 받아오는 것이다. Resultset에 담아짐
                while(rs.next()) {//처음 컬럼이아닌 필드를 가리키고 있어서 다음 커서인 컬럼을 가리킨다.
                    // 꺼내오는 방법은 필드명이다.
                    int mem_idx = rs.getInt("mem_idx");// 첫 번쨰 mem_idx를 저장
                    String mem_userid = rs.getString("mem_userid");
                    String mem_name = rs.getString("mem_name");
                    String mem_hp = rs.getString("mem_hp");
                    System.out.println("번호 : "+ mem_idx+", 아이디 : "+mem_userid+", 이름 : "+mem_name+", 휴대폰번호 : "+mem_hp);
                }
            }catch (ClassNotFoundException e){
                e.printStackTrace();
            }catch (SQLException e){
                e.printStackTrace();
            }
        }
    }
    

     

    문제.
    아이디, 비밀번호를 입력받아 로그인 프로그램을 작성해보자.
    아이디를 입력하세요 > apple
    비밀번호를 입력하세요 > 1111
    로그인 되었습니다. (아이디 또는 비밀번호를 확인하세요)

    문제(1)

    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class JdbcTask1 {
        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_userpw = sc.next();
    
            StringBuilder sql = new StringBuilder();
            sql.append("select mem_idx from tb_member " +
                            "where mem_userid =? and mem_userpw = ?");
            try{
                Connection conn = Dbconn.getConnection();
                PreparedStatement pstmt = conn.prepareStatement(sql.toString());
                pstmt.setString(1, mem_userid);//물음표에 넣기
                pstmt.setString(1, mem_userpw);
                ResultSet rs = pstmt.executeQuery();// sql에서 테이블을 받아오는 것이다. Resultset에 담아짐
              if(rs.next())System.out.println("로그인 되었습니다.");
              else  System.out.println("아이디 비밀번호를 확인하세요");
    
            }catch (ClassNotFoundException e){//모둘이 올라오지 않는 경우
                e.printStackTrace();
            }catch (SQLException e){// 쿼리가 문제가 나오면
                e.printStackTrace();
            }
        }
    }

    문제(2) - Dbcon 으로 받아오기

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class Dbconn {
        private static Connection conn; // 주요하게 생각하는것을 컨넥션 객체를 사용할 수 있게
        //스테틱이 있으면 클래스만 불러도 된다 메소드 호출시
        public static Connection getConnection() throws SQLException, ClassNotFoundException {// 리턴타입은 Connection
            String url = "jdbc:mysql://127.0.0.1/aidev?useSSL=false";
            String uid = "root";
            String upw = "1234";
    
            Class.forName("com.mysql.cj.jdbc.Driver");
             conn = DriverManager.getConnection(url, uid, upw);
            return conn;
        }
    }
    
    반응형