JAVA/HIGH JAVA

[JAVA] JDBC

아잠만_ 2024. 5. 13. 10:28

JDBC를 이용한 데이터 베이스 처리 순서

  1. 드라이버 로딩 => 라이브러리를 사용할 수 있게 메모리로 읽어 들이는 작업
    Class.forName("oracle.jdbc.driver.OracleDriver");
  2. DB에 접속하기 => 접속이 완료되면 Connection객체가 반환된다.
    DriverManager.getConnection()메서드를 이용한다
    커넥션 객체 = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe",user, password);
  3. 질의 => SQL문장을 DB서버로 보내서 처리하고, 처리한 결과를 얻어온다
    (Statement객체 PreparedStatement 객체를 이용하여 작업한다)
    State 객체 = 커넥션객체.createStatement();
  4. 결과처리 => 질의 결과를 받아서 원하는 작업을 수행한다.
    1) SQL문이 select문일 경우
    - select문을 처리한 결과가 ResultSet객체에 저장되어 반환한다.
    ResultSet객체 = State객체.executeQuery("sql문장");
    2) SQL문이 select문이 아닐 경우 (update, delete, insert 등)
    - SQL문의 처리 결과가 정수값으로 반환된다. ( 이 정수 값은 실행해 성공한 레코드 수를 의미한다 )
    1. Statement
      Statement객체  = Connection객체.createStatement();
      Statement객체.executeUpdate(sql); / executeQuery(sql);
      (해석을 그때 그때하여 속도가 느림)

    2. PreparedStatement
      SQL문을 작성할 때 SQL문에서 데이터가 들어갈 자리를 물음표(?)로 표시해서 작성한다
      PreparedStatement객체  = Connection객체.prepareStatement(sql);
      PreparedStatement객체.executeUpdate() / executeQuery()
      SQL문의 물음표(?)자리에 들어갈 데이터를 세팅한다
      PreparedStatement객체.set자료형이름(물음표번호, 데이터);
      (해석을 미리 하여 속도가 빠름, 똑같은 반복작업을 할 경우 preparedStatement를 활용하기)

      excuteUpdate()의 반환값
        > 작업에 성공한 레코드 수
  5. 출력
    1. ResultSet객체.next() 이용하기
      ResultSet객체의 데이터를 가르키는 포인터를 다음 번 째 레코드로 이동시키고
      그곳에 데이터가 있으면 true 없으면 false 를 반환
    2. 자료를 가져오는 방법
      ResultSet객체.get자료형이름("컬럼명" 또는 "alias명")
      ResultSet객체.get자료형이름(컬럼번호)  > 컬럼번호는 1부터 시작
    3. ResultSetMetaDate객체 활용하는법
      ResultSet객체.getMetaData()를 통해 메타데이터 객체를 생성한 뒤
      메타데이터를 활용하여 전체 칼럼 번호를 가져옴 > 메타데이터객체.getColumnCount();
      반복문을 이용해 출력
      (컬럼 이름은 메타데이터객체.getColumnName(인덱스) )
  6. 사용했던 자원 반납하기 => 각 자원의 close()메서드를 이용한다.
    try-catch문에 finally에 작성하기

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

