본문 바로가기
JAVA

JAVA(MySQL연동, JDBC)

by 글로리. 2020. 6. 23.

JDBC(Java Database Connectvity)

- 자바 프로그램 내에서 데이터베이스 시스템의 종류에 구애 받지 않고 질의문(SQL)을 실행하기 위한

  표준 데이터베이스 인터페이스
- 데이터베이스 및 어플리케이션 개발자들을 위한 표준 API 제공하는 라이브러리
- MySQL의 JDBC는 자바를 이용해서 MySQL 서버에 연결하고 SQL을 처리하기 위한 API 제공.

데이터베이스 접속, 해제 처리 절차

접속정보 설정 -> 접속 -> 접속실패 여부 검사 -> 접속 해제

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

public class Main01 {
    public static void main(String[] args) {
        // 데이터베이스에 접속하기 위한 정보 정의하기
        String db_hostname = "DB서버 접속 주소";
        int db_portnumber = 포트번호;
        String db_database = "데이터베이스이름";
        String db_charset = "케릭터 셋";
        String db_username = "계정이름";
        String db_password = "계정비밀번호";

        // null로 초기화 한다.
        Connection conn = null;

        /** 데이터베이스 접속 처리 */
        // 사용하려는 데이터베이스명을 포함한 URL기술
        // -> jdbc:mysql://localhost:3306/myschool?characterEncoding=urf8&serverTimezone=UTC
        String urlFormat = "jdbc:mysql://%s:%d/%s?characterEncoding=%s&serverTimezone=UTC";
        String url = String.format(urlFormat, db_hostname, db_portnumber, db_database, db_charset);

        // MySQL JDBC의 드라이버 클래스를 로딩해서 DriverManager클래스에 등록한다.
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");

            // DriverManager 객체를 사용하여 DB에 접속한다.
            // -> 접속 URL, 아이디, 비밀번호를 전달
            // -> DriverManager에 등록된 Driver 객체를 사용하여 DB에 접속 후,
            // Connection 객체를 리턴받는다
            // -> import java.sql.DriverManager 필요함
            conn = DriverManager.getConnection(url, db_username, db_password);

            // 성공시 메시지 출력
            System.out.println("=== DATABASE Connerct Success ===");

        } catch (ClassNotFoundException e) {            
            // 실패시 메시지와 에러 내용 출력
            System.out.println("=== DATABASE Connerct Fail ===");
            System.out.println(e.getMessage());

        } catch (SQLException e) {
            // 실패시 메시지와 에러 내용 출력
            System.out.println("=== DATABASE Connect Fail ===");
            System.out.println(e.getMessage());
        }

        /** 데이터베이스 접속 해제 처리 */
        try {
            conn.close();
            System.out.println(" === DATABASE Disconnect Success ===");
        } catch (Exception e) {
            System.out.println(" === DATABASE Disconnect Fail ===");
            System.out.println(e.getMessage());
        }
        conn =null;
    }

}

접속, 해제 처리의 모듈화

반복적으로 나타나는 코드

- 거의 대부분의 프로그램들은 데이터베이스와의 연동을 필요로 하기 때문에 모든 프로그램의 시작과 끝에서는 데이터베이스 접속/해제 처리가 적용되어야 한다.

재사용을 필요로 하는 코드의 재사용

- 프로그램을 개발하는 과정에서 같은 코드가 두 번 이상 반복된다면, 해당 내용을 별도의 파일에 SingleTon 클래스로 묶어 호출하는 형태로 코드를 재사용 가능.

DBHelper 제작

package study.java.helper;

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

public class DBHelper {

    private static final String db_hostname = "DB서버 접속주소";
    private static final int db_portnumber = 포트번호;
    private static final String db_database = "데이터베이스이름";
    private static final String db_charset = "케릭터 셋";
    private static final String db_username = "계정이름";
    private static final String db_password = "계정비밀번호";

    private Connection conn = null;

    // ----- 싱글톤 객체 생성을 위한 준비 시작 -----
    // 싱글톤 객체
    private static DBHelper current;

    public static DBHelper getInstance() {
        if (current == null) {
            current = new DBHelper();
        }

        return current;
    }
    public static void freeInstance() {
        current = null;
    }

    private DBHelper() {}

    // ----- 싱글톤 객체 생성을 위한 준비 끝 -----

