JDBC를 이용한 데이터베이스 연동 (MySQL)

Dodam·2023년 7월 22일
2

[기타]

목록 보기
3/8
post-thumbnail

JDBC API

Java DataBase Connectivity의 약자로 JDBC는 자바 언어로 데이터베이스 프로그래밍을 하기 위한 라이브러리이다.
JDBC는 DBMS에 종속되지 않는 관련 API를 제공한다. JDBC API는 JDK에서 제공하며 JDBC 프로그래밍을 위해서는 JDBC드라이버가 필요하다.
JDBC 드라이버는 각 DBMS 회사에서 제공하는 라이브러리 압축파일이다. MySQL을 사용할 경우, MySQL 데이터베이스 관리 시스템(DBMS)을 사용하지만 오라클을 사용한다면 오라클용 JDBC 드라이버가 필요하다.

JDBC API 클래스

JDBC는 다양한 클래스와 인터페이스로 구성된 패키지 java.sql과 javax.sql로 구성되어 있다.

  • 데이터베이스를 연결하여 테이블 형태의 자료를 참조
  • SQL문 질의
  • SQL문의 결과 처리

전체적인 구조는 다음 그림과 같다.


JDBC를 이용한 데이터베이스 연동

JDBC 드라이버 로드

Class.forName("com.mysql.jdbc.Driver");

Class.forName() 메서드를 호출하여, mysql에서 제공하는 Driver 클래스를 JVM method area에 로딩시킨다.

데이터베이스 연결

String jdbc_url = "jdbc:mysql://localhost:3306/database?serverTimezone=UTC";
Connection con = DriverManager.getConnection(URL, "user', "password");

이제 Connection 객체를 만들어 사용하게 되는데, 방법은 DriverManager 클래스의 static 메서드인 getConnection() 메서드를 호출해서 mysql에 연결하기 위한 커넥션 정보(url, user, password)를 입력한다.
getConnection() 메서드의 수행 결과로 Connection 객체를 반환하는데, 이 객체를 통해 쿼리를 날리는 statement를 작성할 수 있다.
SELECT 쿼리에서는 createStatement(), INSERT에서는 preparedStatement()를 호출한다.

SQL을 위한 객체 생성

Statement stmt = con.createStatement();

SQL 문장 실행

String sql = "select * from student";
ResultSet rs = stmt.executeQuery(sql);

select 문장은 테이블 형태의 결과를 반환한다. 그러므로 select 문장을 실행하기 위해 Statement의 메소드 executeQuery()를 사용한다. 메소드 executeQuery()는 질의 결과로 테이블 형태의 결과를 반환하는데, 이 반환형이 인터페이스 ResultSet이다.

질의결과 처리

while(result.next()){
	String name = result.getString(1);
  	String owner = result.getString(2);
  	String date = result.getString(3);
}

ResultSet 인터페이스에는 질의 결과의 현재 행(row)을 가리키는 커서(cursor)라는 개념이 있으며, 이 커서를 다음 행으로 이동시키는 메소드가 next()이다.

ResultSet의 메소드 - getString()과 getInt()

ResultSet의 커서가 있는 행에서 컬럼 자료를 참조하기 위해 ResultSet이 제공하는 메소드 getString()을 이용한다.
getString()의 인자는 컬럼 이름을 문자열로 직접 쓰거나 또는 컬럼 번호를 이용할 수 있다. 컬럼 값의 자료 유형에 따라 메소드 getString()뿐만 아니라 getInt(), getDouble(), getDate() 등 다양한 컬럼 반환 메소드를 제공한다.

SELECT 쿼리 예제

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
  
public class Example {
  
  public static void main(String[] args) {
  
  	String jdbc_driver = "com.mysql.cj.jdbc.Driver";
  	String jdbc_url = "jdbc:mysql://localhost:3306/board?serverTimezone=UTC";
  	try {
  		Class.forName(jdbc_driver).newInstance();
 		Connection con = Driver.Manager.getConnection(jdbc_url, "root", "root");
  		Statement st = con.createStatement();
  
  		String sql = "SELECT * FROM member";
  		ResultSet rs = st.executeQuery(sql);
  
	  	while(rs.next()) {
  			String name = rs.getString(1);
  			String owner = rs.getString(2);
  			String date = rs.getString(3);
  
  			Ststem.out.println(name + "" + owner + "" + date);
  		}
  
  		rs.close();
  		st.close();
  		con.close();
  
  		} catch (Exception e) {
  			e.printStackTrace();
  		}
  	}
}	

INSERT 쿼리 예제

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException
  
public class InsertTest {
  public static void main(String[] args) {
  // user 테이블에는 이름/지역/부서/성별/출생일 컬럼이 있다.
  }
  
  public static void insert(String name, String area, String department, 
  														String gender, String birth) {
  Connection conn = null;
  PreparedStatement pstmt = null;
  
  try {
  	// 1. 드라이버 로딩
  	Class.forName("com.mysql.jdbc.Driver");
  
  	// 2. 연결하기
  	String url = "jdbc:mysql://localhost/dev";
  	conn = DriverManager.getConnection(url, "dev", "dev");
  
  	// 3. SQL 쿼리 준비
  	// 추가하려는 데이터의 값은 전달된 인자를 통해 동적으로 할당되는 값이다.
    // 즉, 어떤 값이 전달될 지 모르기 때문에
    // select 할 때와 달리 stmt = conn.createStatement(); 대신
    // pstmt = conn.prepareStatement(sql);로 작성하여 데이터를 추가할 것임을 알려준다.
  	String sql = "INSERT INTO user VALUES (?,?,?,?,?)";
  	pstmt = conn.prepareStatement(sql);
  
  	// 4. 데이터 Binding
  	pstmt.setString(1, name);
  	pstmt.setString(2, area);
  	pstmt.setString(3, department);
    pstmt.setString(4, gender);
  	pstmt.setString(5, birth);
  
  	// 5. 쿼리 실행 및 결과 처리
  	// SELECT와 달리 INSERT는 반환되는 데이터들이 없으므로
    // ResultSet 객체가 필요 없고, 바로 pstmt.executeUpdate() 메서드를 호출하면 된다.
  	// INSERT, UPDATE, DELETE 쿼리는 이와 같이 메서드를 호출하며
  	// SELECT에서는 stmt.executeQuery(sql); 메서드를 사용한다.
  	int count = pstmt.executeUpdate();
  	if(count == 0) {
  		System.out.println("데이터 입력 실패");
  	}
  	else {
  	  	System.out.println("데이터 입력 성공");
  	}
 }
  
 catch(ClassNotFoundException e) {
  	  	System.out.println("드라이버 로딩 실패");
 }
  
 catch(SQLException e) {
  	  	System.out.println("에러 "+ e);
 }
  
  finally {
  	try {
  		if(conn != null && !conn.isClosed()) {
  			conn.close();
  		}
  		if(pstmt != null && !pstmt.isClosed()) {
  			pstmt.close();
  		}
 	}
  	catch(SQLException e) {
  		e.printStackTrace();
  	}
   }
 }
}
  • Insert 쿼리를 수행할 때도 먼저 Connection 객체를 얻어야 한다.
  • INSERT는 일반적으로 동적으로 값이 할당되므로 createStatement()를 호출하지 않고, 쿼리를 준비하는 statement라는 의미의 prepareStatement() 메서드를 호출한다.
  • 이 때 PreparedStatement를 반환하는데, pstmt.setString() 메서드를 통해 동적으로 값을 할당할 수 있다.
  • 값이 할당되면 pstmt.executeUpdate() 메서드를 실행하여 INSERT 쿼리를 실행할 수 있다.
  • 반환 값(return)은 영향을 미친 row의 개수이다.

참고: 이클립스에서 JDBC 등록하기

java에서 데이터베이스를 사용하기 위해서는 드라이버를 설치해야 한다.

먼저 MySQL 홈페이지에서 드라이버를 설치한다. (링크)

1) jar 파일 준비

설치가 완료되면 mysql-connector-java-버전-bin.jar 파일이 생성된다.
여러 클래스들을 모아 놓은 파일을 jar 파일이라고 하는데, 해당 파일이 있어야 MySQL을 사용할 수 있다.

2) 이클립스에서 jar 파일 연동

  1. 이클립스에서 새로운 프로젝트를 생성
  2. 프로젝트 폴더를 우클릭 - Properties - Java Build Path 항목 클릭
  3. Libraries - Add Library ... 클릭 - User Library 클릭 - User Libraries 클릭
  4. New 클릭하여 JDBC 이름 작성
  5. 생성된 Library를 클릭하고 Add External JARs 클릭
  6. 처음에 설치한 jar 파일 mysql-connector-java-버전-bin.jar 파일을 찾아서 클릭

3) JDBC의 기본적인 사용

  1. import java.sql.*;
  2. 드라이버를 load
  3. mysql 연결을 위한 Connection 객체 생성
  4. Statement 객체를 생성하여 질의 수행
  5. 질의 결과가 있다면, ResultSet 객체를 생성하여 결과 저장
  6. 추가 로직 실행 후, JDBC 연결 과정에서 필요했던 객체들을 close

마무리

  • 쿼리를 수행할 때 동적으로 할당해야 하는 값이 있으면 PreparedStatement 객체를 사용하고, 동적으로 할당할 필요가 없으면 Statement 객체를 사용한다.
  • 쿼리의 결과가 있으면 executeQuery() 메서드를 호출하여 ResultSet 객체에 담고,
    쿼리의 결과가 없으면 executeUpdate() 메서드를 호출하여 int형 변수에 결과 값을 할당한다.
profile
⏰ Good things take time

0개의 댓글