본문 바로가기
프로그래밍 언어/데이터베이스

데이터베이스 Day5 - Java + DB 연동(1)

by Hyeon_ 2021. 11. 24.

Java + DB 연동

JDBC(Java Database Connectivity)

  • 다양한 종류의 관계형 데이터베이스에 접근할 때 사용되는 자바 표준 SQL 인터페이스
  • 자바 프로그램이 DBMS에 접근하여 작업할 수 있게 해주는 API를 제공하는 클래스 모음
  • 모든 DBMS에서 공통적으로 사용할 수 있는 인터페이스와 클래스로 구성
  • 실제 구현 클래스는 각 DBMS 벤더가 구현했기 때문에 거의 모든 벤더가 JDBC 드라이버 제공
  • 각 DBMS에 맞는 JDBC 드라이버 사용

JDBC 드라이버

  • JDBC 인터페이스를 구현한 클래스 파일 모음(jar 파일)
  • 각 DBMS 벤더에서 제공되는 구현 클래스

JDBC의 역할

  • 응용프로그램과 DBMS 사이에서 연결역할
  • SQL문을 DBMS에 전달하고 그 결과값을 응용프로그램에 전달하는 역할

JDBC 사용 시의 장점

  • 사용하는 RDBMS에 독립적인 프로그래밍 가능
  • 쉽게 RDBMS의 교체가 가능
  • 자바에서는 단순히 문자열로 쿼리 전달, 해석은 각 벤더가 구현한 드라이버가 담당
    • 표준 SQL 뿐만 아니라 각 JDBC Driver를 제공하는 DBMS 벤더별로 최적의 성능 발휘 가능
    • 벤더 종속적인 SQL도 처리 가능

MySQL JDBC 드라이버 다운로드

  • MySQL Communitiy Download : Connector/J
  • Platform Independent 선택
  • mysql-connector-java-8.0.27.zip [Download]

MySQL JDBC 드라이버 사용하기 위한 작업

  1. 압축 해제하고 jar 파일 복사해서 lib 폴더에 저장
    • mysql-connector-java-8.0.27.zip 압축해제
    • mysql-connector-java-8.0.27.jar 복사해서 D:\hyeonji\JAVA\lib폴더에 저장
  2. 이클립스 자바 프로젝트 생성하고 Java Build Path에 라이브러리 추가
    • 이클립스에 JavaProject 생성: DBTest
    • Properties
    • Java Build Path
    • Libraries 탭
    • ModulePath에서 [Add External JARS..] 선택
    • mysql-connector-java-8.0.27.jar 찾아서 선택

JDBC를 이용한 연결 과정

  1. 드라이버 로드
  2. Connection 객체 생성
  3. Statement 또는 PreparedStatement 생성
  4. 쿼리 수행 (sql문 실행)
  5. SQL 문에 결과 반환이 있는 경우 ResultSet 객체 생성(결과 받아옴)
  6. 모든 객체 close() : 반환 순서
    • ResultSet
    • Statement
    • Connection (접속 종료)

패키지 import

  • JDBC는 java.sql 패키지에 포함되어 ㅣㅇㅆ음
  • import는 java.sql.DriverManager;
  • import java.sql.Connection; ....
  • JDBC는 데이터베이서 접속 위해 한 개의 클래스 java.sql.DriverManager와 두 개의 인터페이스(java.sql.Driver / java.sql.Connection) 사용

1. JDBC 드라이버 로드

  • Java에서 MySQL Driver 사용하기 위해 드라이버를 JVM에 로딩하는 과정
  • Class.forName("com.mysql.cj.jdbc.Driver");

2. Connection 객체 생성

  • DriverManager 클래스의 static 메서드인 getConnection( )메서드를 이용해서 Connection 객체 얻어옴
  • MySQL 서버 실제 연결
  • Connection 객체가 생성되면 DBMS 접속 성공
  • DriverManager.getConnection(String url, String user, String password)
// 연결 주소, 사용자 계정, 패스워드 문자열로 설정
String url = "jdbc:mysql://localhost:3306/sqldb6?serverTimezone=UTC";
String user = "root";
String pwd = "1234";

Connection con = DriverManager.getConnection(url,uwer,pwd);
  • jdbcLmysql: JDBC 드라이버
    • jdbc: JDBC URL의 프로토콜 이름
    • mysql: MySQL JDBC 드라이버
  • localhost: MySQL이 설치된 IP(호스트 이름)
    • localhost 또는 127.0.0.1: 내 컴퓨터
    • 192.168.172.1: 서버IP (현재 내 컴퓨터의 Workbench에서 서버 접속해서 사용)
  • 3306: MySQL 접속 포트
  • sqldb6: 사용하는 데이터베이스 이름
  • serverTimezone = UTC

3. Ststement 객체 생성

  • 쿼리문 전송을 위한 Statement 객체 생성
  • 또는 PreparedStatement
  • Connection 인터페이스의 createStatement( ) 메서드를 사용해서 객체 생성
  • PreparedStatement pstmt = con.preparedStatement(sql);
  • PreparedStatement 객체를 통해 SQL 전송 가능