//	JDBC( Java DataBase Connectivity )라이브러리를 이용한 DB자료 처리하기
public class JdbcTest01 {
	public static void main(String[] args) {
		// DB작업에 필요한 변수 선언
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			// 1. 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			// 2. DB연결
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","JIN96", "java");
			
			// 3. 질의
			
			// 3-1 SQL문 작성
			String sql = "select * from lprod";
			
			// 3-2 Statement 객체 생성 (질의를 처리하는 객체 생성)
			stmt = conn.createStatement();
			
			// 3-3. SQL문을 DB서버로 보내서 처리하고 결과를 얻어온다.
			//		(실행할 SQL문이 select문이기 떄문에 결과가 ResultSet객체에 저장되어 반환된다.)
			rs = stmt.executeQuery(sql);
			
			// 4. 결과 처리 => 한 레코드씩 화면에 출력하기
			//	ResultSet에 저장된 데이터를 차례로 꺼내오려면 반복문과 next() 메서드를 이용한다.
			
			// ResultSet객체의 next() 메서드 => ResultSet객체의 데이터를 가르키는 포인터를 
			//		다음 번째 레코드로 이동시키고 그곳에 데이터가 있으면 true
			// 		데이터가 없으면 false를 반환한다.
			while(rs.next()) {
				// 포인터가 가리키는 곳의 자료를 가져오는 방법
				// 형식1) ResultSet객체.get자료형이름("컬럼명" 또는 "alias명")
				// 형식2) ResultSet객체.get자료형이름(컬럼번호)
				//						==> 컬럼번호는 1부터 시작된다
				System.out.println("Lprod_id : "+rs.getInt("lprod_id"));
				System.out.println("Lprod_gu : "+rs.getString(2));
				System.out.println("Lprod_nm : "+rs.getString("LPROD_NM"));
				System.out.println("-------------------------------------");
			}
			
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			// 5. 자원 반납
			// 순서 반들어진 순서의 반대 ResultSet > State > Connection
			if(rs!=null) try {rs.close(); } catch(SQLException e) {}
			if(stmt!=null) try {stmt.close(); } catch(SQLException e) {}
			if(conn!=null) try {conn.close(); } catch(SQLException e) {}
		}
	}
}

문제

사용자로부터  Lprod_id 값을 입력받아 입력한 값보다
Lprod_id가 큰 자료들을 출력하시오.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class JdbcTest02 {
	public static void main(String[] args) {
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JIN96", "java");
			System.out.print("Lprod_id >> ");
			Scanner scan = new Scanner(System.in);
			int num = scan.nextInt();
			String sql = "select * from lprod where lprod_id > "+ num;
			System.out.println();
			
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			
			// 컬럼 갯수를 가져오기 위해서 ResultSetMetaDate 객체를 생성
			ResultSetMetaData rsmd = rs.getMetaData();
			int col = rsmd.getColumnCount();
			System.out.println("lprod_id가 "+num+"보다 큰 자료들..");
			System.out.println("===================================");
			while(rs.next()) {
				for(int i=1; i<=col; i++) {	// 컬럼 인덱스는 1부터 시작!!
					System.out.println(rsmd.getColumnName(i) + " : " + rs.getString(i));
				}
//				System.out.println("Lprod_id : " + rs.getString(1));
//				System.out.println("Lprod_gu : " + rs.getString(2));
//				System.out.println("Lprod_nm : " + rs.getString(3));
				System.out.println("---------------------------------");
			}
			System.out.println("===================================");
		} catch (SQLException e) {
			// TODO: handle exception
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if(rs!=null) try {rs.close();} catch(SQLException e){}
			if(stmt!=null) try {stmt.close();} catch(SQLException e){}
			if(conn!=null) try {conn.close();} catch(SQLException e){}
		}
	}
}

문제 2

lprod_id값을 2개 입력 받아서 두 값 중 작은 값부터 큰 값 사이의 자료들을 출력하시오

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Scanner;

