[Java] JDBC 사용하기

JUNBEOM PARK·2022년 4월 13일
0

🧨 Java

목록 보기
33/33
post-thumbnail

🤔 JDBC(Java DataBase Connectivity) ?

자바 어플리케이션에서도 직접 관계형 DBMS를 제어할 수 있다. 그러한 역할을 돕는 API가 JDBC(Java DataBase Connectivity) API이다.

Java 코드를 이용한 DBMS 제어

1. JDBC 드라이버 로딩

Class.forName("JDBC드라이버 이름"); 으로 JDBC 드라이버를 로딩한다.

  • Oracle : "jdbc:oracle:thin:@localhost:1521:XE"
  • MySQL : "com.mysql.cj.jdbc.Driver"

2. Connection 객체 생성

로드한 JDBC 드라이버를 통해 관계형 DBMS와 연결하는 단계

  • DriverManager : 관계형 DBMS와의 연결을 요청하는 getConncetion 메서드를 가짐
  • JDBC URL : DBMS와의 연결을 위한 식별값
  • Connection : 관계형 DBMS와 통신하는 메서드로 구성


3. Statement 객체 생성

해당 객체는 쿼리를 생성 및 실행할 작업 영역을 제공


4. 쿼리수행



JDBC 기본적인 사용

연결 테스트

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionTest {
    public static void main(String[] args) {
        // java 표준인 java.sql.Connection 클래스를 import해야 한다.
        Connection conn = null;

        try{
            // 1. 드라이버 로딩
            // 드라이버 인터페이스를 구현한 클래스를 로딩
            // mysql, oracle 등 각 벤더사 마다 클래스 이름이 다르다.
            // mysql은 "com.mysql.jdbc.Driver"이며, 이는 외우는 것이 아니라 구글링하면 된다.
            // 참고로 이전에 연동했던 jar 파일을 보면 com.mysql.jdbc 패키지에 Driver 라는 클래스가 있다.
            Class.forName("com.mysql.jdbc.Driver");

            // 2. 연결하기
            // 드라이버 매니저에게 Connection 객체를 달라고 요청한다.
            // Connection을 얻기 위해 필요한 url 역시, 벤더사마다 다르다.
            // mysql은 "jdbc:mysql://localhost/사용할db이름" 이다.
            String url = "jdbc:mysql://localhost/dev";

            // @param  getConnection(url, userName, password);
            // @return Connection
            conn = DriverManager.getConnection(url, "dev", "dev");
            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();
                }
            }
            catch( SQLException e){
                e.printStackTrace();
            }
        }
    }
}



SELECT 쿼리 실행

public class SelectTest {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try{
            // 1. 드라이버 로딩
            Class.forName("com.mysql.jdbc.Driver");

            // 2. 연결하기
            String url = "jdbc:mysql://localhost/dev";
            conn = DriverManager.getConnection(url, "dev", "dev");


            // 3. 쿼리 수행을 위한 Statement 객체 생성
            stmt = conn.createStatement();

            // 4. SQL 쿼리 작성
            // 주의사항
            // 1) JDBC에서 쿼리를 작성할 때는 세미콜론(;)을 빼고 작성한다.
            // 2) SELECT 할 때 * 으로 모든 칼럼을 가져오는 것보다
            //   가져와야 할 칼럼을 직접 명시해주는 것이 좋다.
            // 3) 원하는 결과는 쿼리로써 마무리 짓고, java 코드로 후작업 하는 것은 권하지 않음
            // 4) 쿼리를 한 줄로 쓰기 어려운 경우 들여쓰기를 사용해도 되지만 띄어쓰기에 유의 !!
            String sql = "SELECT name, owner, date_format(birth, '%Y년%m월%d일' date FROM pet";


            // 5. 쿼리 수행
            // 레코드들은 ResultSet 객체에 추가된다.
            rs = stmt.executeQuery(sql);

            // 6. 실행결과 출력하기
            while(rs.next()){
                // 레코드의 칼럼은 배열과 달리 0부터 시작하지 않고 1부터 시작한다.
                // 데이터베이스에서 가져오는 데이터의 타입에 맞게 getString 또는 getInt 등을 호출한다.
                String name = rs.getString(1);
                String owner = rs.getString(2);
                String date = rs.getString(3);

                System.out.println(name + " " + owner + " " + date);
            }
        }
        catch( ClassNotFoundException e){
            System.out.println("드라이버 로딩 실패");
        }
        catch( SQLException e){
            System.out.println("에러 " + e);
        }
        finally{
            try{
                if( conn != null && !conn.isClosed()){
                    conn.close();
                }
                if( stmt != null && !stmt.isClosed()){
                    stmt.close();
                }
                if( rs != null && !rs.isClosed()){
                    rs.close();
                }
            }
            catch( SQLException e){
                e.printStackTrace();
            }
        }
    }
}



INSERT 쿼리 실행

	public int insertBoard(Board board) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		//url, user, password 
		String url = "jdbc:oracle:thin:@localhost:1521:XE";
		String user = "kosta236";
		String password = "1234";
		
		String sql = "insert into board values(board_seq.nextval,?,?,?,sysdate,0)";
		int re = -1;
		
		
		try {
			//1단계 : JDBC 드라이버 로딩 => 어떤 DB?
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2단계 : DB 연결 (Connenction 객체 생성)
			conn = DriverManager.getConnection(url, user, password);
			System.out.println("conn : " + conn);
			
			//3단계 : PrepareStatement 객체 생성(SQL 질의)
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, board.getTitle());
			pstmt.setString(2, board.getWriter());
			pstmt.setString(3, board.getContents());
			
			//4단계 : SQL문 실행(re => 실행된 row 갯수)
			re = pstmt.executeUpdate(); //insert, update, delete
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			if(pstmt != null) {
				try {
					pstmt.close();
				} catch (Exception e2) {}
			}
			if(conn != null) {
				try {
					conn.close();
				} catch (Exception e2) {}
			}
		}//end finally
		
		return re;
	}//end insertBoard
}//end class

쿼리를 수행할 때 동적으로 할댕해야 하는 값이 있으면 PreparedStatement 객체를 사용하고, 동적으로 할당할 필요가 없으면 Statement 객체를 사용한다.

쿼리의 결과가 있으면 executeQuery() 메서드를 호출하여 ResultSet 객체에 담고, 쿼리의 결과가 없으면 executeUpdate() 메서드를 호출하여 int형 변수에 결과 값을 할당 한다.

profile
DB 엔지니어👍

0개의 댓글