본문 바로가기
Dev/DB

JDBC(Java Database Connectivity) API실습

by 컴포넌트설계자 2026. 3. 9.

JDBC(Java Database Connectivity) API

java.sql* import 해야한다.

JDBC (Java Database Connectivity)란?
→ 자바에서 데이터베이스에 접근하기 위한 표준 API.
→ 다양한 DBMS(MySQL, Oracle, PostgreSQL 등)와 독립적으로 동작할 수 있게 해줌.

JDBC는 드라이버 매니저(DriverManager)를 통해 데이터베이스 벤더가 제공하는 드라이버를 로드하고, SQL 실행을 가능하게 함.

데이터베이스 제조사들이 구현한 구현체 .jar = driver
인터페이스장점 구현체를 바꾸기 수월하다 - 드라이버만 바꾸면 된다. 

repository = DAO
영속성 3tier  - presetation / service / persistence 

JDBC 아키텍처

1) JDBC API
   : DriverManager, Connection, Statement, ResultSet 등의 인터페이스 제공
   4개 인터페이스를 통해서 외부와 연결한다. 

2) JDBC Driver
   : DB 벤더(예: MySQL, Oracle)가 제공하는 실제 구현체

3) 드라이버 종류
   Type 1: JDBC-ODBC Bridge (거의 사용 X)
   Type 2: Native API Driver
   Type 3: Network Protocol Driver
   Type 4: Thin Driver (순수 자바 기반, 가장 많이 사용)

- import java.sql.*;

DB연동 순서

1) 로드 - 접속하려는 데이터베이스 제품 선택 (이때 각 DB에 따른 Driver ~.jar 찾는다)

  Class.forName("연결하려는드라이버명");
    : 드라이버명이 오류이거나 ~.jar 가 없으면  ClassNotFonudExecption발생

    Oracle : oracle.jdbc.driver.OracleDriver 
    Ms_Sql : sun.jdbc.odbc.JdbcOdbcDriver 
    My_Sql : com.mysql.cj.jdbc.Driver

오타가 나면 ClassNotFoundException 발생 

2) 연결 - 데이터베이스의 계정으로 접속하는 것.(url , user, password 필요)

    Connection con = DriverManager.getConnection(String url, String user, String pass);

       --url종류 
    jdbc:oracle:thin:@localhost:1521:SID
    jdbc:odbc:odbc설정을통해만든db원본명 
    jdbc:mysql://localhost:3306/db명 

      # MY_SQL
     jdbc:mysql://localhost:3306/cloud_db?serverTimezone=UTC
     jdbc:mysql://localhost:3306/cloud_db?serverTimezone=Asia/Seoul

연결이 안되면 sqlexception이 난다.

3) 실행 -  CRUD 문장 실행(DDL,DML)

PreparedStatement가 Statement 방식을 상속받았기 때문에 preparedStatement 방식을 주로 씀

 DDL DML 어떤 쿼리에 따라서 리턴 type이 달라진다.
- select는 resultset로만 받음 - select전용 
- update, insert, delete 는 excute int로 받음 : 0 실패 1 성공
   컬럼명 커서가 놓여져 있다. 

 1. Statement방식
 2. PreparedStatement방식 - 권장 ( Statement를 상속) ,  보안

    1의 경우 - Statement방식
        Statement st = con.createStatement( );
         *DDL , DML 인경우
          int result = st.executeUpdate(String sql);
           -결과 result가 0이면 실패, 1이상이면 성공  / 제약조건위배, 길이제한, 쿼리오류이면 SQLExeception 발생

          * select전용
           ResultSet rs = st.executeQuery(String sql);
           ex)  ResultSet rs = st.executeQuery("select empno, ename, hiredate from emp");
              
               // boolean b = rs.next();//커서를 한행 앞으로 이동 
                
                List<Emp> list = new ArrayList<>();
                while( rs.next() ){//앞으로 커서가 이동한다면 
                      //열을 이동하면서 데이터 조회 - getType(컬럼명) , getType(컬럼index)
                     int empno =  rs.getInt("empno"); //1  컬럼 열 숫자로 받아도 된다. 
                    String ename = rs.getString("ename");//2
                    String hiredate = rs.getString(3);//3
                     Emp emp = new Emp(empno, enam, sal);
                    list.add(emp);
               }

커서를 밑으로 내리는건 next()로 사용하고 rs.next() 커서를 앞으로 한칸 이동할 수 있다면 내려라, 있다면 true, false 이므로 결과는 boolean형이다. 

다시 7499로 내려가야되니까 어딘가에 담아야한다. 하나의 객체를 어딘가에 담아야 한다. 
Emp emp = new Emp(empno, enam, sal);
list.add(emp); 
=> vo dto에 담아야 한다. 
=> 여러개니까 list로 담아야 한다. List<Emp> list = new ArrayList<>(); 제네릭으로 emp 담고 add로 추가한다.get으로 꺼내고 add로 담고 과정을 반복한다. 

 2.의 경우 - PreparedStatement방식
       PreparedStatement ps = con.prepareStatement(String sql);
        ex)  String sql ="insert into emp(empno, ename, job, sal, hiredate) values(?,?,?,?,now())";
          PreparedStatement ps = con.prepareStatement(sql);
          //?의 개수만큼 순서대로  ps.setType(index , value) 설정이 필요하다.
          ps.setInt(1, emp.getEmpNo() );
          ps.setString(2, emp.getEname() );
          ps.setString(3, emp.getJob() );
          ps.setInt(4, emp.getSal() );

          int result = ps.executeUpdate( );

         //select인경우
        ex)  String sql ="select * from emp";
          PreparedStatement ps = con.prepareStatement(sql);
          ResultSet rs = ps.executeQuery();



4) 닫기  -사용된 객체를 반납( close한다)

 사용한 객체를 닫는다.
         ex) Connection , Statement(PreparedStatement) , ResultSet 

               ~.close(); 사용

사용자요청이 들어올때마다 연결, 닫기 
매번 필요할때마다 새로 연결해줘야 한다. ACID 보장 

DAO 와 DBManger.java 연결 

닫기는 dbmanger에서 닫는다. dbclose.닫아야할 객체는  dao에 있다. 
커넥션은 dao에서 얻어오고 dao에서 필요한 dbmanger부분을 가져와서 사용한다. 
dbmanager은 //로드 연결 닫기 가 모두 들어간다. 

예외처리 부분 영역 나누기 
throws
try catch 

try catch는 dbmanger에서 처리 
실습하면서 다시 복습하기

 

'Dev > DB' 카테고리의 다른 글

[JDBC] SELECT 전체조회 | 번호로 조회 / DELETE로 삭제해보기  (0) 2026.03.09
SQLInjection Test 실습  (0) 2026.03.09
데이터베이스 모델링  (1) 2026.03.06
MySQL) SUBQUERY 예제  (0) 2026.03.06
MySQL) JOIN 예제  (0) 2026.03.06