JDBC (Java DataBase Connectivity)

BrokenFinger98·2024년 9월 19일
0

JDBC(Java DataBase Connectivity)란?

  • 자바 프로그래밍 언어로 만들어진 클래스와 인터페이스로 이루어진 API로써 ANSI SQL (1999)를 지원
  • SQL문을 실행할 수 있는 함수 호출 인터페이스이다

JDBC 특징

  • DBMS 종류에 독립적인 자바 프로그래밍 가능
  • 데이터베이스가 달라지더라도 동일한 API를 사용하게 해준다 (드라이버 및 URL만 수정 하면 가능)
  • 자바가 가지는 플랫폼에 독립적이라는 특성과 DBMS에 독립적인 특성을 가진다

JDBC 기능

  • 데이터베이스에 연결 설정 한다
  • SQL문장을 DBMS에 전송한다
  • SQL문장 전송 후 결과를 처리할 수 있게 해준다

JDBC Interface

  • Database를 만드는 업체에게 제공되는 인터페이스
    • 업체에게 제공되는 인터페이스를 각각의 DBMS업체들이 구현해 놓은 것으로서 이것이 바로 드라이버이다
  • 프로그래머에게 제공되는 인터페이스
    • SQL 패키지가 제공하고 있는 라이브러리로서 프로그래머는 이 라이브러리를 기반으로 DB 프로그램을 작성할 수 있다

JDBC API : java.sql package

Driver (interface)

  • 드라이버에 대한 정보를 가지고 있다
  • 모든 드라이버가 반드시 구현해야 하는 인터페이스
  • 드라이버의 버전이나 연결에 대한 정보를 알아볼 수 있는 메소드를 가지고 있다
  • Java Platform, Standard Edition 8 API Specification

Connection (interface)

  • 데이터베이스에 대한 하나의 세션을 표현한다.
    • 세션은 하나의 클라이언트가 서버에 요청을 하기 위해 연결을 맺은 상태를 의미한다
  • DriverManager 클래스의 getConnection() 메소드를 이용하여 얻어 올 수 있다
  • 디폴트로 setAutoCommit(true)로 설정된다
  • 개발자가 원하는 경우에 commit을 해주고 싶거나 트랜잭션이 아주 중요한 부분에 있어서 RollBack 처리를 하고자 할 경우에는 setAutoCommit(false)로 설정한다
    • 단, 이 경우에는 SQL문을 수행할 후 명시적으로 commit() 을 호출해야 한다

Statement (interface)

  • SQL문장을 실행하고 그것에 대한 결과 값을 가져오기 위해 사용한다
  • public boolean execute(String sql) throws SQLException
    • 특별히 SQL문을 구분하지 않고 DML (delete, update, insert), Query (select), DDL (create, drop)등을 수행할 수 있다.
    • 결과가 ResultSet이면 true이고 결과가 DML이거나 특별한 결과가 없으면 false를 리턴한다
  • public ResultSet executeQuery (String sql) throws SQLException
    • Select를 처리할 때 사용한다
  • public int executeUpdate (String sql) throws SQLException
    • 주로 DML (delete, update, insert)등의 SQL을 수행할 때 사용한다
    • 영향을 받은 행 수 리턴

PreparedStatement (interface)

  • 동일한 SQL 문장이 여러 번 반복적으로 수행될 때 사용하는 객체
  • 대용량의 문자나 바이너리 타입의 데이터(이미지나 사운드 등)를 저장하기 위해서도 사용될 수 있다
  • SQL 문장이 미리 컴파일 되어 PreparedStatement 객체에 저장된다
  • 여러 번 반복 수행 시 clearParameters() 메소드를 이용해 Statement에 남겨진 값을 초기화 한다
  • public ResultSet executeQuery () throws SQLException
    • Select를 처리할 때 사용한다
  • public int executeUpdate () throws SQLException
    • 주로 DML (delete, update, insert)등의 SQL을 수행할 때 사용한다
    • 영향을 받은 행 수 리턴

