[자바(Java)] JDBC (Java DataBase Connectivity)

방용환·2023년 5월 12일
0
post-thumbnail

1. 정적 영역 (Static Block)

1. 정적 영역 (Static Block)

  • 정적 영역 (Static block) : 클래스가 메모리에 저장된 후 자동 실행될 명령을 작성하는 영역
  • 정적 영역에 작성된 명령은 프로그램 실행시 한번만 실행
  • Class.forName(String className) : 문자열로 표현된 패키지가 포함된 클래스를 전달받아 ClassLoader 프로그램을 사용하여 클래스를 읽어 메모리에 저장하는 메소드
    => Class 객체 반환
    => ClassNotFoundException 발생 : 해당 패키지에 클래스가 없는 경우 발생

2. Class 객체를 수동으로 생성하는 방법

  1. Class.forName(String className) 메소드를 호출하여 반환받는 방법
  2. Object.getClass() 메소드를 호출하여 현재 사용중인 클래스에 대한 Class 객체를 반환받는 방법
  3. [클래스명.class] 형식으로 표현하는 방법

2. JDBC (Java DataBase Connectivity)

1. JDBC (Java DataBase Connectivity)

  • JDBC (Java DataBase Connectivity) : Java를 사용하여 DBMS 서버에 접속해 SQL 명령을 전달하고 실행하기 위한 기능을 제공하는 Java API
  • java.sql : JDBC 기능의 프로그램을 작성하기 위한 클래스 및 인터페이스가 선언된 패키지
    => JDBC 기능 구현을 위해 java.sql 패키지에서는 인터페이스 제공
    => DBMS 종류가 다양하므로 클래스로 제공 불가능
  • DBMS 프로그램을 관리하는 그룹에서 JDBC 기능을 구현하기 위한 클래스(JDBC Driver)를 배포하여 제공
    => JDBC Driver가 포함된 라이브러리 파일(Jar)을 다운로드 받아 프로젝트에 빌드 처리해야만 라이브러리의 클래스를 사용하여 JDBC 프로그램 작성 가능

3. STUDENT 테이블에 학생정보 삽입하는 JDBC 프로그램

1. DB에 STUDENT 테이블 만들기

-- Oracle Database

CREATE TABLE STUDENT(NO NUMBER(4) PRIMARY KEY, NAME VARCHAR2(50),
    PHONE VARCHAR2(20), ADDRESS VARCHAR2(100), BIRTHDAY DATE);

2. JDBC Driver

  • JDBC Driver 객체 : DriverManager 클래스에 등록되어 관리되는 Driver 객체
  • Driver 객체 : DBMS 서버에 접속하여 SQL 명령을 전달하는 기능을 제공하는 객체
  • DriverManager 클래스 : Driver 객체를 관리하기 위한 기능을 제공하는 클래스
  • DriverManager.registerDriver(Driver driver) : Driver 객체를 매개변수로 전달받아 DriverManager 클래스가 관리할 수 있는 JDBC Driver 객체로 등록하는 메소드
    => 동일한 클래스로 생성된 Driver 객체가 DriverManager 클래스에 여러개 등록 가능
    => 불필요한 Driver 객체가 존재하여 성능의 저하 발생
// 불가능하지는 않지만 효율이 좋지 않아 사용하지 않는 것을 권장
DriverManager.registerDriver(new OracleDriver());

3. eclipse에서 코드 작성하기

  1. OracleDriver 클래스로 객체를 생성하여 DriverManeger 클래스의 JDBC Driver 객체로 등록
  • Class.forName(String className) 메소드를 호출하여 ClassLoader 프로그램을 이용하여 OracleDriver 클래스를 읽어 메모리에 저장
    => OracleDriver 클래스의 정적영역에서 OracleDriver 클래스를 객체로 생성하여 DriverManager 클래스의 JDBC Driver로 등록하는 메소드 호출
Class.forName("oracle.jdbc.driver.OracleDriver");
  1. DriverManager 클래스에 등록된 JDBC Driver 객체를 이용하여 DBMS 서버에 접속해 Connection 객체를 전달
  • DriverManager.getConnection(String url, String user, String password) : DriverManager 클래스에 등록된 JDBC Driver 객체를 이용하여 DBMS 서버에 접속하는 메소드
  • url 형식 : Protocol : ServerName : Port : Resourse
Connection conn = DriverManager.getConnection(url, user, password);
  1. Connection 객체로부터 SQL 명령을 전달할 수 있는 Statement 객체를 반환받아 저장
  • Connection.createStatement() : SQL 명령을 전달할 수 있는 Statement 객체를 생성하여 반환하는 메소드
  • Statement 객체 : SQL 명령을 현재 접속중인 DBMS 서버에 전달하기 위한 기능을 제공하는 객체
Statement stmt = conn.createStatement();
  1. Statement 객체를 사용하여 SQL 명령(INSERT, UPDATE, DELETE, SELECT)을 DBMS 서버에 전달하여 실행하고 실행결과를 반환받아 저장
  • Statement.executeUpdate(String sql) : DML 명령을 전달하여 실행하는 메소드
    => DML 명령의 실행결과로 조작행의 개수가 저장된 정수값을 반환
  • Statement.executeQuery(String sql) : SELECT 명령을 전달하여 실행하는 메소드
    => SELECT 명령의 실행결과로 검색행이 저장된 ResultSet 객체를 반환
