3 분 소요

DB와 JAVA 연결



JDBC(Java Database Connectivity) : 자바에서 DB 소프트웨어와 연결하여 프로그램을 개발하기 위해 사용하는 API로 JDBC Driver를 다운로드(https://dev.mysql.com/downloads/connector/j/) 받아 해당 개발환경(인텔리제이, 이클립스..)에 추가해야함. 추가되었다면 BD에 연결하는 코드를 알아보자.

// JDBC Driver를 로딩
        Class.forName("jdbc 드라이터 패키지명");
        Class.forName("com.mysql.cj.jdbc.Driver");
        
// JDBC와 DBMS 연결
        DriverManager.getConnection(주소, 아이디, 비밀번호);
        연결 성공  Connection 객체 생성
        주소 : jdbc:mysql://ip주소/db명?useSSL=SSL사용여부(true,false)
           ) jdbc:mysql://127.0.0.1/aiclass?useSSL=false
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class Jdbc1 {
    public static void main(String[] args) {
        String url = "jdbc:mysql://127.0.0.1/DB?useSSL=false";
        String userid = "root";
        String userpw = "0000";
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            // JDBC Driver를 로딩
            System.out.println("드라이버가 로드되었습니다.");
            Connection conn = DriverManager.getConnection(url,userid,userpw);
            // JDBC와 DBMS 연결
            System.out.println("MySQL에 정상적으로 연결되었습니다.");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
}
실행결과
드라이버가 로드되었습니다.
MySQL에 정상적으로 연결되었습니다.


위와 같이 연결이 된 것을 볼 수 있음. 이제는 연결된 DB를 인텔리제이를 활용하여 코드를 통해 DB의 데이터에 접근하는 방법을 알아보자.


Statement 인터페이스

Connection 클래스의 createStatement() 메소드로 호출

Statement 객체는 Statement 인터페이스를 구현한 객체

executeUpdate() 메소드를 통해 insert, update, delete SQL 구문을 실행 할 수 있음, 실행 후 몇개 성공했는지 알려줌

executeQuery() 메소드를 통해 select SQL구문을 실행할 수 있음


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

public class Jdbc2 {
    public static void main(String[] args) {
        String url = "jdbc:mysql://127.0.0.1/DB?useSSL=false";
        String userid = "root";
        String userpw = "0000";
        String sql = "insert into tb_member(mem_userid, mem_userpw, mem_name, " +
                "mem_hp, mem_email, mem_hobby, mem_ssn1, mem_ssn2, \n" +
                "mem_zipcode, mem_address1, mem_address2, mem_address3) values " +
                "('avocado' , '9999', '안가도', '010-9999-9999', 'avocado@avocado.com'," +
                "'드라이브', '001011','3068518','12345', '서울시 양천구 목동', '111-11','11111')";
//        System.out.println(sql);
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection conn = DriverManager.getConnection(url, userid, userpw);
            Statement stmt = conn.createStatement();
            int result = stmt.executeUpdate(sql);
            if (result >= 1) {
                System.out.println(result + "개의 레코드가 insert 되었음");
            } else {
                System.out.println("insert 가 실패되었음");
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
실행결과
1개의 레코드가 insert 되었음"

이미지


ResultSet 인터페이스

결과를 저장할 수 있는 객체로 저장된 값을 레코드(로우) 단위로 불러올 수 있음

레코드(로우) 단위로 데이터를 가져올 경우 타입을 지정하여 불러올 수 있음


PreparedStatement 인터페이스

Statement 와 PreparedStatement 의 차이는 캐시 사용 유무

객체를 캐시에 담아 재사용

반복적으로 쿼리를 수행한다면 statement에 비해 성능 좋음

Statement 는 보안상 취약점이 발견되었기 때문에 PreparedStatement 를 사용하는 것을 권고하고 있음

PreparedStatement 인터페이스는 Statement 인터페이스에 비해 보안상과 재사용 등등에서 여러 장점을 가지고 있어 PreparedStatement 인터페이스를 많이 사용함. 그럼 PreparedStatement 인터페이스 코드에 대해 알아보자.

    preparedStatement
    String sql = "insert into tb_member (mem_userid, mem_userpw, mem_name ...)" values
    (?,?,? ...)";
    pstmt = conn.preparedStatement(sql); // 컴파일
    pstmt.setString(1,mem_userid);
    pstmt.setString(2,mem_userpw);
    pstmt.setString(3,mem_name);
    ...
    pstmt.executeUpdate();

위 코드를 보면 sql변수에서 직접적으로 mem_userid, mem_userpw, mem_name …에 데이터를 입력하는 방법이 아닌 ?를 사용하여 추후에 대입하는 것을 볼 수 있음.


싱글톤 패턴

디자인 패턴중 하나로 매번 드라이버를 로드하지 않고 프로세스에서 객체를 단 하나만 만들어 재활용할 수 있도록 공유 자월을 생성하는 방법

싱글톤 패턴을 사용하여 BD에 연결하는 코드를 다른 클래스로 만들어 사용하고 싶을 때 사용할 수 있도록 해보자.

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{
        String url = "jdbc:mysql://127.0.0.1/DB?useSSL=false";
        String userid = "root";
        String userpw = "0000";
        Class.forName("com.mysql.cj.jdbc.Driver");
        conn = DriverManager.getConnection(url,userid,userpw);
        return conn;
    }
    public static void dbclose(){
        try{
            conn.close();
            conn = null;
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
}

이렇게 클래스를 구현해주고 필요할때 클래스를 호출하여 사용이 가능하다.

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class Jdbc6 {
    public static void main(String[] args) {
        System.out.println("****** 회원 목록******");
        StringBuilder sql = new StringBuilder();
        sql.append("select mem_idx, mem_userid, mem_name, mem_hp from tb_member");
        try {
            Connection conn = Dbconn.getConnection();
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql.toString());
            //ResultSet 인터페이스를 통해 레코드 단위로 데이터 호출
            while (rs.next()) {  // rs.next() 데이터 유무 확인
                int mem_idx = rs.getInt("mem_idx");
                String mem_userid = rs.getString("mem_userid");
                String mem_name = rs.getString("mem_name");
                System.out.println("번호 : " + mem_idx + ", 아이디 : " + mem_userid + ", 이름 : " + mem_name);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
실행결과
****** 회원 목록******
번호 : 1, 아이디 : apple, 이름 : 김사과
번호 : 2, 아이디 : banana, 이름 : 반하나
번호 : 3, 아이디 : orange, 이름 : 오렌지
번호 : 4, 아이디 : melon, 이름 : 이멜론
번호 : 5, 아이디 : berry, 이름 : 배애리
번호 : 6, 아이디 : cherry, 이름 : 최애리
번호 : 12, 아이디 : avocado, 이름 : 안가도

태그:

카테고리:

업데이트: