IT/JAVA

JDBC

iamhyeon 2024. 10. 8. 13:19

< JDBC (Java Database Connectivity) >

 

- Java에서 데이터베이스와 상호작용할 수 있도록 해주는 API

- JDBC는 데이터베이스 독립적인 API를 제공하여, Java 애플리케이션이 다양한 데이터베이스 시스템과 쉽게 연결되고 SQL 쿼리를 실행할 수 있게 해준다

- 데이터베이스 연결:
JDBC는 Java 애플리케이션에서 데이터베이스와의 연결을 설정하는 방법을 제공한다

연결을 설정한 후 SQL 명령을 통해 데이터를 삽입, 삭제, 갱신, 조회할 수 있다

 

- SQL 실행:
JDBC는 SQL 쿼리를 실행하기 위한 메서드를 제공하여 데이터베이스의 테이블에서 데이터를 가져오거나 변경하는 등의 작업을 수행할 수 있다
SQL 문은 Statement, PreparedStatement, CallableStatement와 같은 객체를 통해 실행된다

 

- 데이터베이스 독립성:
JDBC는 데이터베이스에 독립적인 인터페이스를 제공하기 때문에,

동일한 JDBC 코드를 사용하여 다양한 종류의 데이터베이스에 연결할 수 있다(예: MySQL, Oracle, PostgreSQL 등)

이를 위해 각 데이터베이스에 맞는 JDBC 드라이버를 사용한다

 

- 커넥션 풀링 및 트랜잭션 관리:
JDBC는 데이터베이스 연결을 재사용하여 성능을 향상시키는 커넥션 풀링(Connection Pooling) 및 트랜잭션(Transaction) 기능도 제공한다


< 주요 컴포넌트 >

 

DriverManager:
- DriverManager는 JDBC 드라이버를 관리하고, 애플리케이션에서 데이터베이스로 연결을 설정할 수 있는 API를 제공한다

- JDBC 드라이버를 로드하고, 데이터베이스에 연결을 요청할 때 주로 사용된다

Connection conn = DriverManager.getConnection(url, user, password);

 

 

Connection:
- Connection 객체는 데이터베이스와의 연결을 나타낸다

- 이 객체는 SQL 쿼리를 실행하고, 트랜잭션을 관리하며, 연결을 닫을 때 사용된다

 

 

Statement:
- Statement 객체는 SQL 쿼리를 데이터베이스에 전달하고 그 결과를 받아오기 위한 객체이다

- 기본 SQL 쿼리뿐만 아니라, 데이터 업데이트, 삭제, 삽입 등의 작업을 할 수 있다

Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");

 

 

PreparedStatement:
- PreparedStatement는 Statement와 유사하지만, 더 안전하고 성능이 뛰어나다

- 미리 컴파일된 SQL 쿼리를 사용하여, 동적으로 쿼리의 매개변수를 설정할 수 있으며,

- SQL 인젝션 공격을 방지하는 데 도움이 된다

PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
pstmt.setInt(1, 1001);
ResultSet rs = pstmt.executeQuery();

 

 

ResultSet:
- ResultSet은 SQL 쿼리의 결과를 저장하는 객체이다

- 데이터베이스에서 가져온 행(row)들을 포함하고, 각 행을 탐색하며 데이터를 읽을 수 있다

while (rs.next()) {
    System.out.println("User ID: " + rs.getInt("id"));
}

 


 

< JDBC 동작 흐름 >

 

1) JDBC 드라이버 로드:
- DriverManager가 적절한 JDBC 드라이버를 로드한다

- 예전에는 명시적으로 Class.forName("com.mysql.cj.jdbc.Driver")를 호출했으나, 최신 JDBC에서는 자동으로 드라이버를 로드할 수 있다

 

2) 데이터베이스 연결:
- DriverManager.getConnection() 메서드를 사용해 데이터베이스와의 연결을 설정한다

- 이때 URL, 사용자 이름, 비밀번호를 전달한다

 

3) SQL 쿼리 실행:
- Statement나 PreparedStatement 객체를 사용하여 SQL 쿼리를 실행한다

 

