[구디아카데미]
주요함수
✅ getResource
✅ getPath
✅ getProperty
✅ load
💡Properties 에서 sql문이 인식이 잘 안될 경우
이클립스 -> Project -> clean 클릭
package com.jdbc.common;
import java.io.FileReader;
import java.io.IOException;
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 {
// ✅ Template 패턴
// 코드 재사용이 유용함
// Connection 객체 생성과 각 JDBC 연결에 필요한 객체를 닫아줄 때, 트렌잭션 처리할 때
// 일일이 계속 선언할 필요 없이 메소드로 만들어 놓고 호출해서 편리하게 사용하는 방법이다
//Connection 객체를 생성해주는 기능을 제공
public static Connection getConnection() {
Connection conn = null;
// 파일과 연결하기 위해서는 절대경로가 필요함
String path = JDBCTemplate.class.getResource("/driver.properties").getPath();
// "/" -> 루트부터 bin까지의 경로가 다 나옴 (bin = 클래스파일이 저장되는 곳)
// "/driver.properties" -> driver.properties 경로
try {
Properties driver = new Properties(); // Properties 객체 생성
driver.load(new FileReader(path)); // 파일을 읽어야하므로 IOException 예외처리를 해줘야함
Class.forName(driver.getProperty("drivername")); // 키값으로 밸류값 알수 있음
conn = DriverManager.getConnection(driver.getProperty("url")
,driver.getProperty("user")
,driver.getProperty("pw"));
conn.setAutoCommit(false);
}catch(ClassNotFoundException e) {//Class.forName로 오라클 클래스정보를 얻지못할 때 필요한 예외처리
e.printStackTrace();
}catch(SQLException e) {
e.printStackTrace();
}catch(IOException e) { // FileReader 클래스로 인해 예외처리
e.printStackTrace();
}
return conn;
}
//connection, Statement, Result 객체를 닫아주는 기능 제공
public static void close(Connection conn) {
try {
if(conn != null && !conn.isClosed()) {
conn.close();
}
}catch(SQLException e) {
e.printStackTrace();
}
}
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 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();
}
}
}
// resources 폴더 안의 driver.properties 파일
drivername=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
user=student
pw=student
// MemmberDao 클래스
package com.jdbc.model.dao;
import static com.jdbc.common.JDBCTemplate.close;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import com.jdbc.common.JDBCTemplate;
import com.jdbc.model.dto.MemberDTO;
public class MemberDao {
private Properties sql = new Properties();
{ // 제일 먼저 실행되는 초기화블록에다 넣어줘야함!
// 왜냐하면 sql문이 실행되기전에 먼저 파일을 불러와야하기 때문이다
try { // 루트밑에 빈밑에 패키지 밑에 member 밑에 파일이름
String path=MemberDao.class.getResource("/sql/member/member_sql.properties").getPath();
sql.load(new FileReader(path));
}catch(IOException e) {
e.printStackTrace();
}
}
public List<MemberDTO> selectAllMember(Connection conn){
Statement stmt = null;
ResultSet rs = null;
// String sql = "SELECT * FROM MEMBER";
String sql = this.sql.getProperty("selectMemberAll");
List<MemberDTO> members = new ArrayList();
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()) {
members.add(getMember(rs));
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
JDBCTemplate.close(rs);
JDBCTemplate.close(stmt);
}
return members;
}
import static com.jdbc.common.JDBCTemplate.*;
// JDBCTemplate 클래스안의 static 메소드들을 클래스명 생략해서 사용 가능
기존에는 JDBCTemplate.getConnection()으로 호출해야한다면 앞에 클래스명 생략이 가능하다!
우왕~ 이해가 쏙쏙!