Test

JDBC TEST - 답

알 수 없는 사용자 2015. 6. 21. 07:33

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();
  
 }

}


-----------------------------------------------------