본문 바로가기
JAVA/JAVA 기초

JDBC

by 도쿠니 2022. 5. 17.

JDBC

JDBC란?

  • Java Database Connectivity
  • 자바에서 데이터베이스를 연결해주는 자바 API

준비물

JDBC 순서

  1. JDBC 드라이버 로드
    • Class.forName(”드라이버 경로”)
      • Java Reflection에서 제공하는 기능 중 하나
      • JVM에 파라미터로 주어진 이름과 같은 클래스를 JVM에 로딩시킨다.
      • 드라이버 경로는 벤더별로 드라이버가 저장된 경로가 다르기 때문에 확인해보고 사용
        • MariaDB : org.mariadb.jdbc.Driver
        • MySQL : com.mysql.cj.jdbc.Driver
        • Oracle : oracle.jdbc.driver.OracleDriver
  2. DB Connection 생성
    • DriverManager.getConnection(”url”,”id”,”password”)
      • DriverManager
        • DB 드라이버들을 관리,로딩하고, DB에 연결을 책임지는 클래스
        • 사용할 드라이버는 드라이버 매니저가 드라이버를 구동하기 전에 등록되어야 한다.
          • new Driver() 없이도 DriverManager가 드라이버를 구동할 수 있는 이유는 Class.forName으로 드라이버를 로드할 때, 이미 DriverManager에 등록되기 때문이다.

Drive 클래스 내부 코드

  1. SQL을 위한 Statement 객체 생성
    • Statement
      • 쿼리를 담아 전달한 그릇
      • 종류
        • Statement
          • 단일로 사용할 때 빠른 속도를 지님
          • 매번 컴파일을 수행해야 함
          • 쿼리에 인자를 부여할 수 없음
          • 취약점이 있어서 사용하지 않는 것이 권고되어짐
          • String sql = "SELECT name, class FROM player"; Statement stmt = conn.createStatement(); ResultSet rs = s.executeQuery(sql);
        • PreparedStatement
          • 주로 사용하는 statement
          • 여러번 수행될 때 빠른 속도를 지님
          • 처음 프리 컴파일 된 후, 컴파일을 수행하지 않음
          • 쿼리에 인자 부여 가능 ( = 동적 쿼리 가능)
            • sql문에 ?를 이용해서 setXXX()를 통해 원하는 값을 넣을 수 있음
            • ?는 앞에서부터 1,2,3~ 으로 인덱스를 가짐
            String sql = "UPDATE player SET name = ?, position = ? where name = ?; ";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "토리");
            pstmt.setString(2, "공격수");
            pstmt.setString(3, "초코");
            
            ps.executeQuery();
        • CallableStatement
          • PreparedStatement + 프로시저 호출 가능
  1. SQL 문장 실행
    • Execute
      • execute()
        • 모든 구문 수행 가능
        • Boolean 값 반환
          • 쿼리 수행 결과가 ResultSet 일 경우 true, 아닐 경우 false
      • executerQuery()
        • 쿼리 수행 결과를 ResultSet에 담아서 반환
        • 주로 Select 문에 사용
      • executeUpdate()
        • INSERT, UPDATE, DELETE 나 CREATE, DROP 등을 실행하는데 사용
        • 영향을 받은 행 수를 반환
  2. SQL 실행 결과 처리
    • ResultSet
      • 검색 결과를 테이블 형식으로 저장한 인스턴스
      • 데이터가 여러행일 경우 한번에 가져올 수 없기 때문에, 내부적으로 커서를 이용해서 가져온다.
        • ResultSet.next()
          • 커서를 다음행으로 이동하는 메소드
          • 반환값은 Boolean (커서 위치에 처리할 행이 있으면 true, 없으면 false)
        • ResultSet.getXXX(int 컬럼 위치), ResultSet,getXXX(String 컬럼명)
          • 커서 위치의 값을 반환하는 메소드
          • 보통 컬럼명을 매개변수로 하는 것을 사용한다.
  3. JDBC 객체 연결 해제
    • ResultSet 해제
    • Statement 해제
    • Connection 해제

예시

import java.sql.*;

public class JDBC {
    public static void main(String[] args) {
        String url = "jdbc:mariadb://localhost:3306/practice";
        String user = "admin";
        String password = "test";

        try {
            // 1. 드라이버 로드
            Class.forName("org.mariadb.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        // 도중에 오류 등으로 try문이 종료되더라도 finally에서 jdbc객체들을 해제할 수 있도록 외부에서 객체를 미리 선언
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            // 2. Connection 객체 생성
            conn = DriverManager.getConnection(url, user, password);

            // 3. Statement 객체 생성
            String sql = "SELECT * FROM player WHERE position = ?;";
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1, "공격수");

            // 4. 쿼리 실행
            rs = pstmt.executeQuery();

            // 5. 결과 수행
            while (rs.next()) {
                String name = rs.getString("name");
                String pos_name = rs.getString("position");
                System.out.println(name + " / " + pos_name);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                // 6. JDBC 객체 연결 해제
                if (rs != null && !rs.isClosed()) {
                    rs.close();
                }

                if (pstmt != null && !pstmt.isClosed()) {
                    pstmt.close();
                }

                if (conn != null && !conn.isClosed()) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}

'JAVA > JAVA 기초' 카테고리의 다른 글

JDBC) 대량 쿼리문 실행 for SQLite  (0) 2022.05.21
자바 8 람다를 이용한 다중 조건 정렬  (0) 2022.04.07
스트림 (Stream)  (0) 2022.03.29
람다식  (0) 2022.03.29
컬렉션 프레임워크 (Collection Framework)  (0) 2022.03.29

댓글