반응형
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;
}
}
작업을 하기 위해서 아래와 같은 테이블과 데이터를 삽입한다.
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;
}
}
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;
}
}
반응형
'자바' 카테고리의 다른 글
[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 |