    /** 데이터베이스에 접속 후, 접속 객체 리턴 */
    public Connection open() {
        // 중복 실행될 경우 발생될 문제를 방지하기 위해
        // Connection 객체가 null인 경우만 처리하도록 if문으로 구성
        if (conn == null) {
            /** 데이터베이스 접속 처리 */
            // 사용하려는 데이터베이스명을 포함한 URL기술
            // -> jdbc:mysql://localhost:3306/myschool?characterEncoding=urf8&serverTimezone=UTC
            String urlFormat = "jdbc:mysql://%s:%d/%s?characterEncoding=%s&serverTimezone=UTC";
            String url = String.format(urlFormat, db_hostname, db_portnumber, db_database, db_charset);

            // MySQL JDBC의 드라이버 클래스를 로딩해서 DriverManager클래스에 등록한다.
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");

                // DriverManager 객체를 사용하여 DB에 접속한다.
                // -> 접속 URL, 아이디, 비밀번호를 전달
                // -> DriverManager에 등록된 Driver 객체를 사용하여 DB에 접속 후,
                // Connection 객체를 리턴받는다
                // -> import java.sql.DriverManager 필요함
                conn = DriverManager.getConnection(url, db_username, db_password);

                // 성공시 메시지 출력
                System.out.println("=== DATABASE Connerct Success ===");

            } catch (ClassNotFoundException e) {            
                // 실패시 메시지와 에러 내용 출력
                System.out.println("=== DATABASE Connerct Fail ===");
                System.out.println(e.getMessage());

            } catch (SQLException e) {
                // 실패시 메시지와 에러 내용 출력
                System.out.println("=== DATABASE Connect Fail ===");
                System.out.println(e.getMessage());
            }

        }
        return conn;
    }

    /** 데이터베이스의 접속을 해제 */
    public void close() {
        if (conn != null) {
            /** 데이터베이스 접속 해제 처리*/
            try {
                conn.close();
                System.out.println(" === DATABASE Disconnect Success ===");
            } catch (Exception e) {
                System.out.println(" === DATABASE Disconnect Fail ===");
                System.out.println(e.getMessage());
            }
            conn =null;
        }
    }
}

데이터 입력, 수정, 삭제

데이터 입력, 수정, 삭제 처리 절차

  • 접속 및 결과 검사
    • DBHelper활용
    • open()메서드의 리턴값에 따라서 접속 성공/실패 여부 검사.
    • 접속에 실패한 경우 사용자에게 페이지에서 에러가 발생했음을 알림.
  • SQL구분 작성 및 실행
    • insert, update, delete SQL문을 변수에 저장
    • SQL 구문 실행
  • 결과 에러 검사
    • SQL 구문을 실행하는 과정에서 적용된 예외처리 구문을 통해 에러 감지.
    • 이 과정에서 에러가 발생하면 대부분 SQL문 에러.
  • 결과값 추출
    • insert, update, delete의 결과 행이 몇 건인지를 추출 가능.
  • 접속 해제
    • DBHelper의 close()함수 활용.

예제 1)

department 테이블에 학과번호 300, 학과이름 컴퓨터정보과, 위치 5호관 내용 추가

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import study.java.helper.DBHelper;

public class Main02 {  
public static void main(String\[\] args) {  
// 수정, 삭제는 SQL문을 수정, 삭제하는 SQL문으로 수정하면 된다.  
// 'department' 테이블에 '컴퓨터정보과'추가를 위한 SQL문  
String sql = "insert into department (deptno, dname, loc) values (300, '컴퓨터정보과', '5호관')";

    /** DBHelper를 통한 DB 접속 처리 */
    DBHelper db = DBHelper.getInstance();
    Connection conn = db.open();

    /** SQL 구문 실행하기 */
    // SQL문을 실행할 수 있는 객체
    Statement stmt = null;
    // 결과값 (저장된 데이터의 수)
    int result = 0;

    try {
            // SQL문을 실행할 수 있는 객체 생성 (예외처리 요구됨)
            stmt = conn.createStatement();
            // SQL문 실행하기 --> 결과 행 리턴된 (예외처리 요구됨)
            result = stmt.executeUpdate(sql);
    } catch (SQLException e) {
        System.out.println("MySQL SQL Fail: " + e.getMessage());                
    } finally {
        // SQL구문의 에러여부에 상관없이 stmt 객체를 닫기 위해 finally 블록 사용.
        // --> 객체의 유효범위 설정을 위해 stmt 객체는 try 블록 밖에 선언됨.
        if (stmt != null) {
            // 객체 닫기
            try {
                stmt.close();
            } catch (SQLException e) { }
        }
    }        
    // 결과출력
    System.out.println(result + " Record Insert");

    /** DB 접속 해제 */
    db.close();        
    }
}

단일행, 다중행 데이터 조회

단일행 조회 처리 절차

  • 접속 및 결과 검사
    • DBHelper활용
    • open()메서드의 리턴값에 따라서 접속 성공/실패 여부 검사.
    • 접속에 실패한 경우 사용자에게 페이지에서 에러가 발생했음을 알림.
  • SQL구분 작성 및 실행
    • insert, update, delete SQL문을 변수에 저장
    • SQL 구문 실행
  • 결과 에러 검사
    • SQL 구문을 실행하는 과정에서 적용된 예외처리 구문을 통해 에러 감지.
    • 이 과정에서 에러가 발생하면 대부분 SQL문 에러.
  • 결과 처리
    • 조회된 데이터를 읽기 위해 ResultSet의 커서를 이동시킨다.
  • 결과값 추출
    • insert, update, delete의 결과 행이 몇 건인지를 추출 가능.
  • 접속 해제
    • DBHelper의 close()함수 활용.

예제

'JAVA' 카테고리의 다른 글

JAVA(이것저것)  (0) 2021.01.12
JAVA(DAO패턴)  (0) 2020.06.24
JAVA(fileIO, JSONObject)  (0) 2020.06.16
JAVA(예외처리, 날짜처리, 컬렉션)  (0) 2020.06.15
JAVA (Static, 익명클래스)  (0) 2020.06.11

댓글