4) 결과 처리:
- SQL 쿼리 실행 후 ResultSet을 통해 결과를 처리한다

- 결과 집합을 하나씩 읽어 처리하거나 업데이트 쿼리의 경우 영향을 받은 행의 수를 확인한다

 

5) 연결 종료:
- 모든 작업이 끝난 후에는 Connection.close() 메서드를 호출하여 데이터베이스와의 연결을 종료해야 한다

 


< MySQL Connector/J >

- Java 에서 MySQL 데이터베이스와 연결할 수 있도록 해주는 JDBC (Java Database Connectivity) 드라이버이다

- 이를 통해 Java 프로그램은 MySQL 데이터베이스에 SQL 쿼리를 수행하고 데이터를 주고받을 수 있다
- JDBC 표준을 따르기 때문에, 표준화된 Java API를 사용하여 데이터베이스와 상호작용할 수 있다

- 이를 통해 Java 애플리케이션이 MySQL뿐만 아니라 다른 데이터베이스로 쉽게 포팅될 수 있다

- MySQL Connector/J는 최신 JDBC 표준(현재 JDBC 4.2)까지 지원하며, 기본적인 데이터베이스 연결뿐만 아니라 메타데이터 검색, 배치 업데이트, 트랜잭션 관리 등 다양한 기능을 제공한다

- MySQL 전용 드라이버로서, MySQL의 고유한 기능(예: 여러 엔진에 대한 지원, JSON 데이터형 처리 등)에 최적화된 성능을 제공한다

- MySQL Connector/J는 SSL(보안 소켓 계층) 연결을 지원하여, 데이터베이스와의 통신을 암호화할 수 있다

- 다양한 인증 메커니즘을 통해 보안 연결을 보장한다

- 커넥션 풀링 기능을 사용하여 데이터베이스 연결을 재사용함으로써 성능을 최적화할 수 있다

- 이는 연결을 반복해서 생성하고 닫는 비용을 줄여주며, 특히 대규모 애플리케이션에서 매우 유용하다

- Connector/J는 다양한 문자 인코딩을 지원하며, 유니코드 데이터 처리에도 강력한 지원을 제공한다

- 이를 통해 국제화 및 다국어 지원 애플리케이션에서 원활한 데이터 처리가 가능하다


Statement stmt = null;
int result = 0;

stmt = conn.createStatement();
result = stmt.executeUpdate(sql);

executeUpdate(sql)는 

- SQL 쿼리를 실행하고, 

- 주로 데이터베이스의 데이터를 변경하는 쿼리(예: INSERT, UPDATE, DELETE)를 수행할 때 사용된다
- 반환값(result)은 SQL 문에 의해 영향을 받은 행의 수이다

 

 

 

Statement stmt = null;
ResultSet rs = null;

stmt = conn.createStatement();
rs = stmt.executeQuery(sql);

while (rs.next()) {
    int deptno = rs.getInt("deptno");
    String dname = rs.getString("dname");
    String loc = rs.getString("loc");

    System.out.println("학과번호 : " + deptno);
    System.out.println("학과이름 : " + dname);
    System.out.println("위치 : " + loc);
    System.out.println();
}

- ResultSet은 SQL 쿼리의 결과를 저장하는 객체이다

- SQL 쿼리 실행 후 ResultSet을 통해 결과를 처리한다

- 데이터베이스에서 가져온 행(row)들을 포함하고, 각 행을 탐색하며 데이터를 읽을 수 있다

- 결과 집합을 하나씩 읽어 처리한다

 

 

 

 

 

sql문 수행하고 나면 생성된 역순으로 close를 해줘야 한다

if (stmt != null) {
    try {
        stmt.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

 

if (conn != null) {
    try {
        conn.close();
    } catch (SQLException e) {
        System.out.println("=== MySQL Disconnection Fail ===");
        System.out.println(e.getMessage());
    }
}

 

 

 

반응형

'IT > JAVA' 카테고리의 다른 글

Java 란  (3) 2024.12.27
MyBatis Log4j Error  (0) 2024.10.10
JDK 설치  (0) 2024.10.06
CRUD  (1) 2024.10.01
Java Exception Error  (1) 2024.09.30