JDBC

JDBC (select, delte,PreparedStatement)

code2772 2022. 10. 19. 08:29
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;
    }
}
반응형