Computer Science/Database

[Java] 자바 어플리케이션에서 데이터베이스에 접속하는 방법 (Java, JDBC API, JDBC driver, MySQL)

2021. 2. 10. 11:01

JDBC API란?

자바 어플리케이션에서도 직접 관계형 DBMS를 제어할 수 있다. 그러한 역할을 돕는 API (Application, Programming Interface, library, 도구)가 JDBC(Java DataBase Connectivity) API이다. 다양한 관계형 DBMS를 자바에서 제어할 수 있는데, 이를 위해서는 각각에 맞는 JDBC 드라이버를 먼저 설치해야 한다. 위 개념을 간단한 모식도로 나타나면 다음과 같다.

JDBC API는 게임기 자체(닌X도 스X치), JDBC 드라이버는 게임칩(동X의 숲)이라고 생각하면 이해가 쉽다.

JDBC API는 기본적으로 설치되어 있지만,  DBMS에 맞는 JDBC 드라이버는 추가적으로 설치해야 한다. 이 포스팅에서는 MySQL에 접속하는 과정을 설명하고자 한다.

 

JDBC 드라이버 (for MySQL) 설치

JDBC 드라이버는 각각의 관계형 DBMS와 통신을 담당하는 Java 클래스로, MySQL에 대한 JDBC 드라이버는 아래 주소에서 다운받을 수 있다.

https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.19.zip

다운받은 후 압축을 풀고, 이클립스에 JAR 파일(mysql-connector-java-8.0.19.jar)을 등록시켜주면 사용이 가능하다.

자신의 Project 우클릭 > Properties > Java Build Path > Libraries > Add External JARs…

등록하면 다음과 같이 Referenced Libraries에 등록이 된 것을 확인할 수 있다.

 

 

Java 코드를 이용한 DBMS 제어

크게 네 가지 단계로 구성된다.

 

1. JDBC 드라이버 로딩: Class.forName(“JDBC드라이버 이름”); 으로 JDBC 드라이버를 로딩한다.

  • MySQL: “com.mysql.cj.jdbc.Driver”
  • SQLite: “org.sqlite.JDBC”
  • MariaDB: “org.mariadb.jdbc.Driver
  • SQL server: “com.microsoft.sqlserver.jdbc.SQLServerDriver

 

2. Connection 객체 생성: 로드한 JDBC 드라이버를 통해 관계형 DBMS와 연결하는 단계이다.

  • DriverManager: 관계형 DBMS와의 연결을 요청하는 method(getConnection)를 가짐.
  • JDBC URL: DBMS와의 연결을 위한 식별값
  • Connection: 관계형 DBMS와 통신하는 method로 구성.

 

3. Statement 객체 생성: 해당 객체는 쿼리를 생성 및 실행할 작업 영역을 제공한다.

 

4. 쿼리 수행

 

 

코드 예제

코드 예제는 아래와 같다.

 

주의해야할 점은 SELECT문의 경우 executeQuery()를 사용하고,

UPDATE, INSERT, DELETE문의 경우에는 executeUpdate()를 사용해야한다.

그렇지 않으면 "java.sql.SQLException: Can not issue data manipulation statements" 에러가 발생한다.

 

package user.database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class AccessDB {
	private static Connection getConnection(String databaseName){
		try {
			// JDBC 드라이버 로딩
			Class.forName("com.mysql.cj.jdbc.Driver");

			// Connection 객체 생성
			String url = "jdbc:mysql://URL 주소/" + databaseName + "?serverTimezome=Asia/Seoul";
            String user = "user";
			String password = "password";
			Connection conn = DriverManager.getConnection(url, user, password);
			
			return conn;
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
			return null;
		}

	}
	
	public static List<String> selectValueList(String databaseName, String columnLabel, String sql) {
		Connection conn = getConnection(databaseName);
		
		try {
			// Statement 객체 생성
			Statement stmt = conn.createStatement();
			
			// 쿼리 수행
			ResultSet rs = stmt.executeQuery(sql);
			
			// 값 불러오기
			List<String> valueList = new ArrayList<String>();
			while(rs.next()) {
				String value = rs.getString(columnLabel);
				valueList.add(value);
			}
			
			return valueList;
			
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
			return null;
		}
	}
    
    public static int executeUpdate(String databaseName, String sql) {
		Connection conn = getConnection(databaseName);
		
		try {
			// Statement 객체 생성
			Statement stmt = conn.createStatement();
			
			// 쿼리 수행 (변환된 행의 수 반환)
			return stmt.executeUpdate(sql);
			
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
			return -1;
		}
	}
}

 

Reference

 

728x90
반응형