JDBC에서 연결, 자원반환같은 공통 메서드들을

 

미리 템플릿으로 만들어 놓으면 편하게 사용이 가능하다.

 

1. Connection 객체 생성+DB연결  메서드를 템플릿으로 

2. 만들어진 객체의 close 구문 (CONNECTION , STATEMENT , RESULTSET)

3. Connection 객체로 수행할 rollback,  commit 구문

을 만들어 추출한다 (PreparedStatement 는 다형성으로 Statement 에 들어간다)

 

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCTemplate {
	// DB 연결, JDBC 자원 반환 같은 JDBC 공통내용 추출 클래스
	
	/*
	 * 1. Connection 객체 생성해서 반환
	 * 2. 전달 받은 JDBC 객체 자원 반환 (close)
	 * 3. 트랜잭션 제어구문(commit ,rollback)
	 * */
	
	private static Connection conn = null;
	//객체 생성을 하지 않아도 되는 변수
	//단 , 외부로부터 직접 접근은 차단
	//DB 연결 정보를 담고있는 Connection 객체 반환용 메서드
	
	public static Connection getConnection() {
		
		//이전에 생성된 Connection이 있고, close() 되지 않았을 경우
		// 이전 Connection을 재활용하고
		// 이전 생선된 Connection이 없거나 close 되었으면
		// 새로운 Connection을 반환
		// why?
		/* => 우리는 한 프로그램에 여러명이 접속하는 형태를 만들 예정
		 * 그러므로 객체가 계속해서 생성되면 과부하가 걸림
		 * =>접속한 사람 당 커넥션을 1개씩만 만들 수 있게 함
		 * */
		

		//DB연결 정보는 변경될 가능성이 있는데 그 때마다 컴파일 하는 것은 시간 낭비 심함
		//값 변해도 컴파일 다시 안해도 되도록 파일을 읽는 방식으로 수정
		//= 파일 내용만 변경하도록
		//XML 형식(DB연결 정보를 xml 파일에 별도로 작성해서 읽어오는 식)
		//---->확장 가능한 마크업 랭귀지 
		//== 프로그래밍 언어와 상관 없이 데이터를 저장, 전달 가능한 파일
		//요즘은 jason
		//XML에 작성된 DB 연결 정보를 Properties라는 객체를 이용해 얻어올 예정
		//Properties : 컬렉션 중 Map<K,V> 후손 클래스
		// K, V가 모두 String으로 제한된 Map
		// 장점: 파일입출력에 특화되어있음
		
		try {//isClosed : 커넥션 객체가 close() 된적 있으면 true;
			
//			xml 읽어와 저장할 Properties
			Properties prop = new Properties();
			//driver.xml 읽어오기
			prop.loadFromXML(new FileInputStream("driver.xml"));//try 안에 쓰기
			
			
			if(conn ==null || conn.isClosed()) {
				Class.forName(prop.getProperty("driver"));
				
				conn = DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("dbId"), prop.getProperty("dbPw"));
				conn.setAutoCommit(false);
				//자동 커밋 기능 off
				//(주의사항) conn.close()가 수행되는 경우 자동으로
				//commit() 이 수행된다.
				//->conn.close() 호출 전에 트랜잭션 제어 구문을 작성해야 된다
				//그러므로 conn.close 호철 전에 트랜잭션 제어 구문을 작성해야 한다.
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	//Statement 객체 반환 메서드
	public static void close(Statement stmt) {
		
		try {
			if(stmt!=null && !stmt.isClosed()) {
			stmt.close();}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public static void close(ResultSet rs) {
		
		try {
			if(rs!=null && !rs.isClosed()) {
			rs.close();}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public static void close(Connection conn) {
		
		try {
			
			if(conn!=null && !conn.isClosed()) {
			conn.close();}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
//	commit 메서드
	public static void commit(Connection conn) {
		
		try {
			
			if(conn!=null && !conn.isClosed()) {
			conn.commit();}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public static void rollback(Connection conn) {
		
		try {
			
			if(conn!=null && !conn.isClosed()) {
			conn.rollback();}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
}

 

 

'개발자로 업그레이드 되자 > JDBC' 카테고리의 다른 글

JDBC 정리 (1) UPDATE  (0) 2021.10.09
JDBC 정리 (0) 연결, SELECT  (0) 2021.10.08

*Java에서 INSERT, UPDATE , DELETE 등 DML을 구현한다

*SELECT 할때 와 다르게 PrepareStatement 객체를 사용한다.

 

*PrepareStatement :

1. SQL이 담기면 바로 전송하는 것이 아닌 준비가 완료된 후 전달해 결과를 받아옴

2. SQL 구문에 ?로 빈칸을 만들어 추후 메서드로 채워넣고 전송하는 방식

3. SQL 구문에 자바 변수를 합칠 수 있어 간단하게 작성이 가능해진다.

4. 다만 Statement보다 코드 길이가 길어지는 단점이 있다.

5. PrepareStatement 를 사용하면 결과가 int로 쿼리로 반영된 갯수 반환이 생긴다.

Connection conn = null;
PrepareStatement pstmt = null;
int result = 0;
String sql = " SQL구문 작성 + ? ? ? " ;
try{
	Driver.forName("oracle.jdbc.driver.OracleDriver");
    conn = DriverManager.getConnection( url, 아이디, 비밀번호);
    //url : "jdbc:oracle:thin:@주소:버젼"
    pstmt = conn.prepareStatement( sql );
    pstmt.setString(1, 값1); //첫번째 ?자리에 값1 대입
    pstmt.setInt(2, 값2); // .....
    pstmt.setInt(3, 값3);
    
    result = pstmt.executeUpdate(); // 값 전부 대입된 후 execute로 실행
    //처리된 갯수가 반환됨
    
    }
catch(ClassNotFoundException e){
	e.printStackTrace();
   }
catch(SQLException e){
	e.printStackTrack;
    }
finally{
	try{
    	if(pstmt!=null) {pstmt.close();}
    	if(conn!=null) {pstmt.close();}
    	}
    	catch(SQLException e){
    	e.printStackTrace();
    	}
	}
    
    return result;

'개발자로 업그레이드 되자 > JDBC' 카테고리의 다른 글

JDBC 정리 (2) JDBC 템플릿  (0) 2021.10.14
JDBC 정리 (0) 연결, SELECT  (0) 2021.10.08

먼저 Java 와 DBMS를 연결시키기 위해선 프로젝트에 중간 통로인 JDBC를 쓸 수 있게 설정을 해놓아야 한다.

 

이클립스 - Project - Properties - Java Build Path 에 JDBC 라이브러리,드라이버 모음 위치를 등록한다.

(드라이버는 DBMS종류에 따라 달라진다)

 

***(Java 와 오라클 연결)***

 

JDBC란? 

->Java에서 DB에 접근할 수  있게 해주는 java 프로그래밍 API

OJDBC란?

->오라클에서 제공하는 오라클 DB와 자바를 연결하기 위한 라이브러리+드라이버

DriverManager?

->데이터 원본에 JDBC드라이버를 통하여 커넥션을 만드는 역할

Class.forName() 메소드를 통해 생성되며 반드시 예외처리 필요

직접 객체 생성이 불가는하고 getConnection() 메소드를 사용하여 객체 생성

 

*Java에서 SELECT문 가져오기

 

1. Oracle JDBC Driver 메모리에 로드

2. Connection (JDBC 객체) 선언 

3. Statement (Connection 객체를 통해 SQL구문을 실행하고 결과를 받아오는 객체) 선언

4. ResultSet (Statement 객체를 통해 가져온 결과(DB의 RESULTSET)를 저장하는 객체)

 ->출력해낼 때 한줄씩 가져오므로 객체명.next() 를 통해 커서이동을 통해 움직인다

 

5. 메모리에 올려놓은 것들을 닫고 자원을 반환하기 위해 반드시 close() 해준다.

Connection  conn = null;
Statement stmt = null;
ResultSet rs = null;
List<TableB> result=null
String url = "jdbc:oracle:thin:@주소:버젼";

try{
	Class.forName("oracle.jdbc.driver.OracleDriver");
    conn = DriverManagergetConnection(url,ID,PW);
    /*
    	url = "jdbc:oracle:thin:@주소:포트번호:버젼:"
    */
    stmt = conn.createStatement();
    rs = stmt.executeQuery(sql);
    //sql = SQL SELECT 구문 ;빼고
    
    result = new ArrayList<TableB>();
    
    while(rs.next()){
    	int a =rs.getInt("A");
        .....
        
        TableB tb = new TableB(a, ....);
        result.add(tb);
    }//rs마지막까지 ArrayList에 추가
    }catch (Exception e) {//예외처리
			e.printStackTrace();
	}finally { //예외가 발생하든 말든 사용한 자원 반환
			try {
				if(rs!=null) {rs.close();}
				if(stmt!=null) {stmt.close();}
				if(conn!=null) {conn.close();}
			}catch (SQLException e) {
				e.printStackTrace();
			}
}

 

 

 

 

 

 

 

 

 

 

'개발자로 업그레이드 되자 > JDBC' 카테고리의 다른 글

JDBC 정리 (2) JDBC 템플릿  (0) 2021.10.14
JDBC 정리 (1) UPDATE  (0) 2021.10.09

+ Recent posts