CallableStatement (interface)

  • 데이터베이스에 대하여 실제 SQL문을 실행하는 것이 아니라 Stored Procedures를 호출한다
  • Stored Procedures란 연속되는 SQL문으로 데이터베이스에 저장해 두고 마치 함수의 호출처럼 사용한다
  • 데이터베이스에 Stored Procedures를 만들어 두고 자바에서 호출하여 사용할 수 있게 한다
  • Stored Procedures 사용 시 속도의 향상을 기대할 수 있고, 자바 코드에 SQL문장이 들어가지 않으므로 자바 코드가 SQL에 독립적이다

ResultSet (interface)

  • 쿼리에 대한 결과값 처리
  • ResultSet 객체의 커서는 첫번째 레코드보다 바로 이전을 가리킨다
  • next()
    • ResultSet 객체의 커서를 이동
  • getXXX (index or name) 메소드를 이용하여 데이터를 얻을 수 있다
    • getString(index or name);
    • getInt(index or name);
    • getDate(index or name);

JDBC Programming 개발 순서

  1. JDBC Driver Loading
  2. DBMS와 연결 (Connection 생성)
  3. SQL 실행 준비 (Statement, PreparedStatement 생성)
  4. SQL 실행
    • DML (insert, update, delete)
    • Query (select)
  5. DBMS 연결 끊기

1. JDBC Driver Loading

  • 데이터베이스와의 접속을 오픈 하기 위해 애플리케이션의 JVM안으로 특정 드라이버 클래스 적재
  • Class.forName(”Driver ClassName”);
  • 각 DataBase별 Driver Class
    • MySQL : com.mysql.cj.jdbc.Driver
    • Oracle : oracle.jdbc.driver.OracleDriver
    • MSSQL : com.microsoft.sqlserver.jdbc.SQLServerDriver

2. DBMS와 연결 (Connection 생성)

  • DriverManager 클래스를 이용하여 URL형태로 주저진 데이터베이스에 대한 접속을 요청
  • Connection con = DriverManager.getConnection(URL, dbid, dbpassword);
  • JDBC URL은 드라이버 고유의 방식으로 개별적인 데이터베이스를 식별
    • MySQL : jdbc:mysql://HOST:PORT/DBNAME[?param1=value1&parma2=value2&…]
    • Oracle : jdbc:oracle:thin:@HOST:PORT:SID
    • MSSQL : jdbc:sqlserver://HOST:PORT;databaseName=DB

3. SQL 실행 준비 (Statement, PreparedStatement 생성)

  • String sql = “insert, update, delete, select, …”;
  • Statement 생성
    • Statement stmt = conn.createStatement();
  • PreparedStatement 생성
    • PreparedStatement pstmt = conn.prepareStatement(sql);

4. SQL 실행 (executeUpdate, executeQuery)

  • Statement
    • DML
      • int cnt = stmt.executeUpdate(sql);
    • Select
      • ResultSet rs = stms.excuteQuery(sql);
  • PreparedStatement
    • sql문의 치환변수(?) 값 설정
      • pstmt.setXXX(index, value);
    • DML
      • int cnt = pstmt.executeUpdate();
    • Select
      • ResultSet rs = pstmt.executeQuery();
  • ResultSet
    • ResultSet을 얻어온 후 rs.next()를 실행해야 한다
      • select의 결과가 반드시 하나가 나오는 경우 : rs.next();
      • select의 결과가 하나 또는 못 얻어 오는 경우 : if(rs.next());
      • select의 결과가 여러 개가 나올 수 있는 경우 : while(rs.next()) {};
    • 값 얻기
      • String str = rs.getString(index or name);
      • int cnt = rs.getInt(index or name);

5. DBMS 연결 끊기

  • 모든 작업이 끝난 경우에는 ResultSet, Statement(PreparedStatement), Connection 객체의 close() 메소드를 이용하여 작업을 종료한다 (연결한 순의 역순으로 종료)
  • Connection 은 상당한 Overhead를 가져온다. 따라서 최적회된 상태를 유지하기 위해서는 반드시(finally) Connection을 닫아 주어야 한다
    • rs.close();
    • pstms.close();
    • conn.close();
  • Try ~ with ~ resources
    • AutoCloseable 구현체에 한정
profile
나는야 개발자

0개의 댓글