JDBC TEST - 답
1. 아래 조건을 만족하는 JDBC 프로그램을 작성합니다.
- 자바 콘솔 기반 프로그램 (클래스를 아래 목록과 형식으로 작성)
DBConn.java, Schedule.java, ScheduleDAO.java, MenuAction.java, Main.java
- 여러 개의 일정(날짜, 시간, 내용)을 데이터베이스에 저장하고 출력하는 프로그램 작성.
- 일정 입력시 날짜, 시간, 내용을 외부 입력 받고, 데이터베이스에 저장할 수 있도록 작성.
- 출력시 오늘 일정, 특정 일 일정, 특정 월 일정, 특정 단어 포함 일정, 전체 일정을 출력할 수 있도록 작성.
- 출력은 일정 갯수, 번호, 날짜, 시간, 내용이 날짜, 시간 순으로 정렬되어서 출력되도록 작성.
- 아래 내용을 보고 테이블 생성 후 제약조건 추가 쿼리, 샘플 데이터 추가 쿼리, 일정 출력 쿼리를 작성.
- 자바에서 날짜 형식(YYYY-MM-DD) 문자열이 존재하는 날짜인지 검사하는 메소드
private static boolean dateCheck(String date) {
boolean result = false;
try {
//"yyyy-MM-dd" 형식에서 대소문자 구분
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
df.setLenient(false);
df.parse(date);
result = true;
}catch(Exception e){
}
return result;
}
2. 데이터베이스 구성
--스케줄 테이블 생성
CREATE TABLE schedule (
sid NUMBER --PK
,"date" VARCHAR2(10) --날짜 입력(YYYY-MM-DD)
,hour VARCHAR2(2) --시간을 두 자리 문자로 입력(HH)
,content NVARCHAR2(200) --일정 내용 입력(200자 이내)
);
--PK 제약 추가
ALTER TABLE schedule
ADD CONSTRAINT shedule_sid_pk PRIMARY KEY(sid);
--시퀀스 객체 생성
CREATE SEQUENCE scheduleSeq;
--샘플 데이터 입력
INSERT INTO schedule (sid, "date", hour, content)
VALUES (scheduleSeq.nextval, '2015-04-01', '09', 'test');
INSERT INTO schedule (sid, "date", hour, content)
VALUES (scheduleSeq.nextval, '2015-04-23', '09', '테스트');
INSERT INTO schedule (sid, "date", hour, content)
VALUES (scheduleSeq.nextval, '2015-04-29', '09', '오늘 날짜 일정');
COMMIT;
--SELECT 쿼리(오늘날짜)
SELECT sid, "date", hour, content
FROM schedule
WHERE "date" = TO_CHAR(SYSDATE, 'YYYY-MM-DD')
ORDER BY sid;
--SELECT 쿼리(특정(년월)일)
SELECT sid, "date", hour, content
FROM schedule
WHERE "date" = '2015-04-01'
ORDER BY sid;
--SELECT 쿼리(특정(년)월)
SELECT sid, "date", hour, content
FROM schedule
WHERE SUBSTR("date", 1, 7) = '2015-04'
ORDER BY sid;
--SELECT 쿼리(특정단어(포함))
SELECT sid, "date", hour, content
FROM schedule
WHERE content LIKE '%오늘%'
ORDER BY sid;
--SELECT 쿼리(전체)
SELECT sid, "date", hour, content
FROM schedule
ORDER BY sid;
실행 결과)
--- 일정 관리 ---
1. 일정 입력
2. 일정 출력(검색)
선택(1~2, x 종료)?1
--신규 일정 입력--
(x 입력시 입력 종료)
날짜(YYYY-MM-DD)?2015-01-01
시간(HH)?09
내용(200자 이내)?신정 연휴
1개의 일정이 입력되었습니다.
날짜(YYYY-MM-DD)?x
--- 일정 관리 ---
1. 일정 입력
2. 일정 출력(검색)
선택(1~2, x 종료)?2
--- 일정 출력 ---
1. 오늘 일정
2. 특정 일 일정
3. 특정 월 일정
4. 특정 단어 포함 일정
5. 전체 일정
선택(1~5, x 종료)?1
1개 일정이 있습니다.
--------------------------------------------------
번호 날짜 시간 내용
1 2015-4-23 09 일정관리 프로그램 테스트
--- 일정 출력 ---
1. 오늘 일정
2. 특정 일 일정
3. 특정 월 일정
4. 특정 단어 포함 일정
5. 전체 일정
선택(1~5, x 종료)?2
특정 일(YYYY-MM-DD)?2015-01-01
1개 일정이 있습니다.
--------------------------------------------------
번호 날짜 시간 내용
22 2015-01-01 09 신정 연휴
--- 일정 출력 ---
1. 오늘 일정
2. 특정 일 일정
3. 특정 월 일정
4. 특정 단어 포함 일정
5. 전체 일정
선택(1~5, x 종료)?3
특정 월(YYYY-MM)?2015-01
1개 일정이 있습니다.
--------------------------------------------------
번호 날짜 시간 내용
22 2015-01-01 09 신정 연휴
--- 일정 출력 ---
1. 오늘 일정
2. 특정 일 일정
3. 특정 월 일정
4. 특정 단어 포함 일정
5. 전체 일정
선택(1~5, x 종료)?4
특정 단어?연휴
1개 일정이 있습니다.
--------------------------------------------------
번호 날짜 시간 내용
22 2015-01-01 09 신정 연휴
--- 일정 출력 ---
1. 오늘 일정
2. 특정 일 일정
3. 특정 월 일정
4. 특정 단어 포함 일정
5. 전체 일정
선택(1~5, x 종료)?5
2개 일정이 있습니다.
--------------------------------------------------
번호 날짜 시간 내용
22 2015-01-01 09 신정 연휴
1 2015-04-23 09 일정관리 프로그램 테스트
--- 일정 출력 ---
1. 오늘 일정
2. 특정 일 일정
3. 특정 월 일정
4. 특정 단어 포함 일정
5. 전체 일정
선택(1~5, x 종료)?x
--- 일정 관리 ---
1. 일정 입력
2. 일정 출력(검색)
선택(1~2, x 종료)?x
프로그램 종료됨!
-------------------------------------
//Schedule.java
package com.test;
public class Schedule {
//멤버변수->sid, date, hour, content
private String sid, date, hour, content;
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getHour() {
return hour;
}
public void setHour(String hour) {
this.hour = hour;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
//ScheduleDAO.java
package com.test;
import java.util.*;
import java.sql.*;
public class ScheduleDAO {
//일정 입력 메소드
public int add(Schedule s) {
int result = 0;
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBConn.getConnection();
String sql = String.format("INSERT INTO schedule (sid, \"date\", hour, content) VALUES (scheduleSeq.nextval, ?, ?, ?)");
pstmt = conn.prepareStatement(sql);
//데이터 바인딩
pstmt.setString(1, s.getDate());
pstmt.setString(2, s.getHour());
pstmt.setString(3, s.getContent());
result = pstmt.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (pstmt != null) {
pstmt.close();
}
}catch(Exception e){
}
DBConn.close();
}
return result;
}
//일정 출력 메소드(오늘날짜, 특정일, 특정월, 특정단어, 전체)
public ArrayList<Schedule> list(String key, String value) {
ArrayList<Schedule> result = new ArrayList<Schedule>();
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBConn.getConnection();
String sql = String.format("SELECT sid, \"date\", hour, content FROM schedule");
switch (key) {
case "1": sql +=" WHERE \"date\" = TO_CHAR(SYSDATE, 'YYYY-MM-DD')"; break;
case "2": sql +=" WHERE \"date\" = ?"; break;
case "3": sql +=" WHERE SUBSTR(\"date\", 1, 7) = ?"; break;
case "4": sql +=" WHERE content LIKE ?"; break;
}
sql+=" ORDER BY sid";
pstmt = conn.prepareStatement(sql);
//데이터 바인딩
switch (key) {
case "2": case "3":
pstmt.setString(1, value);
break;
case "4":
pstmt.setString(1, String.format("%%%s%%",value));
break;
}
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
Schedule s = new Schedule();
s.setSid(rs.getString("sid"));
s.setDate(rs.getString("date"));
s.setHour(rs.getString("hour"));
s.setContent(rs.getString("content"));
result.add(s);
}
rs.close();
}catch(Exception e){
e.printStackTrace();
}finally{
try {
if (pstmt != null) {
pstmt.close();
}
}catch(Exception e){
}
DBConn.close();
}
return result;
}
}
//AddTest.java
package com.test;
public class AddTest {
public static void main(String[] args) {
ScheduleDAO dao = new ScheduleDAO();
Schedule s = new Schedule();
s.setDate("2015-05-25");
s.setHour("09");
s.setContent("스케줄 테스트");
int result = dao.add(s);
System.out.printf("%d개의 행이 삽입되었습니다.%n", result);
}
}
//ListTest.java
package com.test;
public class ListTest {
public static void main(String[] args) {
ScheduleDAO dao = new ScheduleDAO();
//"1" -> 오늘 날짜
//"2" -> 특정일
//"3" -> 특정월
//"4" -> 특정단어
//"5" -> 전체
String key = "5"; //"1", "2", "3", "4", "5"
//value 변수의 값은 2, 3, 4의 경우만 해당
String value = ""; //"2", "3", "4"
for (Schedule s : dao.list(key, value)) {
System.out.printf("%s %s %s %s %n"
, s.getSid()
, s.getDate()
, s.getHour()
, s.getContent());
}
}
}
//MenuAction.java
package com.test;
import java.util.*;
public class MenuAction {
private ScheduleDAO dao;
public MenuAction() {
dao = new ScheduleDAO();
}
public void method1(Scanner sc) {
System.out.println();
System.out.print("날짜(YYYY-MM-DD)?");
String date = sc.nextLine();
System.out.print("시간(HH)?");
String hour = sc.nextLine();
System.out.print("내용(200자 이내)?");
String content = sc.nextLine();
Schedule s = new Schedule();
s.setDate(date);
s.setHour(hour);
s.setContent(content);
int result = dao.add(s);
System.out.printf("%d개 일정이 입력되었습니다.%n", result);
}
public void method2(Scanner sc) {
do {
System.out.println();
System.out.println("--- 일정 출력(서브메뉴) ---");
System.out.println("1. 오늘 일정");
System.out.println("2. 특정 일 일정");
System.out.println("3. 특정 월 일정");
System.out.println("4. 특정 단어 포함 일정");
System.out.println("5. 전체 일정");
System.out.print("선택(1~5, 0 종료)?");
String m = sc.nextLine();
if (m.equalsIgnoreCase("0")) {
break;
}
switch (m) {
case "1": submenu1(); break;
case "2": submenu2(sc); break;
case "3": submenu3(sc); break;
case "4": submenu4(sc); break;
case "5": submenu5(); break;
}
}while(true);
}
private void submenu1() {
schedulePrint("1", "");
}
private void submenu2(Scanner sc) {
System.out.print("특정 일(YYYY-MM-DD)?");
String date = sc.nextLine();
schedulePrint("2", date);
}
private void submenu3(Scanner sc) {
System.out.print("특정 월(YYYY-MM)?");
String month = sc.nextLine();
schedulePrint("3", month);
}
private void submenu4(Scanner sc) {
System.out.print("특정 단어?");
String value = sc.nextLine();
schedulePrint("4", value);
}
private void submenu5() {
schedulePrint("5", "");
}
private void schedulePrint(String key, String value) {
System.out.println();
System.out.println("--------------------------------------------------");
System.out.printf("%2s %-9s %s %s %n", "번호", "날짜", "시간", "내용");
for (Schedule s : dao.list(key, value)) {
System.out.printf("%-4s %13s %s %s %n"
, s.getSid()
, s.getDate()
, s.getHour()
, s.getContent());
}
System.out.println("--------------------------------------------------");
}
}
//Main.java
package com.test;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
MenuAction menu = new MenuAction();
do {
System.out.println();
System.out.println("--- 일정 관리(오라클) ---");
System.out.println("1. 일정 입력");
System.out.println("2. 일정 출력(검색)");
System.out.print("선택(1~2, 0 종료)?");
String m = sc.nextLine();
if (m.equalsIgnoreCase("0")) {
break;
}
switch (m) {
case "1": menu.method1(sc); break;
case "2": menu.method2(sc); break;
}
}while(true);
System.out.println("프로그램 종료됨!");
sc.close();
}
}
-----------------------------------------------------