String sql="insert into student values(1000, '홍길동', '010-1234-5599',
	'서울시 강남구', '00/01/01')";
int rows = stmt.executeUpdate(sql);
  1. 반환받은 SQL 명령의 실행 결과값을 사용자에게 제공
System.out.println("[msg] " + rows + "명의 학생정보를 삽입했습니다.");
  1. JDBC 관련 객체를 모두 제거
  • finally 블럭에서 진행
  • 객체가 생성된 순서의 반대로 제거
  • Statement.close() : Statement 객체를 삭제하는 메소드
  • Connection.close() : Connection 객체를 삭제하는 메소드
finally {
	try {
		if(stmt != null) stmt.close();
		if(conn != null) conn.close();
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

4. eclipse 전체 코드

// InsertStudentApp.java

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

// STUDENT 테이블에 학생정보를 삽입하는 JDBC 프로그램 작성
public class InsertStudentApp {
	public static void main(String[] args) {
		Connection con = null;
		Statement stmt = null;
		try {
			// 1.OracleDriver 클래스로 객체를 생성하여
			// DriverManager 클래스의 JDBC Driver 객체로 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");
                
			// 2.DriverManager 클래스에 등록된 JDBC Driver 객체를 이용하여
            // DBMS 서버에 접속해 Connection 객체를 반환받아 저장
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "USER_NAME";
			String password = "USER_PASSWORD";
			con = DriverManager.getConnection(url, user, password);

			// 3.Connection 객체로부터 SQL 명령을 전달할 수 있는
            // Statement 객체를 반환받아 저장
			stmt = con.createStatement();

			// 4.Statement 객체를 사용하여 SQL 명령(INSERT,UPDATE,DELETE,SELECT)을
            // DBMS 서버에 전달하여 실행하고 실행결과를 반환받아 저장
			// String sql="insert into student values(1000,'홍길동''010-1234-5678','서울시 강남구','00/01/01')";
			// String sql="insert into student values(2000,'임꺽정','010-7894-5612','수원시 월정구','02/05/08')";
			String sql = "insert into student values(3000,'전우치',
               	'010-1478-2589','인천시 상당구','1998-12-11')";
			int rows = stmt.executeUpdate(sql);

			// 5.반환받은 SQL 명령의 실행 결과값을 사용자에게 제공
			System.out.println("[메세지]" + rows + "명의 학생정보를 삽입했습니다.");
                
		} catch (ClassNotFoundException e) {
			System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다.");
		} catch (SQLException e) {
			System.out.println("[에러]JDBC 관련 오류 = " + e.getMessage());
		} finally {
			try {
				// 6.JDBC 관련 객체 제거 (객체가 생성된 순서의 반대로 제거)
				if (stmt != null) stmt.close();
				if (con != null) con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

4. STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력하는 JDBC 프로그램

1. ResultSet 객체

  • Statement.executeQuery(String sql) : SELECT 명령을 전달하여 실행하는 메소드
    => SELECT 명령의 실행결과를 ResultSet 객체에 저장하여 반환
  • ResultSet 객체 : 검색결과를 2차원 배열의 형태로 저장하여 제공하는 객체
  • ResultSet 객체에 저장된 모든 검색행을 행단위로 처리하기 위해 ResultSet 객체는 내부적인 커서 제공
  • ResultSet 커서는 최로 RsultSet 객체의 BOF (Before Of File) 영역에 위치
  • ResultSet.next() : ResultSet 커서를 다음행으로 이동하는 메소드
    => false 반환 : ResultSet 커서 위치에 처리행이 없는 경우의 반환값
  • ResultSet.getXXX(int columnIndex) 또는 ResultSet.getXXX(String columnLabel) 으로 저장
    => columnIndex : 검색행에서 검색대상을 순서대로 1부터 1씩 증가되는정수값
    => columnLabel : 검색행에서 검색대상의 이름을 문자열로 표현

2. eclipse에서 코드 작성하기

// SelectStudentApp

import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력하는 JDBC 프로그램 작성
public class SelectStudentApp {
	public static void main(String[] args) {
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "USER_NAME";
			String password = "USER_PASSWORD";
			con = DriverManager.getConnection(url, user, password);

			stmt = con.createStatement();

			String sql = "select * from student order by no";

			rs = stmt.executeQuery(sql);

			if (rs.next()) {
				do {
					int no = rs.getInt("no");
					String name = rs.getString("name");
					String phone = rs.getString("phone");
					String address = rs.getString("address");
					Date birthday = rs.getDate("birthday");

					System.out.println("학번 = " + no);
					System.out.println("이름 = " + name);
					System.out.println("전화번호 = " + phone);
					System.out.println("주소 = " + address);
					System.out.println("생년월일 = " + birthday);
					System.out.println("==================================================");
				} while (rs.next());
			} else {
				System.out.println("[메세지]검색된 학생정보가 없습니다.");
			}
		} catch (ClassNotFoundException e) {
			System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다.");
		} catch (SQLException e) {
			System.out.println("[에러]JDBC 관련 오류 = " + e.getMessage());
		} finally {
			try {
				if (rs != null)
					rs.close();
				if (stmt != null)
					stmt.close();
				if (con != null)
					con.close();
			} catch (SQLException e) {
			}
		}
	}
}

0개의 댓글