MySQL 3일차

진창호·2023년 2월 5일
0

MySQL

목록 보기
3/6

JDBC를 이용해 Java와 DBMS를 연결할 수 있다.

클래스, 인터페이스로 이루어진 API로 SQL문을 실행할 수 있는 함수 호출 인터페이스를 JDBC라고 한다.

JDBC의 특징은 아래와 같다.

  1. DBMS 종류에 따라 독립적인 자바 프로그래밍이 가능하다.
  2. 드라이버나 URL만 수정하면 DB가 달라져도 동일한 API를 사용 가능하다.
  3. Java와 DBMS에 독립적이다.

JDBC를 사용하는 방법은 아래와 같다.

  1. 드라이버 클래스를 로딩해야 한다. (생성자)
  2. DBMS와 연결해야 한다. (Connection 생성)
  3. Query문을 DBMS에 전송한다. (Statement 생성)
  4. 실행값을 받는다. (ResultSet 생성)
  5. 커넥션을 끊는다.

좀 더 자세히 알아보자. 첫 번째로 드라이버 클래스를 로딩하는 방법이다. 아래 코드를 살펴보자.

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);
	}
}

profile
백엔드 개발자

0개의 댓글