본문 바로가기

JDBC

JDBC_1강

  JDBC(Java Database Connectivity) 프로그래밍

자바 프로그래밍과 DBMS를 연동하는 작업으로, DB에 직접 접근하는 것이 아니라 DBMS(MySQL)와 네트워크로 연결해 데이터 처리를 요청하고 결과를 응답받는 구조이다.

 

이 과정을 진행하려면 드라이버(jar) 파일을 프로젝트에 포함시켜야 한다.

File > Project Structure... 실행 -> Libraries 선택 -> '+' 버튼 클릭 > 'Java' 선택 -> 외부 jar 파일의 위치를 찾아 포함

 

처리 단계)

  • DBMS용 드라이버 로드
  • 드라이버를 통한 DBMS 접속(IP, 계정, 비밀번호)
  • 요청 및 응답 처리
  • 접속 해제

  예제) 흐름 파악하기

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DataDao {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            // 1. 드라이버 로드
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 드라이버 매니저 : 외부 프로그램과 네트워크로 접속할 때
            // 접속용 드라이버 라이브러리를 관리하는 객체

            System.out.println("드라이버 로드 성공");

            // 2. DB에 접속 : 접속 관리 객체 Connection
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/devdb",
                    "dev01", "12341234"
            );

            System.out.println("접속 성공");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("드라이버 로드 실패");
        } catch (SQLException se) {
            se.printStackTrace();
            System.out.println("접속 실패");
        } finally {
            // 통로를 해제하는 작업
            try {
                System.out.println("접속 해제 성공");
                conn.close();
            } catch (SQLException e) {
                // 여기에는 아무것도 작성하지 않음
            }
        }
    }
}

  예제) 회원가입/로그인

- DataDto(주고 받을 데이터 변수를 담음)

package dto;

import lombok.Data;

public class MemberDto {
    private String m_id;
    private String m_pwd;
    private String m_name;
    private int m_age;
    private String m_job;

    public String getM_id() { return m_id; }
    public void setM_id(String m_id) { this.m_id = m_id; }
    public String getM_pwd() { return m_pwd; }
    public void setM_pwd(String m_pwd) { this.m_pwd = m_pwd; }
    public String getM_name() { return m_name; }
    public void setM_name(String m_name) {this.m_name = m_name; }
    public int getM_age() { return m_age; }
    public void setM_age(int m_age) { this.m_age = m_age; }
    public String getM_job() { return m_job; }
    public void setM_job(String m_job) { this.m_job = m_job; }
    // 사용 안 함
    public String getM_grade() { return m_grade; }
    public void setM_grade(String m_grade) { this.m_grade = m_grade; }
    public int getM_point() { return m_point; }
    public void setM_point(int m_point) { this.m_point = m_point; }
    
    private String m_grade;
    private int m_point;
} // DB 테이블의 컬럼명과 동일하게 변수명을 설정

 

- DataDao(DB 접속)

package dao;

import dto.MemberDto;

import java.sql.*;

public class DataDao2 {
    private String drv = "com.mysql,cj.jdbc.Driver";
    private String url = "jdbc:mysql://127.0.0.1:3306/devdb";
    private String user = "dev01";
    private String pwd = "12341234";


    Connection conn; // 접속 관리 객체 선언

    // SQL 실행 객체
    Statement stmt;
    PreparedStatement pstmt; // upgrade ver
    ResultSet rs; // 결과 집합 저장 객체

    // 드라이버 로드의 경우 최초 1번만 실행하면 됨 (생성자에서 처리)
    public DataDao2() {
        try {
            Class.forName(drv);
        } catch (ClassNotFoundException e) {
            System.out.println("드라이버 로드 실패");
        }
    } // 생성자 end

