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 |