반응형

 

JDBC Utility 클래스

 

Utility 클래스란 인스턴스 메소드와 인스턴스 변수를 일절 사용하지 않고 정적 메소드와 변수만을 제공하는 클래스를 이야기 한다. 

 

// JDBC를 좀 더 쉽고 편하게 사용하기 위한 Utility 클래스

Map<String, Object> selectOne(String sql) // : 한 줄만 가져올 떄
Map<String, Object> selectOne(String sql, List<Object> param)
List<Map<String, Object>> selectList(String sql) // : 여러 줄 가져올 때, 조건 없이 검색할 때 사용.  ex) select * from 테이블
List<Map<String, Object>> selectList(String sql, List<Object> param) // : 동적으로 사용할 때 이용
int update(String sql) // : 데이터 베이스에서의 update문, insert 하여 1문장만 들어오면 1이 int로 들어온다. => 변경된 숫자의 갯수 리턴
int update(String sql, List<Object> param)

 

 

더보기
package kr.or.ddit.study13;

import java.math.BigDecimal;
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.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JDBCUtil {
	/*
	 * JDBC를 좀 더 쉽고 편하게 사용하기 위한 Utility 클래스
	 * 
	 * Map<String, Object> selectOne(String sql) : 한 줄만 가져올 떄
	 * Map<String, Object> selectOne(String sql, List<Object> param)
	 * List<Map<String, Object>> selectList(String sql) : 여러 줄 가져올 때, 조건 없이 검색할 때 사용.  ex) select * from 테이블
	 * List<Map<String, Object>> selectList(String sql, List<Object> param) : 동적으로 사용할 때 이용
	 * int update(String sql) : 데이터 베이스에서의 update문, insert 하여 1문장만 들어오면 1이 int로 들어온다. => 변경된 숫자의 갯수 리턴
	 * int update(String sql, List<Object> param)
	 * */
	
	// 싱글톤 패턴 : 인스턴스의 생성을 제한하여 하나의 인스턴스만 사용하는 디자인 패턴
	
	// 인스턴스를 보관할 변수
	private static JDBCUtil instance = null;
	// JDBCUtil 객체를 만들 수 없게(인스턴스화 할 수 없게) private으로 제한함
	private JDBCUtil() {} 
	public static JDBCUtil getInstance() {
		if(instance == null) 
			instance = new JDBCUtil();
		return instance;
	}
	
	private String url = "jdbc:oracle:thin:@localhost:1521:xe";
	private String user = "pc09team4"; // 각자 user 명로 수정
	private String password = "java"; // 각자의 password로 수정
	
	private Connection conn = null;
	private ResultSet rs = null;
	private PreparedStatement ps = null;
	
	public List<Map<String, Object>> selectList(String sql, List<Object> param){
		// sql => "SELECT * FROM MEMBER WHERE MEM_ADD1 LIKE '%'||?||'%'"
		// sql => "SELECT * FROM JAVA_BOARD WHERE WRITER=?"
		// sql => "SELECT * FROM JAVA_BOARD WHERE BOARD_NUM > ?"
		List<Map<String, Object>> result = null;
		try {
			conn = DriverManager.getConnection(url, user, password);
			ps = conn.prepareStatement(sql);
			for(int i = 0; i < param.size(); i++) {
				ps.setObject(i + 1, param.get(i));
			}
			rs = ps.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			int columnCount = rsmd.getColumnCount();
			while(rs.next()) {
				if(result == null) result = new ArrayList<>();
				Map<String, Object> row = new HashMap<>();
				for(int i = 1; i <= columnCount; i++) {
					String key = rsmd.getColumnLabel(i);
					Object value = rs.getObject(i);
					value = reflect(value);
					row.put(key, value);
				}
				result.add(row);
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			if(rs != null) try { rs.close(); } catch(Exception e) {}
			if(ps != null) try { ps.close(); } catch(Exception e) {}
			if(conn != null) try { conn.close(); } catch(Exception e) {}
		}
		return result;
	}
	
	public List<Map<String, Object>> selectList(String sql){
		// sql => "SELECT * FROM MEMBER"
		// sql => "SELECT * FROM JAVA_BOARD"
		// sql => "SELECT * FROM JAVA_BOARD WHERE BOARD_NUM > 10"
		List<Map<String, Object>> result = null;
		try {
			conn = DriverManager.getConnection(url, user, password);
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			int columnCount = rsmd.getColumnCount();
			while(rs.next()) {
				if(result == null) result = new ArrayList<>();
				Map<String, Object> row = new HashMap<>();
				for(int i = 1; i <= columnCount; i++) {
					String key = rsmd.getColumnLabel(i);
					Object value = rs.getObject(i);
					value = reflect(value);
					row.put(key, value);
				}
				result.add(row);
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			if(rs != null) try { rs.close(); } catch(Exception e) {}
			if(ps != null) try { ps.close(); } catch(Exception e) {}
			if(conn != null) try { conn.close(); } catch(Exception e) {}
		}
		return result;
	}

	public int update(String sql, List<Object> param) {
		// sql => "DELETE FROM JAVA_BOARD WHERE BOARD_NUMBER=?"
		// sql => "UPDATE JAVA_BOARD SET TITLE='하하' WHERE BOARD_NUMBER=?"
		// sql => "INSERT MY_MEMBER (MEM_ID, MEM_PASS, MEM_NAME) VALUES (?, ?, ?)"
		int result = 0;
		try {
			conn = DriverManager.getConnection(url, user, password);
			ps = conn.prepareStatement(sql);
			for(int i = 0; i < param.size(); i++) {
				ps.setObject(i + 1, param.get(i));
			}
			result = ps.executeUpdate();
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			if(rs != null) try {  rs.close();  } catch (Exception e) { }
			if(ps != null) try {  ps.close();  } catch (Exception e) { }
			if(conn != null) try { conn.close(); } catch (Exception e) { }
		}
		return result;
	}
	
	public int update(String sql) {
		// sql => "DELETE FROM JAVA_BOARD"
		// sql => "UPDATE JAVA_BOARD SET TITLE='하하'"
		// sql => "UPDATE JAVA_BOARD SET TITLE='하하' WHERE BOARD_NUMBER=1"
		// sql => "INSERT MY_MEMBER (MEM_ID, MEM_PASS, MEM_NAME) VALUES ('admin', '1234', '홍길동')"
		int result = 0;
		try {
			conn = DriverManager.getConnection(url, user, password);
			ps = conn.prepareStatement(sql);
			result = ps.executeUpdate();
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			if(rs != null) try {  rs.close();  } catch (Exception e) { }
			if(ps != null) try {  ps.close();  } catch (Exception e) { }
			if(conn != null) try { conn.close(); } catch (Exception e) { }
		}
		return result;
	}
	
//	public <T> List<T> selectList(String sql,  List<Object> param , Class<T> type) {
//		List<Map<String, Object>> list = selectList(sql, param);
//		return ConvertUtils.convertToList(list, type);
//	}
//	
//	public <T> List<T> selectList(String sql, Class<T> type) {
//		List<Map<String, Object>> list = selectList(sql);
//		return ConvertUtils.convertToList(list, type);
//	}
//	
//	public <T> T selectOne(String sql, Class<T> type) {
//		Map<String, Object> map = selectOne(sql);
//		return ConvertUtils.convertToVo(map, type);
//	}
//	
//	public <T> T selectOne(String sql, List<Object> param , Class<T> type) {
//		Map<String, Object> map = selectOne(sql, param);
//		return ConvertUtils.convertToVo(map, type);
//	}
//	
	public Map<String, Object> selectOne(String sql, List<Object> param){
		// sql => "SELECT * FROM JAVA_BOARD WHERE BOARD_NUMBER=?"
		// param => [1]
		//
		// sql => "SELECT * FROM JAVA_BOARD WHERE WRITER=? AND TITLE=?"
		// param => ["홍길동", "안녕"]
		Map<String, Object> row = null;
		
		try {
			conn = DriverManager.getConnection(url, user, password);
			ps = conn.prepareStatement(sql);
			for(int i = 0; i < param.size(); i++) {
				ps.setObject(i + 1, param.get(i));
			}
			rs = ps.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			int columnCount = rsmd.getColumnCount();
			while(rs.next()) {
				row = new HashMap<>();
				for(int i = 1; i <= columnCount; i++) {
					String key = rsmd.getColumnLabel(i);
					Object value = rs.getObject(i);
					value = reflect(value);
					row.put(key,value);
				}
				// {DATETIME=2022-08-05 16:35:08.0, WRITER=홍길동, TITLE=안녕하세요, CONTENT=안녕안녕, BOARD_NUMBER=1}
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			if(rs != null) try {  rs.close();  } catch (Exception e) { }
			if(ps != null) try {  ps.close();  } catch (Exception e) { }
			if(conn != null) try { conn.close(); } catch (Exception e) { }
		}
		return row;
	}
	
	public Map<String, Object> selectOne(String sql){
		// sql => "SELECT * FROM JAVA_BOARD 
		//			WHERE BOARD_NUMBER=(SELECT MAX(BOARD_NUMBER) FROM JAVA_BOARD)"
		// sql => "SELECT * FROM MEMBER MEM_ID='a001' AND MEM_PASS='123'"
		Map<String, Object> row = null;
		
		try {
			conn = DriverManager.getConnection(url, user, password);
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			ResultSetMetaData rsmd = rs.getMetaData();
			int columnCount = rsmd.getColumnCount();
			while(rs.next()) {
				row = new HashMap<>();
				for(int i = 1; i <= columnCount; i++) {
					String key = rsmd.getColumnLabel(i);
					// getColumnName vs getColumnLabel
					// getColumnName : 원본 컬럼명을 가져옴
					// getColumnLabel : as로 선언된 별명을 가져옴, 없으면 원본 컬럼명
					Object value = rs.getObject(i);
					value = reflect(value);
					row.put(key,value);
				}
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			if(rs != null) try {  rs.close();  } catch (Exception e) { }
			if(ps != null) try {  ps.close();  } catch (Exception e) { }
			if(conn != null) try { conn.close(); } catch (Exception e) { }
		}
		return row;
	}

	public Object reflect(Object value) {
		if(value == null) return value;
		String typeName = value.getClass().getTypeName();
		if(typeName.contains("BigDecimal")) {
			BigDecimal bd = (BigDecimal) value;
			if(bd.toString().equals(bd.intValue()+""))
				value = bd.intValue();
			else if(bd.toString().equals(bd.longValue()+""))
				value = bd.longValue();
		}else if(typeName.contains("Timestamp")) {
			Timestamp time = (Timestamp) value;
			long t = time.getTime();
			Date date = new Date(t);
			value = date;
		}
		return	value; 
	}
	
	
}

 

 

작업을 하기 위해서 아래와 같은 테이블과 데이터를 삽입한다.

 

PARKING 테이블

 

package kr.or.ddit.study13;

import java.util.List;
import java.util.Map;

public class MapExample04 {
	
	JDBCUtil jdbc = JDBCUtil.getInstance(); // 싱글톤으로 이뤄져 있음
	
	public static void main(String[] args) {
		MapExample04 obj = new MapExample04();
		obj.process();
	}
	
	public void process() {
		List<Map<String, Object>> parkList = parkList();
		// 전체 출력
		printList(parkList);
	}
	
	public void printList(List<Map<String, Object>> parkList) {
		/*
		 * 전체 출력
		 */
		
//		System.out.println(parkList);
		
		for(int i=0; i<parkList.size(); i++) {
			Map<String, Object> map = parkList.get(i);
			System.out.print(map.get("PARK_TIME") + "\t");
			System.out.print(map.get("CAR_NUM") + "\t");
			System.out.print(map.get("STATE") + "\t\n");
		}
	}
	
	
	public List<Map<String, Object>> parkList() {
		String sql = "select * from parking";
		List<Map<String, Object>> parkList = jdbc.selectList(sql);
		return parkList;
	}
}

 

결과 화면1

 

 

package kr.or.ddit.study13;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class MapExample04 {
	
	JDBCUtil jdbc = JDBCUtil.getInstance(); // 싱글톤으로 이뤄져 있음
	Scanner sc = new Scanner(System.in);
	
	public static void main(String[] args) {
		MapExample04 obj = new MapExample04();
		obj.process();
	}
	
	public void process() {
		List<Map<String, Object>> parkList = parkList();
		// 전체 출력
		printList(parkList);
		
		/*
		 * 차량 번호 입력시 요금 계산하는 프로그램 만들기
		 */
		
		/*
		 * 1. 파라미터 차량 번호 return 값 분
		 */
		String carNum = sc.next();
		int min = getMin(parkList, carNum);
		
		/*
		 * 2. 파라미터 분 retrun 값 요금.
		 * 기본 시간(분)	기본 요금	단위 시간	단위 요금
		 * 180			5000	10		600
		 */
		int pay = getPay(min);
		System.out.println("차량 번호\t 시간\t 요금\t");
		System.out.println(carNum + "\t" + min + "분\t" + pay +"원");
		
	}
	
	public int getMin(List<Map<String, Object>> parkList, String carNum) {
		/*
		 * 리스트 중에서 carNum 5961이 아닌 정보는 continue로 넘기기.
		 */
		int min = 0;
		int temp = 0;

		for (Map<String, Object> map : parkList) {
			String car_num = (String)map.get("CAR_NUM");
			String state = (String)map.get("STATE");
			String park_time = (String)map.get("PARK_TIME");
			
			if(! car_num.equals(carNum)) continue;
//			System.out.println(map);
			
			// 입차 할때 시간 임시 저장
			if(state.equals("입차")) {
				temp = getTime(park_time);
			}
			
			// 출차 할때 출차 시간 - 임시저장된 입차 시간
			if(state.equals("출차")) {
				int out = getTime(park_time);
				min += out - temp;
			}
		}
//		System.out.println(min);
		return min;
	}
	
	public int getTime(String str) {
		/*
		 * 00:00 분으로 부터 지난 분을 가져오기
		 * 
		 * split
		 */
		String[] tokens = str.split(":");
		int hours = Integer.valueOf(tokens[0]);
		int mins = Integer.valueOf(tokens[1]);
		
		return hours*60 + mins;
	}
	
	public int getPay(int min) {
		/*
		 * 기본 시간(분)	기본 요금	단위 시간	단위 요금
		 * 180			5000	10분		600
		 */
		min -= 180;
		
		if(min <= 0) {
			return 5000;
		}
		int add = 0;
		if(min % 10 != 0) add = 1;
		return 5000 + ((min / 10 + add) * 600 );
	}
	
	public void printList(List<Map<String, Object>> parkList) {
		/*
		 * 전체 출력
		 */
		
//		System.out.println(parkList);
		
		for(int i=0; i<parkList.size(); i++) {
			Map<String, Object> map = parkList.get(i);
			System.out.print(map.get("PARK_TIME") + "\t");
			System.out.print(map.get("CAR_NUM") + "\t");
			System.out.print(map.get("STATE") + "\t\n");
		}
		System.out.println();
		
//		for (Map<String, Object> map : parkList) {
//			System.out.print(map.get("PARK_TIME") + "\t");
//			System.out.print(map.get("CAR_NUM") + "\t");
//			System.out.print(map.get("STATE") + "\t\n");
//		}
	}
	
	
	public List<Map<String, Object>> parkList() {
		String sql = "select * from parking";
		List<Map<String, Object>> parkList = jdbc.selectList(sql);
		return parkList;
	}
}

 

결과 화면2

 

 

반응형

'자바' 카테고리의 다른 글

[Java 초급] 23장 MVC 패턴1, 회원가입  (2) 2024.01.03
[Java 초급] 22.5장 테스트  (0) 2024.01.02
[Java 초급] 21.5장 테스트  (0) 2023.12.30
[Java 초급] 21장 컬렉션 프레임워크  (0) 2023.12.30
[Java 초급] 20.5장 테스트  (0) 2023.12.30