    // 해제 전문 메소드 close(통로를 유지하려면 메모리가 소모된다)
    private void close() {
        try {
            if (rs != null) rs.close();
            if (stmt != null) stmt.close();

            // 접속 관리 객체가 null이 아닌 경우에만 해제
            if(conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    } // close end

    // 접속 테스트 메소드
    public void connectionTest() {
        try {
            conn = DriverManager.getConnection(url, user, pwd);
            System.out.println("접속 성공");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("접속 실패");
        } finally {
            close(); // 해제 메소드 사용
        }
    }

    // 로그인 => 비밀번호를 검색해 오는 메소드
    public String selectPwd(String m_id) {
        String dbpwd = null;

        try {
            // DB 접속
            conn = DriverManager.getConnection(url, user, pwd);

            // SQL 실행 객체 생성
            stmt = conn.createStatement();

            // SQL 쿼리문장을 작성
            String query = "SELECT m_pwd FROM member WHERE m_id = '" + m_id + "'" ;
            // SELECT m_pwd FROM member WHERE m_id = '입력값'

            String query2 = "SELECT m_pwd FROM member " + "WHERE m_id = ?";
            // 사용자의 입력값이 위치하는 곳에 '?'로 작성
            // ? 위치에 문자열일 경우 자동으로 ''를 붙여줌
            // 숫자값일 경우 '' 없이 추가됨

            pstmt = conn.prepareStatement(query2);
            pstmt.setString(1, m_id);

            // rs = stmt.executeQuery(query); // 쿼리문을 실행하는 메소드
            rs = pstmt.executeQuery(); // 미리 쿼리문을 준비해 미완성된 부분을 채워넣어 실행하는 메소드
            // SELECT 쿼리문을 이용하는 변수

            if (rs.next()) { // rs.next() : select 결과가 있을 경우 true, 없을 경우 false
                dbpwd = rs.getString("m_pwd");
                // getString(컬럼의 위치(순번) 또는 컬럼명)
            }

        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("DB 처리 실패");
        }

        return dbpwd;
    }

    // 회원가입
    public void insetMember(MemberDto md) {
        try {
            conn = DriverManager.getConnection(url, user, pwd);

            // 미완성 쿼리문 작성
            String query = "INSERT INTO member " +
                    "VALUES (?,?,?,?,?,default,default)";

            // 실행 객체 생성
            pstmt = conn.prepareStatement(query);
            // 미완성 부분 채워넣기
            pstmt.setString(1, md.getM_id());
            pstmt.setString(2, md.getM_pwd());
            pstmt.setString(3, md.getM_name());
            pstmt.setInt(4, md.getM_age());
            pstmt.setString(5, md.getM_job());

            int r = pstmt.executeUpdate();
            // insert, update, delete 작업은 모두 executeUpdate()로 실행
            // 작업 실패 시 0을 반환

            if (r != 0) {
                System.out.println("입력 성공");
            } else {
                System.out.println("입력 실패");
            }


        } catch (SQLException e) {
            System.out.println("DB 처리 실패");
        }
    }
} // class end

 

- JoinClass(회원가입 run)

import dao.DataDao2;
import dto.MemberDto;

import java.util.Scanner;

public class MainClass2 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        DataDao2 dao = new DataDao2();
        MemberDto md = new MemberDto();

        System.out.println("회원가입");
        System.out.println("-------");
        System.out.print("ID : ");
        md.setM_id(scan.nextLine());
        System.out.print("PWD : ");
        md.setM_pwd(scan.nextLine());
        System.out.print("NAME : ");
        md.setM_name(scan.nextLine());
        System.out.print("AGE : ");
        md.setM_age(scan.nextInt());
        System.out.print("JOB : ");
        md.setM_job(scan.nextLine());

        dao.insetMember(md);
    }
}

 

- LoginClass(로그인 run)

import dao.DataDao2;

import java.util.Scanner;

public class MainClass {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        DataDao2 dao = new DataDao2();
        dao.connectionTest();

        System.out.println("로그인 처리");
        System.out.print("아이디 : ");
        String m_id = scan.nextLine();
        System.out.print("비밀번호 : ");
        String m_pwd = scan.nextLine();

        String dbpwd = dao.selectPwd(m_id);

        if (m_pwd.equals(dbpwd)) {
            System.out.println("로그인 성공");
        } else {
            System.out.println("비밀번호 오류");
        }
    }
}

 

'JDBC' 카테고리의 다른 글

JDBC_3강(spr)  (0) 2022.11.01
JDBC_2강  (0) 2022.10.09