클래스, 인터페이스로 이루어진 API로 SQL문을 실행할 수 있는 함수 호출 인터페이스를 JDBC라고 한다.
JDBC의 특징은 아래와 같다.
- DBMS 종류에 따라 독립적인 자바 프로그래밍이 가능하다.
- 드라이버나 URL만 수정하면 DB가 달라져도 동일한 API를 사용 가능하다.
- Java와 DBMS에 독립적이다.
JDBC를 사용하는 방법은 아래와 같다.
- 드라이버 클래스를 로딩해야 한다. (생성자)
- DBMS와 연결해야 한다. (Connection 생성)
- Query문을 DBMS에 전송한다. (Statement 생성)
- 실행값을 받는다. (ResultSet 생성)
- 커넥션을 끊는다.
좀 더 자세히 알아보자. 첫 번째로 드라이버 클래스를 로딩하는 방법이다. 아래 코드를 살펴보자.
package jdbc;
public class DriveLoadingTest {
public DriveLoadingTest() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("드라이버 로딩 성공!!!");
} catch (ClassNotFoundException e) {
System.out.println("드라이버 로딩 실패!!! : " + e);
}
}
public static void main(String[] args) {
new DriveLoadingTest();
}
}
핵심 함수는 Class.forName()이다. 이 함수로 드라이버를 로딩한다.
두 번째로 DB와 연결하는 방법이다. 아래 코드를 살펴보자.
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionTest {
public ConnectionTest() {
// 드라이버 클래스 로딩 코드
}
private Connection getConnection() {
Connection conn = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db?serverTimezone=UTC", "user", "password");
System.out.println("연결 성공!!!");
} catch (SQLException e) {
System.out.println("연결 실패!!! : " + e);
}
return conn;
}
public static void main(String[] args) {
ConnectionTest ct = new ConnectionTest();
Connection conn = ct.getConnection();
}
}
핵심 함수는 DriverManager.getConnection()이다. 이 함수로 DBMS를 연결한다.
세 번째로 Query문을 DBMS에 전송한다. 그리고 네 번째로 실행값을 받는다.
마지막으로 커넥션을 끊는다.
이때 Insert, Update, Delete / Select로 작동 방식이 나눠진다.
다음으로 Insert, Update, Delete의 작동 방식에 대해 살펴보자.
아래 예는 Insert의 예로 Update, Delete는 SQL문만 바꾸면 된다.
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class ConnectionTest {
public ConnectionTest() {
// 드라이버 클래스 로딩 코드
}
private Connection getConnection() {
// DB와 연결하는 코드
}
private void insert(Connection conn) {
PreparedStatement pstmt = null;
StringBuilder sql = new StringBuilder("insert into board(user_id, subject, content) \n");
sql.append("values (?, ?, ?)");
try {
pstmt = conn.prepareStatement(sql.toString());
// SQL에 ?를 쓰려면 PreparedStatement 클래스와 prepareStatement 메서드를 사용해야 한다.
// 그게 아니라면 Statement 클래스와 createStatement 메서드를 사용한다.
pstmt.setInt(1, 123); // 첫번째 ?가 1번이다.
pstmt.setString(2, "감사인사");
pstmt.setString(3, "감사합니다.");
int cnt = pstmt.executeUpdate(); // update, delete도 동일한 함수를 사용한다.
System.out.println("정상 실행 : " + cnt); // 정상 실행 시 1 출력
} catch (SQLException e) {
System.out.println("SQL 에러 발생 : " + e);
} finally {
try {
pstmt.close(); // 생성한 순서의 역순으로 닫는다.
} catch (SQLException e) {
System.out.println("SQL 에러 발생 : " + e);
}
try {
conn.close();
} catch (SQLException e) {
System.out.println("SQL 에러 발생 : " + e);
}
}
}
public static void main(String[] args) {
ConnectionTest ct = new ConnectionTest();
Connection conn = ct.getConnection();
ct.insert(conn);
}
}
다음으로 Select의 작동 방식에 대해 살펴보자.
package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class ConnectionTest {
public ConnectionTest() {
// 드라이버 클래스 로딩 코드
}
private Connection getConnection() {
// DB와 연결하는 코드
}
private void select(Connection conn) {
PreparedStatement pstmt = null;
ResultSet rs = null;
StringBuilder sql = new StringBuilder("SELECT * FROM BOARD \n");
try {
pstmt = conn.prepareStatement(sql.toString());
rs = pstmt.executeQuery(); // update, delete, insert와 다른 점이다.
while (rs.next()) { // SQL문이 끝날 때까지 행 반복
System.out.print(rs.getInt(1) + " "); // 열 번호와 열 타입에 맞게 불러오기
System.out.print(rs.getInt(2) + " ");
System.out.print(rs.getString(3) + " ");
System.out.print(rs.getString(4) + " ");
System.out.println(rs.getString(5));
// 5개의 열이 있음.
}
System.out.println("정상 실행 : 1");
} catch (SQLException e) {
System.out.println("SQL 에러 발생 : " + e);
} finally {
try {
rs.close(); // 생성한 순서의 역순으로 닫는다.
} catch (SQLException e) {
System.out.println("SQL 에러 발생 : " + e);
}
try {
pstmt.close();
} catch (SQLException e) {
System.out.println("SQL 에러 발생 : " + e);
}
try {
conn.close();
} catch (SQLException e) {
System.out.println("SQL 에러 발생 : " + e);
}
}
}
public static void main(String[] args) {
ConnectionTest ct = new ConnectionTest();
Connection conn = ct.getConnection();
ct.select(conn);
}
}