public class JdbcTest03 {
	public static void main(String[] args) {
		Connection conn = null;
		Statement stmt = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","JIN96", "java");
			
			Scanner scan = new Scanner(System.in);
			int[] num = new int[2];
			System.out.print("lprod_id 번호 입력 >> ");
			num[0] = scan.nextInt();
			System.out.print("lprod_id 번호 입력 >> ");
			num[1] = scan.nextInt();
			
			Arrays.sort(num);
			
//			int num1 = scan.nextInt();
//			int num2 = scan.nextInt();
//			int max = Math.max(num1, num2);
//			int min = Math.min(num1, num2);
			
			
			// Statement
			/*
			stmt = conn.createStatement();
//			String sql = "select * from lprod where lprod_id >= "+num[0]+" and lprod_id <= "+num[1];
			String sql = "select * from lprod where lprod_id between "+num[0]+" and "+num[1];
			rs = stmt.executeQuery(sql);
			
			*/
			
			// PrepareStatement
			String sql = "select * from lprod where lprod_id between ? and ?";
			pstmt = conn.prepareStatement(sql);
			for(int i=0; i<num.length;i++) {
				pstmt.setInt(i+1, num[i]);
			}
			rs = pstmt.executeQuery();
			
			ResultSetMetaData rsmd = rs.getMetaData();
			int col = rsmd.getColumnCount();
			System.out.println("lprod_id가 "+num[0]+"이상이고 "+num[1]+"이하인 데이터..");
			System.out.println("=====================================================");
			while(rs.next()) {
				for(int i=1; i<=col ; i++) {
					System.out.println(rsmd.getColumnName(i)+" : "+rs.getString(i));
				}
				System.out.println("----------------------------");
			}
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if(rs!=null) try {rs.close();} catch(SQLException e) {}
			if(stmt!=null) try {stmt.close();} catch(SQLException e) {}
			if(conn!=null) try {conn.close();} catch(SQLException e) {}
		}
	}
}

INSERT/ UPDATE/ DELETE

executeUpdate()

반환값 int (변환된 행 갯수)


package kr.or.ddit.basic;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class JdbcTest04 {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		Connection conn = null;
		Statement stmt = null;
		PreparedStatement pstmt = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "JIN96", "java");
			System.out.println("계좌 번호 정보 추가하기");
			System.out.print("계좌 번호 입력 >> ");
			String bankNo = scan.next();
			System.out.print("은행명 입력 >> ");
			String bankName = scan.next();
			
			System.out.print("예금주 이름 입력 >> ");
			String userName = scan.next();
			
			/*
			// Statement 객체를 이용하여 처리
			stmt = conn.createStatement();
			String sql = "insert into bankinfo(bank_no, bank_name, bank_user_name, bank_date) values('"+bankNo+"', '"+bankName+"', '"+userName+"', sysdate)";
			// SQL문을 DB서버로 보내서 실행할 때 SQL문이 select문일 경우에는
			// excuteQuery() 메서드를 사용했는데
			// select문이 아닌 SQL문을 실행할 때는 executeUpdate()메서드를 사용한다
			
			// excuteUpdate()메서드의 반환값 => 작업에 성공한 레코드 수
			int cnt = stmt.executeUpdate(sql);
			
			System.out.println("반환 값 cnt : "+cnt);
			*/
			
			
			// PreparedStatement 객체를 이용하여 처리하기
			
			// SQL문을 작성할 때 SQL문에서 데이터가 들어갈 자리를 물음표(?)로 표시해서 작성한다
			String sql = "insert into bankinfo(bank_no, bank_name, bank_user_name, bank_date) values(?, ?, ?, sysdate)";
			pstmt = conn.prepareStatement(sql);
			
			// SQL문의 물음표(?)자리에 들어갈 데이터를 세팅한다
			// 형식 ) PreparedStatement객체.set자료형이름(물음표번호, 데이터)
//			pstmt.setString(1, bankNo);
//			pstmt.setString(2, bankName);
//			pstmt.setString(3, userName);
			
			 // 배열을 사용하여 파라미터 세팅
            String[] values = {bankNo, bankName, userName};
            for (int i = 0; i < values.length; i++) {
                pstmt.setString(i + 1, values[i]);
            }
			
			int cnt = pstmt.executeUpdate();
			System.out.println("반환 값 cnt : "+cnt);
			
			
		} catch (SQLException e) {
			// TODO: handle exception
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if(pstmt!=null) try {pstmt.close();} catch(SQLException e) {}
			if(stmt!=null) try {stmt.close();} catch(SQLException e) {}
			if(conn!=null) try {conn.close();} catch(SQLException e) {}
		}
	}
}