4. 쿼리 수행

  • SQL 전송에 사용되는 메서드
    • excuteQuery( ) / excuteUpdate( )
  • 2가지로 구분하는 이유: sql 문 실행 결과가 다르기 때문
  • excuteUpdate()
    • 쿼리문이 insert / update / delete 구문인 경우 사용
    • 영향을 받은 행의 수 반환
  • excuteQuery( )
    • select 구문의 경우
    • ResultSet 객체로 변환(select문 결과에 해당되는 여러 행 반환)
    • ResultSet에서 데이터 추출
    • next( ) 메서드를 이용해서 논리적 커서를 이동해가며 각 열의 데이터를 바인딩해옴
    • rs.next( ) 호출 결과 true이면 반복해서 다음 행 데이터 가져옴
      • cursor: 다음 열로 이동
      • next( ): 다음 행으로 이동
      • 정수: getInt("bookPrice");
      • 문자: getString("bookName");

6. 모든 객체 close( ): 자원 반납

  • ResultSet
  • Statement
  • Connection(접속 종료)

실습

  • DBProject
    • DBConnect.java : DB 연결
    • BookSelectEx.java : DB 연결+ 해당 작업 수행
    • BookInsertEx.java : DB 연결+ 해당 작업 수행
    • BookInputInsert.java : DB 연결+ 해당 작업 수행
    • BookUpdateEx.java : DB 연결+ 해당 작업 수행
    • BookDeleteEx.java : DB 연결+ 해당 작업 수행
  • 프로젝트명: DBTest
  • 패키지명: db1
  • 클래스
    • DBConnecton.java
    • BookInsertEX.java
  • DBConnect 생성
package db1;

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

public class DBConnet {
    public static void main(String[] args) {
        try {
            //JDBC Driver 클래스의 객체 생성 런타임시 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 연결 주소, 사용자 계정, 패스워드 문자열 설정
            String url = "jdbc:mysql://localhost:3306/sqldb3?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            // DB 연결하기 위한 객체 생성
            // DriverManager를 통해 Connection 객체 생성
            // MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
            Connection con = DriverManager.getConnection(url, user, pwd);

            // Connection 객체가 생성되면 DB 연결 성공
            if(con != null) {
                System.out.println("DB 연결 성공!");
            }

        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }
    }

}
  • BookInsertEX.java 생성
package db1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;

public class BookSelectEx {
    public static void main(String[] args) {
        try {
            //JDBC Driver 클래스의 객체 생성 런타임시 로드
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 연결 주소, 사용자 계정, 패스워드 문자열 설정
            String url = "jdbc:mysql://localhost:3306/sqldb3?serverTimezone=UTC";
            String user = "root";
            String pwd = "1234";

            // DB 연결하기 위한 객체 생성
            // DriverManager를 통해 Connection 객체 생성
            // MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
            Connection con = DriverManager.getConnection(url, user, pwd);

            // Connection 객체가 생성되면 DB 연결 성공
            if(con != null) {
                System.out.println("DB 연결 성공!");
            }

            // DB 연결 성공 후 SELECT 작업

            // SELECT 쿼리문 문자열 생성
            String sql = "select * from book order by bookNo";

            // 쿼리문 전송을 위한 PreparedStatement 객체 생성
            // Connection 인터페이스의 prepareStatement() 메소드를 사용하여 객체 생성
            PreparedStatement pstmt = con.prepareStatement(sql);

            // 쿼리문 실행시키고 결과 받아옴
            // select 구문이므로 excuteQuery() 메소드 사용
            // 반환되는 결과는 ResultSet 객체가 받음
            ResultSet rs = pstmt.executeQuery(sql);

            // 제목 출력
            System.out.println("\n도서 정보 조회");
            System.out.println("도서번호 \t\t\t 도서명 \t\t\t\t\t\t 저자 \t\t 가격 \t\t 발행일 \t 재고 \t 출판사번호");

            // executeQuery() 실행 결과 받아온 ResultSet에서 데이터 추출
            // ResultSet의 next() 메서드를 이용해서 논맂거 커서를 이동해 각 열의 데이터 바인딩해옴
            // next(): 커서를 이동하면 다ㅡㅇㅁ 행 지정
            // 다음 행이 있으면 true, 없으면 false 반환
            while(rs.next()) {
                // (1) 한 행씩 next 하면서 데이터를 가져와 변수에 저장
                String bookNo = rs.getString(1);
                String bookName = rs.getString(2);
                String bookAuthor = rs.getString(3);
                int bookPrice = rs.getInt(4);
                Date bookData = rs.getDate(5);
                int bookStock = rs.getInt(6);
                String pubNo = rs.getString(7);

                // (2) 한 행씩 변수 출력
                System.out.format("%-10s\t %-25s\t %-5s %10d %13s \t%3d %10s\n",
                        bookNo, bookName, bookAuthor, bookPrice, bookData, bookStock, pubNo);
            }

            // 모든 객체 close
            rs.close();
            pstmt.close();
            con.close();


        } catch (Exception e) {
            System.out.println("오류 발생!");
            e.printStackTrace();
        }


    }
}