JDBC 프로그래밍 : 간단 연결과정

김다린·2024년 4월 5일

JDBC

목록 보기
2/4

JDBC 프로그래밍 과정


1,2. Driver loading, Get a Connection

class.forName("") → 예외처리가 필요함 ,보통 static {} 내에 들어감

다른 방법)

  1. DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
  2. new oracle.jdbc.driver.OracleDriver();

이 있긴 한데 보통 forName()을 사용한다.

public static void main(String [] args) throws Exception {
		System.out.println("데이터베이스 연결을 테스트합니다.");
		String url="jdbc:oracle:thin:@localhost:1521/xe";
		String user="hr";
		String password="hr";

		//Connection 생성
		Connection con = null;
		try {
			con=DriverManager.getConnection(url, user, password);
			String sql="select employee_id, first_name, salary from employees";
			ResultSet rs =stmt.executeQuery();
			System.out.println(con);
			System.out.println(rs);
		}catch(Exception e){
			System.out.println(e.getMessage());
		}finally {
			try {con.close();} catch (Exception e) {
			}
		}
//		Class.forName("oracle.jdbc.OracleDriver");
//		DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//		System.out.println("드라이버 클래스가 로드되었습니다.");
	}

3. Make a Query

SQL Query 문은 직접 String으로 입력해도 상관없으나, 프로그램의 디버깅등을위해따로변수에저장해서사용하는것이좋다

	String sql="select employee_id, first_name, salary from employees";

4. Create a Statement

  1. 그냥 statement : SQL Injection 취약점이 있어 사용안함
  2. PreparedStatement : SQL 구문에 값을 매핑시키기 편함(가장 사용 多)
  3. CallableStatement : 오라클 내장 함수(Stored Function)를 실행시키기 위함
Statement stmt=con.createStatement()

5. Execute SQL Query

ResultSet rs =stmt.executeQuery(sql); //결과집합을 받아올 수 있음
System.out.println(rs);

6. Retrieving Results

인수로 문자열을 전달할 경우 열의 이름 또는 열 별칭을 지정

select 구문의 열에 수식이 사용될 경우 열 별칭 사용 권장

while(rs.next()) {
	System.out.println(rs.getInt("employee_id")+"\t");
	System.out.println(rs.getString("first_name")+"\t");
	System.out.println(rs.getDouble("salary"));
}

7. Close Connection

예외 처리블록의 finally 블록에서 리소스를닫아줌.

Connection의 경우 반드시 닫아줘야 함.

Connection이 받환되지 않을 경우Connection 누수현상이 발생할 수
있음

rs.close(); stmt.close(); con.close;

		}finally {
			try {con.close();}catch(Exception e) {}
		}

PreparedStatement


반복적으로 구조가 같은 SQL문을 실행할 때에 더 나은 성능

바뀔 데이터가 들어갈 자리는 ‘?’으로 표시

파싱하는 시간을 줄이기 위해 만들어짐

String sql = "select first_name, hire_date, salary, department_id "
					+ "from employees where department_id=?";
			PreparedStatement stmt=con.prepareStatement(sql);
			stmt.setInt(1, 60);
			ResultSet rs =stmt.executeQuery();

CallableStatement


  • DBMS의저장프로시저를 호출하게 해준다.
  • PreparedStatement보다 나은 성능
  • DB내에서 Lock을 사용하기 때문에 데이터무결성 방지

SqlDeveloper로 들어가 프로시저 생성


IN은 입력 파라미터, OUT 출력파라미터. 함수로 해도 가능하다.


제대로 입력이 되었는지 확인하기 위해 구문을 작성해본다.


정상적으로 나옴!

  • CallableExample.class 파일 생성


다음과 같이 파일을 추가해주고


CallableStatement 를 사용하여

MetaData


테이블에 대한 메타정보를 알고싶을 때 사용

ResultSetMetaData : 테이블의 컬럼에 대한 정보

DatabaseMetaData : 데이터베이스에 관한 정보

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

public class MetaDataExample {
	public static void main(String[] args) throws Exception{
		Class.forName("oracle.jdbc.OracleDriver");
		String url="jdbc:oracle:thin:@localhost:1521:xe";
		String user="hr";
		String password="hr";
		Connection con=DriverManager.getConnection(url,user,password);
		String sql="select * from employees";
		PreparedStatement stmt=con.prepareStatement(sql);
		ResultSet rs=stmt.executeQuery();
		ResultSetMetaData metaData=rs.getMetaData(); //메타데이터 
		int colCount = metaData.getColumnCount();
		System.out.println(colCount);
		for(int i=1; i<=colCount; i++) {
			System.out.println(metaData.getColumnName(i)+" "+metaData.getColumnType(i));
		}
		
	}
}

트랜잭션


ex) 특정 사원의 정보를 삭제하세요

ERP에 따르면 job_history를 먼저 삭제해야 함
이후에 나오는 delete 기능작성시 확인가능

profile
한걸음씩 뚜벅뚜벅

0개의 댓글