12일차_방명록

JDBC 2015. 6. 21. 07:32

--------------------------------------
방명록
- JDBC 프로그램 작성은 아래 순서를 따른다.
기능 구현 분석 > 화면 구성 > 데이터베이스(샘플 쿼리) 준비 > 클래스 구성 분석 > 액션 코드 작성 > 테스트

5. 소스 코드

 

---------------------------------------------
//GuestBookDAO.java
package com.test;

import java.util.*;
import java.sql.*;

public class GuestBookDAO {
 
 //회원수 출력 메소드 (관리자 로그인)
 public int count() {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과(result 변수) 반환
  
  return result;
 }
 
 //회원 명단 출력 메소드 (관리자 로그인)
 public ArrayList<Member> memberList() {
  ArrayList<Member> result = new ArrayList<Member>();
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 Member 객체에 저장->Member 객체를 컬렉션에 저장
  //데이터베이스 연결 마무리
  //결과(컬렉션) 반환
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection();  
   
   String sql = String.format("SELECT sid, id, wdate, admin FROM membersListView");

   pstmt = conn.prepareStatement(sql);
   //바인딩 데이터 연결하는 과정
   ResultSet rs = pstmt.executeQuery(); //SELECT 쿼리인 경우
   
   while(rs.next()) {
    Member m = new Member();
    m.setSid(rs.getString("sid"));
    m.setId(rs.getString("id"));
    m.setWdate(rs.getString("wdate"));
    m.setAdmin(rs.getString("admin"));
    
    result.add(m);
   }
  
   rs.close();
  
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  } 
  
  return result;
 }
 
 
 //관리자 로그인(확인) 메소드
 public int adminLogin(String id, String pw) {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과(result 변수) 반환
  
  return result; //0 또는 1 반환.
 }
 
 
 //방명록 글건수 출력 메소드
 public int guestBookCount() {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과(result 변수) 반환
  
  return result;
 }
 
 //방명록 글목록 출력 메소드
 public ArrayList<GuestBook> guestBookList() {
  ArrayList<GuestBook> result = new ArrayList<GuestBook>();
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 GuestBook 객체에 저장->GuestBook 객체를 컬렉션에 저장
  //데이터베이스 연결 마무리
  //결과(컬렉션) 반환
  
  return result;
 }
 
 
 //일반회원 로그인(확인) 메소드
 public int memberLogin(String id, String pw) {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과(result 변수) 반환
  
  
  return result; //0 또는 1 반환
  
 }
 
 
 //방명록 글쓰기 메소드
 public int guestBookAdd(GuestBook g) {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //INSERT 쿼리 준비 및 실행. 데이터 바인딩.
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과(result 변수) 반환  
  
  return result;
 }
 
 
 
 //아이디 중복 확인 메소드
 public int idCheck(String id) {
  int result = 1;  //초기값을 1로 설정할 것.
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과(result 변수) 반환  
  
  return result; //1 또는 0 반환
 }
 
 //회원 가입 메소드
 public int memberAdd(Member m) {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //INSERT 쿼리 준비 및 실행. 데이터 바인딩.
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과(result 변수) 반환  
  
  return result;
 }
 

}

 

 

 


//GuestBookTest.java
package com.test;

public class GuestBookTest {

 public static void main(String[] args) {

  GuestBookDAO dao = new GuestBookDAO();
  
  System.out.printf("글건수 : %d건%n", dao.guestBookCount());
  System.out.println("-------------------------------");
  System.out.println("SID ID CONTENT WDATE");
  for (GuestBook g : dao.guestBookList()) {
   System.out.printf("출력서식"
      , "출력내용");
  }
  
  
 }

}

 

 


//GuestBookAddTest.java
package com.test;

import java.util.Scanner;

public class GuestBookAddTest {
 
 //아이디 변수를 멤버변수로 등록.
 //->여러개의 메소드에서 아이디 변수를 공유할 수 있다.
 private static String id;

 public static void main(String[] args) {
  
  Scanner sc = new Scanner(System.in);
  GuestBookDAO dao = new GuestBookDAO();
  
  if (memberLogin(sc, dao)) {
   System.out.println("글내용?");
   //한 문장 전체를 하나의 문자열로 인식하도록
   //nextLine() 메소드 사용할 것.
   String content = sc.nextLine();
   
   GuestBook g = new GuestBook();
   g.setId(id);
   g.setContent(content);
   
   int result = dao.guestBookAdd(g);
   System.out.printf("%d개의 행이 삽입되었습니다.%n", result);
   
  } else {
   System.out.println("아이디 또는 패스워드가 틀렸습니다.");
  }
  
  sc.close();

 }
 
 //일반회원 확인용 private 메소드
 private static boolean memberLogin(Scanner sc, GuestBookDAO dao) {
  boolean result = false;
  System.out.println("아이디?");
  id = sc.nextLine(); //nextLine() 메소드 사용할 것.
  System.out.println("패스워드?");
  String pw = sc.nextLine();
  if (dao.memberLogin(id, pw) == 1) {
   result = true;
  }
  return result;
 }

 
}

 


//MemberAddTest.java
package com.test;

import java.util.Scanner;

public class MemberAddTest {

 public static void main(String[] args) {
  
  Scanner sc = new Scanner(System.in);
  GuestBookDAO dao = new GuestBookDAO();

  System.out.print("아이디(10자 이내)?");
  String id = sc.next();
  if (idCheck(id, dao)) {
   //System.out.println("사용 가능한 아이디입니다.");
   System.out.print("패스워드?");
   String pw = sc.next();
   Member m = new Member();
   m.setId(id);
   m.setPwd(pw);
   int result = dao.memberAdd(m);
   if (result == 1) {
    System.out.println("회원 가입이 완료되었습니다.");
   } else {
    System.out.println("회원 가입 실패!");
   }
   
  } else {
   System.out.println("사용할 수 없는 아이디입니다.");
  }
  
  sc.close();

 }
 
 //아이디 중복 확인 private 메소드
 private static boolean idCheck(String id, GuestBookDAO dao) {
  boolean result = false;  //가입 불가
  
  if (dao.idCheck(id) == 0) {
   result = true; //가입 가능
  }
  
  return result;
 }
 
 
}

 

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

 

 

 


 

'JDBC' 카테고리의 다른 글

11일차_방명록  (0) 2015.06.21
10일차_직원관리_최종버전  (0) 2015.06.21
9일차_직원관리  (0) 2015.06.21
8일차_직원관리  (0) 2015.06.21
7일차_직원관리  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

11일차_방명록

JDBC 2015. 6. 21. 07:31

--------------------------------------
방명록
- JDBC 프로그램 작성은 아래 순서를 따른다.
기능 구현 분석 > 화면 구성 > 데이터베이스(샘플 쿼리) 준비 > 클래스 구성 분석 > 액션 코드 작성 > 테스트


1. 기능 구현
- 방명록 기능 구현. 글쓰기, 글보기, 회원가입, 회원명단 출력(관리자).
- 글쓰기는 회원 전용으로 로그인 과정을 성공한 경우에만 가능하도록 한다. 로그인 과정은 아이디와 패스워드를 확인하는 절차이다. 글내용은 문장 전체를 저장할 수 있도록 한다. 글쓴날짜는 자동으로 시스템의 날짜로 입력되도록 한다.
- 글보기는 로그인 과정 없이 가능하도록 한다.  출력시 번호, 아이디, 글내용, 글쓴날짜가 출력된다.
- 회원가입은 아이디와 패스워드만 입력 받는다. 아이디는 중복된 아이디인 경우 가입 불가하도록 처리 한다. 패스워드는 데이터베이스에 저장시 암호화 시켜서 저장한다. 가입날짜는 자동으로 시스템의 날짜로 입력되도록 한다.
- 회원명단은 관리자가 로그인 과정을 성공한 경우에만 가능하도록 한다. 출력시 전체 인원수 및 번호, 아이디, 가입날짜를 출력한다.


2. 화면 구성

==========회원 전용 방명록=================
1.글쓰기(회원전용)
2.글보기
3.회원가입
4.회원명단(관리자전용)
선택(1~4, -1 종료)->1

아이디?kim
패스워드?1234
회원이 아닙니다.

==========회원 전용 방명록=================
1.글쓰기(회원전용)
2.글보기
3.회원가입
- 아이디, 패스워드
4.회원명단(관리자전용)
선택(1~4, -1 종료)->3

아이디?kim
(사용 가능한 아이디입니다)
패스워드?1234
회원 가입 완료.


==========회원 전용 방명록=================
1.글쓰기(회원전용)
2.글보기
3.회원가입
4.회원명단(관리자전용)
선택(1~4, -1 종료)->1

아이디?kim
패스워드?1234
글내용?회원 전용 방명록 만들기 테스트중...
방명록 입력됨.

==========회원 전용 방명록=================
1.글쓰기(회원전용)
2.글보기
3.회원가입
4.회원명단(관리자전용)
선택(1~4, -1 종료)->2

글건수: 10건
---------------------------------------------------------
번호 아이디 글내용                               날짜
1    kim    회원 전용 방명록 만들기 테스트중... 2014-10-07
...

 

==========회원 전용 방명록=================
1.글쓰기(회원전용)
2.글보기
3.회원가입
4.회원명단(관리자전용)
선택(1~4, -1 종료)->4

관리자아이디?admin
관리자패스워드?test
관리자가 아닙니다.


==========회원 전용 방명록=================
1.글쓰기(회원전용)
2.글보기
3.회원가입
4.회원명단(관리자전용)
선택(1~4, -1 종료)->4

관리자아이디?admin
관리자패스워드?1234

회원수: 5명
----------------------------
번호 아이디 가입날짜
1    admin  2012-02-01
2    kim    2012-02-05
3    park   2012-02-06
...


-----------------------------------------------------
3. 데이터베이스 준비

--암호화 지원 함수(ENCRYPT) 작성

--회원정보 테이블
CREATE TABLE membersList (
 sid NUMBER
 ,id VARCHAR2(10)
 ,pwd VARCHAR2(50)
 ,wdate DATE DEFAULT SYSDATE
 ,admin CHAR(1) DEFAULT 'N'
);
--회원정보 시퀀스 객체 생성
CREATE SEQUENCE membersListSeq;

--id 컬럼에 PK 지정
ALTER TABLE membersList
 ADD CONSTRAINT membersList_id_pk PRIMARY KEY(id);

 

--관리자 아이디 사전 입력
->패스워드는 암호화 지정 추가
INSERT INTO membersList (sid, id, pwd, admin)
 VALUES (membersListSeq.nextval, '아이디', ENCRYPT('패스워드', '아이디'), 'Y');
COMMIT;


--샘플 사용자 등록
INSERT INTO membersList (sid, id, pwd)
 VALUES (membersListSeq.nextval, '아이디', ENCRYPT('패스워드', '아이디'));
COMMIT;

 

--방명록 테이블
CREATE TABLE guestBook (
 sid NUMBER
 ,id VARCHAR2(10)
 ,content VARCHAR2(500)
 ,wdate DATE DEFAULT SYSDATE
);

--방명록 시퀀스 객체 생성
CREATE SEQUENCE guestBookSeq;


--sid 컬럼에 PK 지정
ALTER TABLE guestBook
 ADD CONSTRAINT guestBook_sid_pk PRIMARY KEY(sid);


--id 컬럼에 FK 지정
ALTER TABLE guestBook
 ADD CONSTRAINT guestBook_id_fk
  FOREIGN KEY (id)
  REFERENCES membersList(id);

 


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

--회원 명단 출력 쿼리
SELECT sid, id
 , DECODE(TO_CHAR(wdate, 'YYYY-MM-DD'), TO_CHAR(SYSDATE, 'YYYY-MM-DD'), TO_CHAR(wdate, 'HH24:MI'), TO_CHAR(wdate, 'YYYY-MM-DD')) AS wdate
 , admin
 FROM membersList
 ORDER BY sid;

CREATE OR REPLACE VIEW membersListView
AS
SELECT sid, id
 , DECODE(TO_CHAR(wdate, 'YYYY-MM-DD'), TO_CHAR(SYSDATE, 'YYYY-MM-DD'), TO_CHAR(wdate, 'HH24:MI'), TO_CHAR(wdate, 'YYYY-MM-DD')) AS wdate
 , admin
 FROM membersList
 ORDER BY sid;

SELECT sid, id, wdate, admin FROM membersListView;

--문제) 회원수 출력 쿼리 작성


--문제) 관리자 확인 쿼리 작성. 아이디, 패스워드(암호화), 관리자옵션.


--방명록 글쓰기 쿼리
INSERT INTO guestBook (sid, id, content)
 VALUES (guestBookSeq.nextval, 'admin', '방명록 시작합니다.');
COMMIT;


--문제) 글 건수 출력 쿼리


--문제) 방명록 글보기 쿼리. 정렬 기준 글번호 오름차순.
--> 날짜 출력시 오늘은 시간:분 형태로, 오늘이 아니면 년-월-일 형태로 출력.
--> 뷰 생성

 


--문제) 회원 정보 확인 쿼리. 아이디, 패스워드(암호화).

 

 

--문제) 아이디 중복 확인 쿼리. 아이디.

 


--회원 가입 쿼리(아이디, 패스워드)
INSERT INTO membersList (sid, id, pwd)
 VALUES (membersListSeq.nextval, '아이디', ENCRYPT('패스워드', '아이디'));
COMMIT;

 

 

----------------------------------
4. 프로그램 구성

//DBConn.java -> 데이터베이스 연결

//GuestBookDTO.java -> 방명록 데이터 처리

//MemberDTO.java -> 회원 명단 데이터 처리

//GuestBookDAO.java -> 데이터베이스 액세스

//MenuAction.java -> 메뉴 처리

//Main.java -> 메인 메뉴

--------------------------------------------------
5. 소스 코드

//DBConn.java
package com.test;

import java.sql.*;

//데이터베이스 연결 액션 클래스
public class DBConn {
 
 //메소드들 내부에서 공통 사용하는 멤버는
 //멤버변수로 등록한다.
 //static 키워드 추가
 private static Connection conn;
 
 //커넥션 객체 준비 메소드
 //-> Singleton
 public static Connection getConnection() throws ClassNotFoundException, SQLException  {
  if (conn == null) {

   Class.forName("oracle.jdbc.driver.OracleDriver");
   //conn = DriverManager.getConnection("jdbc:oracle:thin:username/password@IP주소:1521:xe");;
   conn = DriverManager.getConnection("jdbc:oracle:thin:팀계정이름/팀계정패스워드@211.63.89.85:1521:xe");

  }
  return conn;
 }
 
 //마무리 메소드
 public static void close() {
  try {
   if (conn != null) {
    conn.close();
   }
  }catch(Exception e){
  }
  conn = null;
 }

}

 


//GuestBookDAO.java
package com.test;

import java.util.*;
import java.sql.*;

public class GuestBookDAO {
 
 //회원수 출력 메소드 (관리자 로그인)
 public int count() {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과(result 변수) 반환
  
  return result;
 }
 
 //회원 명단 출력 메소드 (관리자 로그인)
 public ArrayList<Member> memberList() {
  ArrayList<Member> result = new ArrayList<Member>();
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 Member 객체에 저장->Member 객체를 컬렉션에 저장
  //데이터베이스 연결 마무리
  //결과(컬렉션) 반환
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection();  
   
   String sql = String.format("SELECT sid, id, wdate, admin FROM membersListView");

   pstmt = conn.prepareStatement(sql);
   //바인딩 데이터 연결하는 과정
   ResultSet rs = pstmt.executeQuery(); //SELECT 쿼리인 경우
   
   while(rs.next()) {
    Member m = new Member();
    m.setSid(rs.getString("sid"));
    m.setId(rs.getString("id"));
    m.setWdate(rs.getString("wdate"));
    m.setAdmin(rs.getString("admin"));
    
    result.add(m);
   }
  
   rs.close();
  
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  } 
  
  return result;
 }
 
 
 //관리자 로그인(확인) 메소드
 public int adminLogin(String id, String pw) {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과(result 변수) 반환
  
  return result; //0 또는 1 반환.
 }
 


}

 

 

//Test.java
package com.test;

import java.util.Scanner;

public class Test {

 public static void main(String[] args) {
  
  GuestBookDAO dao = new GuestBookDAO();
  Scanner sc = new Scanner(System.in);
  
  if (adminLogin(sc, dao)) {
   
   System.out.printf("회원수 : %d명 %n", dao.count());
   System.out.println("--------------");
   System.out.println("SID ID WDATE ADMIN");
   for (Member m : dao.memberList()) {
    System.out.printf("%s %s %s %s %n"
      , m.getSid()
      , m.getId()
      , m.getWdate()
      , m.getAdmin());
   }
   
  } else {
   System.out.println("아이디 또는 패스워드가 틀렸습니다.");
  }
  
  sc.close();

 }
 
 
 //관리자 확인용 private 메소드
 private static boolean adminLogin(Scanner sc, GuestBookDAO dao) {
  boolean result = false;
  
  System.out.print("관리자아이디?");
  String id = sc.next();
  System.out.print("관리자패스워드?");
  String pw = sc.next();
  
  if (dao.adminLogin(id, pw) == 1) {
   result = true;
  }
  
  return result;
 }
 

}

 

 


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

 

 

 

'JDBC' 카테고리의 다른 글

12일차_방명록  (0) 2015.06.21
10일차_직원관리_최종버전  (0) 2015.06.21
9일차_직원관리  (0) 2015.06.21
8일차_직원관리  (0) 2015.06.21
7일차_직원관리  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

--------------------------------------
직원 관리
- JDBC 프로그램 작성은 아래 순서를 따른다.
기능 구현 분석 > 화면 구성 > 데이터베이스(샘플 쿼리) 준비 > 클래스 구성 분석 > 액션 코드 작성 > 테스트

5. 소스 코드

 

//MenuAction.java -> 메뉴 액션 클래스. 콘솔 액션.
package com.test;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.*;

public class MenuAction {
 
 private InsaDAO dao;
 
 public MenuAction() {
  dao = new InsaDAO();
 }
 
 //1. 직원 입력
 public void menu1(Scanner sc) {
 
  System.out.println("직원 정보 입력 --------------");
  System.out.println("(입력하는 과정에서 x 입력시 입력 중단)");
 
  //이름 입력 받는 부분
  String name;
  do {
   try {
    System.out.print("이름(20자 이내)?");
    name = sc.next();
    if (name.equalsIgnoreCase("x")) {
     System.out.println("입력 취소!");
     return;
    }
    if (name.length() > 20) {
     throw new Exception("20자 초과!");
    }
   
    break;
   
   }catch(Exception e){
    System.out.println(e.getMessage());
    //System.out.println();
   }
  }while(true);
 
  //주민번호 입력 받는 부분
  String ssn;
  do {
   try {
    System.out.print("주민번호(YYMMDD-NNNNNNN)?");
    ssn = sc.next();
    if (ssn.equalsIgnoreCase("x")) {
     System.out.println("입력 취소!");
     return;
    }
    if (!patternCheck("\\d{6}-\\d{7}", ssn)) {
     throw new Exception("주민번호(YYMMDD-NNNNNNN) 형식이 아닙니다!");
    }
   
    break;
   
   }catch(Exception e){
    System.out.println(e.getMessage());
    //System.out.println();
   }
  }while(true);
 
  //입사일 입력 받는 부분
  String ibsadate;
  do {
   try {
    System.out.print("입사일(YYYY-MM-DD)?");
    ibsadate = sc.next();
    if (ibsadate.equalsIgnoreCase("x")) {
     System.out.println("입력 취소!");
     return;
    }
    if (!dateCheck(ibsadate)) {
     throw new Exception("입사일(YYYY-MM-DD) 형식이 아닙니다!");
    }
   
    break;
   
   }catch(Exception e){
    System.out.println(e.getMessage());
    //System.out.println();
   }
  }while(true); 
 
 
  //전화번호 입력 받는 부분
  String tel;
  do {
   try {
    System.out.print("전화번호(010-XXXX-XXXX)?");
    tel = sc.next();
    if (tel.equalsIgnoreCase("x")) {
     System.out.println("입력 취소!");
     return;
    }
    if (!patternCheck("010-\\d{4}-\\d{4}", tel)) {
     throw new Exception("전화번호(010-XXXX-XXXX) 형식이 아닙니다!");
    }
   
    break;
   
   }catch(Exception e){
    System.out.println(e.getMessage());
    //System.out.println();
   }
  }while(true); 
 
 
  //지역번호 입력 받는 부분
  String cid;
  do {
   try {
    String cityList = cityList();
    System.out.printf("지역번호 종류(%s)%n", cityList);
    System.out.print("지역번호?");
    cid = sc.next();
    if (cid.equalsIgnoreCase("x")) {
     System.out.println("입력 취소!");
     return;
    }
    if (!cityList.contains(cid)) {
     throw new Exception("지역번호 범위가 아닙니다!");
    }
   
    break;
   
   }catch(Exception e){
    System.out.println(e.getMessage());
    //System.out.println();
   }
  }while(true);
 
 
  //부서번호 입력 받는 부분
  String bid;
  do {
   try {
    String buseoList = buseoList();
    System.out.printf("부서번호 종류(%s)%n", buseoList);
    System.out.print("부서번호?");
    bid = sc.next();
    if (bid.equalsIgnoreCase("x")) {
     System.out.println("입력 취소!");
     return;
    }
    if (!buseoList.contains(bid)) {
     throw new Exception("부서번호 범위가 아닙니다!");
    }
   
    break;
   
   }catch(Exception e){
    System.out.println(e.getMessage());
    //System.out.println();
   }
  }while(true);  
 
  //직위번호 입력 받는 부분
  String jid;
  do {
   try {
    String jikwiList = jikwiList();
    System.out.printf("직위번호 종류(%s)%n", jikwiList);
    System.out.print("직위번호?");
    jid = sc.next();
    if (jid.equalsIgnoreCase("x")) {
     System.out.println("입력 취소!");
     return;
    }
    if (!jikwiList.contains(jid)) {
     throw new Exception("직위번호 범위가 아닙니다!");
    }
   
    break;
   
   }catch(Exception e){
    System.out.println(e.getMessage());
    //System.out.println();
   }
  }while(true);  

  //기본급 입력 받는 부분
  String basicpay;
  // 해당항목만 다시 입력 가능하게 만듬.
  do {
   try {
    int minBasicpay = dao.getMinBasicPay(jid);
    System.out.printf("기본급(최소 %d원 이상)?", minBasicpay);
    basicpay = sc.next();
    if (basicpay.equalsIgnoreCase("x")) {
     System.out.println("입력취소!");
     return;
    }
    if (Integer.parseInt(basicpay) < minBasicpay) {
     throw new Exception(String.format("최소 %d원 이상이어야 합니다.", minBasicpay));

    }

    break;
   
   } catch (Exception e) {
    System.out.println(e.getMessage());
    System.out.println();
   }
  } while (true);
 
  //수당 입력 받는 부분
  String sudang;
  do {
   try {
    System.out.print("수당? ");
    sudang = sc.next();
    if (sudang.equalsIgnoreCase("x")) {
     System.out.println("입력취소!");
     return;
    }

    break;
   
   } catch (Exception e) {
    System.out.println(e.getMessage());
    System.out.println();
   }
  } while (true); 
 
  //데이터베이스 자료 저장 액션
  Insa insa = new Insa();
  insa.setName(name);
  insa.setSsn(ssn);
  insa.setIbsadate(ibsadate);
  insa.setTel(tel);
  insa.setCid(cid);
  insa.setBid(bid);
  insa.setJid(jid);
  insa.setBasicPay(Integer.parseInt(basicpay));
  insa.setSudang(Integer.parseInt(sudang));
  int result = dao.add(insa);
  System.out.printf("%d개의 행이 삽입 되었습니다.", result);
 
 }
 
 //2. 직원 전체 출력
 public void menu2(Scanner sc) {
  //서브메뉴 임시 테스트
  //subMenu2("num");
 
  //서브메뉴
  do {
   //문제)
   //서브메뉴 종류 출력
   //서브메뉴 선택
  
   //서브메뉴별로 정렬 기준 제시
   //->private 메소드 호출
   //예를 들어,
   //case "1": subMenu2("num"); break;
   //case "2": subMenu2("name"); break;
   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, x 종료)?");
   String m = sc.next();
   if (m.equalsIgnoreCase("x")) {
    break;
   }
  
   switch (m) {
   case "1": subMenu2("num"); break;
   case "2": subMenu2("name"); break;
   case "3": subMenu2("city"); break;
   case "4": subMenu2("buseo"); break;
   case "5": subMenu2("jikwi"); break;
   }
   System.out.println();
  
  }while(true);
 }
 
 //menu2에 대한 서브 메뉴 메소드
 private void subMenu2(String key) {
  System.out.printf("전체 인원: %d명%n", dao.count());
  System.out.println("----------------------");
  //사번,이름,주민번호,입사일,전화번호
  //,지역,부서,직위,기본급,수당,급여
  System.out.println("NUM NAME SSN IBSADATE TEL CITY BUSEO JIKWI BASICPAY SUDANG PAY");
  for (Insa insa : dao.list(key)) {
   System.out.printf("%s %s %s %s %s %s %s %s %,d %,d %,d %n"
     , insa.getNum()
     , insa.getName()
     , insa.getSsn()
     , insa.getIbsadate()
     , insa.getTel()
     , insa.getCity()
     , insa.getBuseo()
     , insa.getJikwi()
     , insa.getBasicPay()
     , insa.getSudang()
     , insa.getPay()
     );
  }
 }

 //3. 직원 검색 출력
 public void menu3(Scanner sc) {
  //서브메뉴
  do {
   //문제)
   //서브메뉴 종류 출력
   //서브메뉴 선택
  
   //서브메뉴별로 정렬 기준 제시
   //->private 메소드 호출
   //예를 들어,
   //case "1": subMenu3(sc, 1); break;
   //case "2": subMenu3(sc, 2); break;
   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, x 종료)?");
   String m = sc.next();
   if (m.equalsIgnoreCase("x")) {
    break;
   }
  
   switch (m) {
   case "1": subMenu3(sc, 1); break;
   case "2": subMenu3(sc, 2); break;
   case "3": subMenu3(sc, 3); break;
   case "4": subMenu3(sc, 4); break;
   case "5": subMenu3(sc, 5); break;
   }
   System.out.println();
  
  }while(true);

 }
 
 //menu3에 대한 서브 메뉴 메소드
 private void subMenu3(Scanner sc, int m) {
  String[] arr1 = {"", "사번", "이름", "지역", "부서", "직위"};
  String[] arr2 = {"", "num", "name", "city", "buseo", "jikwi"};
  System.out.printf("검색할 %s?", arr1[m]);
  String value = sc.next();
  String key = arr2[m];
 
  System.out.printf("검색 인원: %d명%n", dao.count(key, value));
  System.out.println("----------------------");
  ArrayList<Insa> list = dao.list(key, value);
  if (list.size() > 0) {
   //사번,이름,주민번호,입사일,전화번호
   //,지역,부서,직위,기본급,수당,급여
   System.out.println("NUM NAME SSN IBSADATE TEL CITY BUSEO JIKWI BASICPAY SUDANG PAY");
   for (Insa insa : list) {
    System.out.printf("%s %s %s %s %s %s %s %s %,d %,d %,d %n"
      , insa.getNum()
      , insa.getName()
      , insa.getSsn()
      , insa.getIbsadate()
      , insa.getTel()
      , insa.getCity()
      , insa.getBuseo()
      , insa.getJikwi()
      , insa.getBasicPay()
      , insa.getSudang()
      , insa.getPay()
      );
   }
  } else {
   System.out.println("검색 결과 없습니다.");
  }
 
 }

 //4. 직원 삭제
 public void menu4(Scanner sc) {
 
  System.out.print("삭제하고자하는 자료의 사번?");
  String num = sc.next();
 
  ArrayList<Insa> list = dao.list("num", num);
  if (list.size() > 0) {
   System.out.println("NUM NAME SSN IBSADATE TEL CITY BUSEO JIKWI BASICPAY SUDANG PAY");
   for (Insa insa : list) {
    System.out.printf("%s %s %s %s %s %s %s %s %,d %,d %,d %n"
      , insa.getNum()
      , insa.getName()
      , insa.getSsn()
      , insa.getIbsadate()
      , insa.getTel()
      , insa.getCity()
      , insa.getBuseo()
      , insa.getJikwi()
      , insa.getBasicPay()
      , insa.getSudang()
      , insa.getPay()
      );
   }
  
   System.out.print("이 자료를 삭제하시겠습니까(Y/N)?");
   String c = sc.next();
   if (c.equalsIgnoreCase("y")) {
    int result = dao.remove(num);
    System.out.printf("%d개의 행이 삭제되었습니다.%n", result);
   }
  
  } else {
   System.out.println("검색 결과 없습니다.");
  }
 
 
 }

 //패턴 검사 private 메소드
 private static boolean patternCheck(String pattern, String value) {
  Pattern p = Pattern.compile(pattern);
  Matcher m = p.matcher(value);
  return m.matches();
 }
 
 //날짜 검사 private 메소드
 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;
 }
 
 private String cityList() {
  StringBuilder sb = new StringBuilder();
 
  for (City c : dao.cityList()) {
   sb.append(String.format("%s-%s "
     ,c.getCid(), c.getCity()));
  }
 
  return sb.toString();
 }

 private String buseoList() {
  StringBuilder sb = new StringBuilder();
 
  for (Buseo b : dao.buseoList()) {
   sb.append(String.format("%s-%s "
     ,b.getBid(), b.getBuseo()));
  }

  return sb.toString();
 }

 private String jikwiList() {
  StringBuilder sb = new StringBuilder();
 
  for (Jikwi j : dao.jikwiList()) {
   sb.append(String.format("%s-%s "
     ,j.getJid(), j.getJikwi()));
  }

  return sb.toString();
 }
 
}

=======================

 

//Main.java -> 메인 클래스. 콘솔 액션.
package com.test;

import java.util.*;

public class Main {
 public static void main(String ar[]) throws Exception {

  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.println("- 사번 정렬");
   System.out.println("- 이름 정렬");
   System.out.println("- 지역 정렬");
   System.out.println("- 부서 정렬");
   System.out.println("- 직위 정렬");
   System.out.println("3. 직원 검색 출력");
   System.out.println("- 사번 검색");
   System.out.println("- 이름 검색");
   System.out.println("- 지역 검색");
   System.out.println("- 부서 검색");
   System.out.println("- 직위 검색");
   System.out.println("4. 직원 삭제");
   System.out.print("선택(1~4, x 종료)?");
   int m = sc.nextInt();
   if (m == 0) {
    break;
   }
   switch (m) {
   case 1:
    menu.menu1(sc);
    break;
   case 2:
    menu.menu2(sc);
    break;
   case 3:
    menu.menu3(sc);
    break;
   case 4:
    menu.menu4(sc);
    break;
   }
   try {

   } catch (Exception e) {
    System.out.println(e.toString());
   }
  } while (true);
  sc.close();
 }
}

 

 

 

 

==============================

 

//City.java -> 지역 정보 자료형 클래스
package com.test;

//자료형 클래스
public class City {
 
 private String cid, city;

 public String getCid() {
  return cid;
 }

 public void setCid(String cid) {
  this.cid = cid;
 }

 public String getCity() {
  return city;
 }

 public void setCity(String city) {
  this.city = city;
 }
 
}

 

=================================

 

//Buseo.java -> 부서 정보 자료형 클래스
package com.test;

//자료형클래스
public class Buseo {
 
 private String bid, buseo;

 public String getBid() {
  return bid;
 }

 public void setBid(String bid) {
  this.bid = bid;
 }

 public String getBuseo() {
  return buseo;
 }

 public void setBuseo(String buseo) {
  this.buseo = buseo;
 }
}
======================================

 

//Jikwi.java -> 직위 정보 자료형 클래스
package com.test;

//자료형클래스
public class Jikwi {

 private String jid, jikwi;
 private int min_Basicpay;
 public String getJid() {
  return jid;
 }
 public void setJid(String jid) {
  this.jid = jid;
 }
 public String getJikwi() {
  return jikwi;
 }
 public void setJikwi(String jikwi) {
  this.jikwi = jikwi;
 }
 public int getMin_Basicpay() {
  return min_Basicpay;
 }
 public void setMin_Basicpay(int min_Basicpay) {
  this.min_Basicpay = min_Basicpay;
 }
}
===============================================

 

//Insa.java -> 직원 정보 자료형 클래스
package com.test;

//자료형클래스
public class Insa {

 // 멤버변수 -> num, name, ssn, ibsadate,tel, city, buseo, jikwi, basicpay, sudang, pay, cid, bid, jid
 private String num, name, ssn, ibsadate, tel, city, buseo, jikwi, cid, bid,jid;

 //basicpay, sudang, pay를 int형으로 하는 이유 : 나중에 천 단위 별로 , 을 찍어내는 서식을 나타내기 위해
 private int basicpay, sudang, pay;
 
 public String getNum() {
  return num;
 }
 public void setNum(String num) {
  this.num = num;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSsn() {
  return ssn;
 }
 public void setSsn(String ssn) {
  this.ssn = ssn;
 }
 public String getIbsadate() {
  return ibsadate;
 }
 public void setIbsadate(String ibsadate) {
  this.ibsadate = ibsadate;
 }
 public String getTel() {
  return tel;
 }
 public void setTel(String tel) {
  this.tel = tel;
 }
 public String getCity() {
  return city;
 }
 public void setCity(String city) {
  this.city = city;
 }
 public String getBuseo() {
  return buseo;
 }
 public void setBuseo(String buseo) {
  this.buseo = buseo;
 }
 public String getJikwi() {
  return jikwi;
 }
 public void setJikwi(String jikwi) {
  this.jikwi = jikwi;
 }
 public String getCid() {
  return cid;
 }
 public void setCid(String cid) {
  this.cid = cid;
 }
 public String getBid() {
  return bid;
 }
 public void setBid(String bid) {
  this.bid = bid;
 }
 public String getJid() {
  return jid;
 }
 public void setJid(String jid) {
  this.jid = jid;
 }
 public int getBasicpay() {
  return basicpay;
 }
 public void setBasicpay(int basicpay) {
  this.basicpay = basicpay;
 }
 public int getSudang() {
  return sudang;
 }
 public void setSudang(int sudang) {
  this.sudang = sudang;
 }
 public int getPay() {
  return pay;
 }
 public void setPay(int pay) {
  this.pay = pay;
 }

}

=====================================================

 

//insaDAO
package com.test;

import java.sql.*;
import java.util.*;

//데이터베이스 액션 클래스
public class InsaDAO {

 // 직원 정보 출력 메소드
 // 반환 자료형 -> ArrayList<Insa>;
 // 매개변수 -> key -> 정렬기준(사번,이름,지역,부서,직위)
 // ==========================================================
 // ->DB에서 정렬된 값을 받는다. ORDER BY이용.(5종류)
 // 정렬방법(사번,이름,지역,부서,직위) 각 기준별로 작성.
 // select 구문을 기준별 작성 후, select쿼리 실행!
 // ==========================================================

 public ArrayList<Insa> list(String key) {
  ArrayList<Insa> result = new ArrayList<Insa>();

  Connection conn = null;
  PreparedStatement pstmt = null;

  try {
   conn = DBConn.getConnection();
   // switch(key){
   // case "사번"
   // sql += "ORDER BY num";
   // break;
   // case "이름"
   // sql += "ORDER BY name";
   // }
   String sql = String
     .format("SELECT num, name, ssn, ibsadate, city, tel, buseo, jikwi, basicpay, sudang, pay from insaView ORDER BY %s",
       key);
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   while (rs.next()) {
    String num = rs.getString("num");
    String name = rs.getString("name");
    String ssn = rs.getString("ssn");
    String ibsadate = rs.getString("ibsadate");
    String city = rs.getString("city");
    String tel = rs.getString("tel");
    String buseo = rs.getString("buseo");
    String jikwi = rs.getString("jikwi");
    int basicpay = rs.getInt("basicpay");
    int sudang = rs.getInt("sudang");
    int pay = rs.getInt("pay");

    Insa i = new Insa();
    i.setNum(num);
    i.setName(name);
    i.setSsn(ssn);
    i.setIbsadate(ibsadate);
    i.setCity(city);
    i.setTel(tel);
    i.setBuseo(buseo);
    i.setJikwi(jikwi);
    i.setBasicpay(basicpay);
    i.setSudang(sudang);
    i.setPay(pay);
    result.add(i);
   }
   rs.close();

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   } catch (Exception e) {

   }
   DBConn.close();
  }
  return result;
 }

 // ======================================================================================================

 // 직원 정보 검색
 // 반환 자료형 -> ArrayList<Insa>;
 // 매개변수 -> key(검색기준), value(검색단어) -> 정렬기준(사번,이름,지역,부서,직위) 검색
 // ==========================================================
 // ->DB에서 정렬된 값을 받는다. ORDER BY sid; 이용.
 // ==========================================================
 // 검색 기준별로 검색 액션 준비
 // 검색 액션은 WHERE 컬럼명 = 값; 구문 준비(5종류)
 public ArrayList<Insa> list(String key, String value) {
  ArrayList<Insa> result = new ArrayList<Insa>();

  Connection conn = null;
  PreparedStatement pstmt = null;

  try {
   conn = DBConn.getConnection();
   String sql = String
     .format("select num, name, ssn, ibsadate, city, tel, buseo, jikwi, basicpay, sudang, pay from insaView where %s = ? order by num",
       key);

   // where %s=? => where name = '홍길동' => O
   // where ?=? => where 'name' = '홍길동' => X

   pstmt = conn.prepareStatement(sql);
   pstmt.setString(1, value);

   ResultSet rs = pstmt.executeQuery();
   while (rs.next()) {

    String num = rs.getString("num");
    String name = rs.getString("name");
    String ssn = rs.getString("ssn");
    String ibsadate = rs.getString("ibsadate");
    String city = rs.getString("city");
    String tel = rs.getString("tel");
    String buseo = rs.getString("buseo");
    String jikwi = rs.getString("jikwi");
    int basicpay = rs.getInt("basicpay");
    int sudang = rs.getInt("sudang");
    int pay = rs.getInt("pay");

    Insa i = new Insa();
    i.setNum(num);
    i.setName(name);
    i.setSsn(ssn);
    i.setIbsadate(ibsadate);
    i.setCity(city);
    i.setTel(tel);
    i.setBuseo(buseo);
    i.setJikwi(jikwi);
    i.setBasicpay(basicpay);
    i.setSudang(sudang);
    i.setPay(pay);
    result.add(i);
   }
   rs.close();

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   } catch (Exception e) {

   }
   DBConn.close();
  }
  return result;
 }

 // ======================================================================================================
 // 직원삭제 메소드
 // 반환자료형 -> int형 -> 삭제된 로우의 갯수 반환
 // 매개변수 -> String num -> 사번을 외부에서 전달받음.
 public int remove(String num) {
  int result = 0;

  Connection conn = null;
  PreparedStatement pstmt = null;

  try {
   conn = DBConn.getConnection();
   // 삭제 쿼리.delete from insa where num = 1060
   String sql = String.format("delete from insa where num = ?");
   pstmt = conn.prepareStatement(sql);
   pstmt.setInt(1, Integer.parseInt(num));
   // delete from insa where num = 1060;

   result = pstmt.executeUpdate();

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   } catch (Exception e) {

   }
   DBConn.close();
  }
  return result;

 }

 // ======================================================================================================
 // 직원정보 입력 메소드
 // 데이터베이스 연결, 입력쿼리 준비
 // Insert ...
 // 바인딩 문자열에 변수값 (insa.getxxx())바인딩
 /*
  * (Insert into insa(num, name, ssn, ibsadate, tel, cid, bid, jid, basicpay,
  * sudang) values((select MAX(num)+1 as newNum from insa),?,?,?,?,?,?,?,?,?)
  */
 // (select MAX(num)+1 as newNum from insa) 시퀀스 사용안하고 기존데이터와 번호가 겹치지 않게 생성하는
 // 쿼리.
 // 입력쿼리 샐행 -> 결과값을 변수에 저장
 // 0-> 입력 실패, 1 -> 입력 성공
 // 데이터베이스 연결 마무리
 // 결과값 반환

 public int add(Insa i) {
  int result = 0;

  Connection conn = null;
  PreparedStatement pstmt = null;

  try {
   conn = DBConn.getConnection();
   String sql = String
     .format("Insert into insa(num, name, ssn, ibsadate, tel, cid, bid, jid, basicpay, sudang) values((select MAX(num)+1 as newNum from insa),?,?,?,?,?,?,?,?,?)");
   pstmt = conn.prepareStatement(sql);

   pstmt.setString(1, i.getName());
   pstmt.setString(2, i.getSsn());
   pstmt.setString(3, i.getIbsadate());
   pstmt.setString(4, i.getTel());
   pstmt.setInt(5, Integer.parseInt(i.getCid()));
   pstmt.setInt(6, Integer.parseInt(i.getBid()));
   pstmt.setInt(7, Integer.parseInt(i.getJid()));
   pstmt.setInt(8, i.getBasicpay());
   pstmt.setInt(9, i.getSudang());
   result = pstmt.executeUpdate();

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   } catch (Exception e) {

   }
   DBConn.close();
  }

  return result;
 }
 
 //======================================================================================================

 // 부서,직위,시티의 메소드의 역할 = 명단을 불러오는 역할.

 // 지역 정보 출력 메소드

 // 데이터 베이스 연결
 // select 쿼리 준비 및 실행
 // 결과를 변수 city객체 저장 -> 컬렉션(clist)
 // 데이터 베이스 연결 마무리
 // 컬렉션 반환

 public ArrayList<City> cityList() {
  ArrayList<City> clist = new ArrayList<City>();

  Connection conn = null;
  PreparedStatement pstmt = null;

  try {
   conn = DBConn.getConnection();
   String sql = String
     .format("select cid, city from city order by cid");
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   while (rs.next()) {
    String cid = rs.getString("cid");
    String city = rs.getString("city");
    City c = new City();
    c.setCid(cid);
    c.setCity(city);
    clist.add(c);
   }
   rs.close();

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   } catch (Exception e) {

   }
   DBConn.close();
  }

  return clist;
 }
 //======================================================================================================
 // 부서 정보 출력 메소드
 public ArrayList<Buseo> buseoList() {
  ArrayList<Buseo> blist = new ArrayList<Buseo>();

  Connection conn = null;
  PreparedStatement pstmt = null;

  try {
   conn = DBConn.getConnection();
   String sql = String
     .format("select bid, buseo from buseo order by bid");
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   while (rs.next()) {
    String bid = rs.getString("bid");
    String buseo = rs.getString("buseo");
    Buseo b = new Buseo();
    b.setBid(bid);
    b.setBuseo(buseo);
    blist.add(b);
   }
   rs.close();

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   } catch (Exception e) {

   }
   DBConn.close();
  }

  return blist;
 }
 //======================================================================================================
 // 직위 정보 출력 메소드
 public ArrayList<Jikwi> jikwiList() {
  ArrayList<Jikwi> jlist = new ArrayList<Jikwi>();

  Connection conn = null;
  PreparedStatement pstmt = null;

  try {
   conn = DBConn.getConnection();
   String sql = String
     .format("select jid, jikwi,min_basicpay from jikwi order by jid");
   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();

   while (rs.next()) {
    String jid = rs.getString("jid");
    String jikwi = rs.getString("jikwi");
    int min_basicpay = rs.getInt("min_basicpay");

    Jikwi j = new Jikwi();
    j.setJid(jid);
    j.setJikwi(jikwi);
    j.setMin_Basicpay(min_basicpay);
    jlist.add(j);
   }
   rs.close();

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   } catch (Exception e) {

   }
   DBConn.close();
  }

  return jlist;
 }
 //======================================================================================================
 // 직원 전체 인숸수 반환 메소드
 public int count() {
  int result = 0;

  Connection conn = null;
  PreparedStatement pstmt = null;

  try {
   conn = DBConn.getConnection();

   String sql = String
     .format("SELECT COUNT(*) AS \"count\" FROM insaView");

   pstmt = conn.prepareStatement(sql);
   ResultSet rs = pstmt.executeQuery();
   while (rs.next()) {
    result = rs.getInt("count");
   }
   rs.close();
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   DBConn.close();
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   } catch (Exception e) {

   }
  }
  return result;
 }

 //======================================================================================================
 // key, value는 검색조건에 맞는 인원수 출력
 public int count(String key, String value) {
  int result = 0;

  Connection conn = null;
  PreparedStatement pstmt = null;

  try {
   conn = DBConn.getConnection();
   String sql = String
     .format("select COUNT(*) AS \"count\" from insaView where %s = ?",
       key);

   pstmt = conn.prepareStatement(sql);
   pstmt.setString(1, value);

   ResultSet rs = pstmt.executeQuery();

   while (rs.next()) {
    result = rs.getInt("count");

   }
   rs.close();

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   } catch (Exception e) {

   }
   DBConn.close();
  }

  return result;
 }
 //======================================================================================================
 // 최소 기본급 검색 쿼리
 public int getMinBasicPay(String jid) {
  int result = 0;

  Connection conn = null;
  PreparedStatement pstmt = null;

  try {
   conn = DBConn.getConnection();
   String sql = String
     .format("select min_basicPay from jikwi where jid = ?");

   pstmt = conn.prepareStatement(sql);
   pstmt.setInt(1, Integer.parseInt(jid));

   ResultSet rs = pstmt.executeQuery();

   while (rs.next()) {
    result = rs.getInt("min_basicPay");

   }
   rs.close();

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   } catch (Exception e) {

   }
   DBConn.close();
  }
  return result;
 }
 
 //======================================================================================================
 //자바에서만 실행 가능.
 //내가 입력한 명령어의 패턴을 검사하여 일치하는지 확인.
 
}

 

=================================

 

patterTest

package com.test;

import java.util.regex.*;

public class PatternTest {
 public static void main(String ar[]) {

  String ssn = "123456-1234567";
  String ssnPattern = "\\d{6}-\\d{7}";

  // 주민번호 형식 검사
  // 정규식표현 ->\d{6}-\d{7}
  // ->자바사용시 ->\\d{6}-\\d{7}
  // 숫자 6자리 - 숫자 7자리 의 형식을 갖춰야 일치여부 판별

  Pattern p = Pattern.compile(ssnPattern); // ("패턴문자");
  Matcher m = p.matcher(ssn); // (비교문자);
  if (PatternCheck(ssnPattern, ssn)) {
   System.out.println("SSN : 일치합니다");
  } else {
   System.out.println("SSN : 불일치 합니다.");
  }

  // 전화번호 형식 검사
  String tel = "010-1023-1234";
  String telPattern = "010-\\d{4}-\\d{4}";

  if (PatternCheck(telPattern, tel)) {
   System.out.println("TEL : 일치합니다");
  } else {
   System.out.println("TEL : 불일치 합니다.");
  }
  
  //날짜 형식 검사
  String ibsadate = "2015-15-15";
  String datePattern= "\\d{4}-\\d{2}-\\d{2}";

  if (PatternCheck(datePattern, ibsadate)) {
   System.out.println("IbsaDate : 일치합니다");
  } else {
   System.out.println("IbsaDate : 불일치 합니다.");
  }  
  

 }

 private static boolean PatternCheck(String pattern, String value) {
  Pattern p = Pattern.compile(pattern); // ("패턴문자");
  Matcher m = p.matcher(value); // (비교문자);
  return m.matches();
 }
}

 

=========================

 

removeTest

package com.test;

import java.util.*;

public class RemoveTest {
 public static void main(String ar[]) {

  InsaDAO dao = new InsaDAO();
  Scanner sc = new Scanner(System.in);

  String num = "1060";

  ArrayList<Insa> list = dao.list("num", num);
  if (list.size() > 0) {
   // 검색결과 있는것. 결과 있을경우 결과출력 / 삭제진행
   for (Insa i : list) {
    System.out.printf("%s %s %s %s %s %s %s %s %,d %,d %,d %n",
      i.getNum(), i.getName(), i.getSsn(), i.getIbsadate(),
      i.getTel(), i.getCity(), i.getBuseo(), i.getJikwi(),
      i.getBasicpay(), i.getSudang(), i.getPay());
   }

   System.out.println("이 자료를 삭제 하시겠습니까?(Y/N)");
   String m = sc.next();
   if (m.equalsIgnoreCase("y")) {
    // 삭제진행 -> private메소드
    delete(num);
    //dao.remove(num);
   }

  } else {
   // 검색결과 없는것.
   System.out.println("검색결과 없습니다.");
  }
 }

 private static int delete(String num) {
  int result = 0;
  InsaDAO dao = new InsaDAO();
  result = dao.remove(num);
  return result;
 }
}
==========================

 

ListTest

package com.test;

import java.util.*;

public class ListTest {
 public static void main(String ar[]) {

  InsaDAO dao = new InsaDAO();
  System.out.printf("지역번호 종류(%s)%n",cityList(dao));
  System.out.printf("부서번호 종류(%s)%n",BuseoList(dao));
  System.out.printf("직위번호 종류(%s)%n",JikwiList(dao));
  
  
  
 }

 private static String cityList(InsaDAO dao) {
  StringBuilder sb = new StringBuilder();
  
  for(City c : dao.cityList()){
   sb.append(String.format("%s-%s ", c.getCid(),c.getCity()));
   
  }
  
  return sb.toString();
 }
 
 private static String BuseoList(InsaDAO dao){
  StringBuilder sb = new StringBuilder();
  
  for(Buseo b : dao.buseoList()){
   sb.append(String.format("%s-%s ", b.getBid(),b.getBuseo()));
  }
  return sb.toString();
 }
 
 private static String JikwiList(InsaDAO dao){
  StringBuilder sb = new StringBuilder();
  
  for(Jikwi j : dao.jikwiList()){
   sb.append(String.format("%s-%s ",j.getJid(),j.getJikwi()));
  }
  return sb.toString();
 }
}
=======================

CountTest

package com.test;

public class CountTest {
 public static void main(String ar[]){
  
  InsaDAO dao = new InsaDAO();
  
  System.out.printf("전체 인원수 : %s명 %n", dao.count());
  String key = "buseo";
  String value = "개발부";
  System.out.printf("검색 인원수 : %s명%n",dao.count(key, value));
 }
}
=======================

AddTest

package com.test;
import java.util.*;
public class AddTest {
 public static void main(String ar[]) {
  Scanner sc = new Scanner(System.in);
  InsaDAO dao = new InsaDAO();
  
  //name, ssn, ibsadate, tel, cid, bid, jid, basicpay, sudang
  String name = "황길동";
  String ssn = "620211-2354846";
  String ibsadate = "1999-03-02";
  //07/03/02, 19910301, 1999-03-02
  String tel = "011-796-3541";
  String cid = "2";
  String bid = "3";
  String jid = "1";
  int basicpay = 1500000;
  int sudang = 3000000;
  
  Insa insa = new Insa();
  insa.setName(name);
  insa.setSsn(ssn);
  insa.setIbsadate(ibsadate);
  insa.setTel(tel);
  insa.setCid(cid);
  insa.setBid(bid);
  insa.setJid(jid);
  insa.setBasicpay(basicpay);
  insa.setSudang(sudang);
  
  //정상적인 입력액션 -> 1개의 행이 삽입되었습니다.
  //에러 발생 -> 0개의 행이 삽입되었습니다.
  int result = dao.add(insa);
  System.out.printf("%d개의 행이 입력 되었습니다. %n", result);
 }
}

'JDBC' 카테고리의 다른 글

12일차_방명록  (0) 2015.06.21
11일차_방명록  (0) 2015.06.21
9일차_직원관리  (0) 2015.06.21
8일차_직원관리  (0) 2015.06.21
7일차_직원관리  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

9일차_직원관리

JDBC 2015. 6. 21. 07:31

--------------------------------------
직원 관리
- JDBC 프로그램 작성은 아래 순서를 따른다.
기능 구현 분석 > 화면 구성 > 데이터베이스(샘플 쿼리) 준비 > 클래스 구성 분석 > 액션 코드 작성 > 테스트

5. 소스 코드

//City.java
package com.test;

//자료형 클래스
public class City {
 
 private String cid, city;

 public String getCid() {
  return cid;
 }

 public void setCid(String cid) {
  this.cid = cid;
 }

 public String getCity() {
  return city;
 }

 public void setCity(String city) {
  this.city = city;
 }

}

 

 


//Buseo.java
package com.test;

//자료형 클래스
public class Buseo {
 
 private String bid, buseo;

 public String getBid() {
  return bid;
 }

 public void setBid(String bid) {
  this.bid = bid;
 }

 public String getBuseo() {
  return buseo;
 }

 public void setBuseo(String buseo) {
  this.buseo = buseo;
 }
 
 

}

 

 


//Jikwi.java
package com.test;

//자료형 클래스
public class Jikwi {
 
 private String jid, jikwi;
 private int min_BasicPay;
 
 public String getJid() {
  return jid;
 }
 public void setJid(String jid) {
  this.jid = jid;
 }
 public String getJikwi() {
  return jikwi;
 }
 public void setJikwi(String jikwi) {
  this.jikwi = jikwi;
 }
 public int getMin_BasicPay() {
  return min_BasicPay;
 }
 public void setMin_BasicPay(int min_BasicPay) {
  this.min_BasicPay = min_BasicPay;
 }

}

 

 

 

//InsaDAO.java
package com.test;

import java.sql.*;
import java.util.*;

//데이터베이스 액션 클래스
public class InsaDAO {
 
 //직원 정보 출력 메소드
 //반환자료형 -> ArrayList<Insa>
 //매개변수 -> key -> 정렬 기준(사번, 이름, 지역, 부서, 직위)
 public ArrayList<Insa> list(String key) {
  ArrayList<Insa> result = new ArrayList<Insa>();
  
  //문제)
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비
  //SELECT num, name, ssn, ibsadate, tel, city, buseo, jikwi
  // ,basicPay, sudang, pay
     //  FROM insaView
     //  ORDER BY num;
  //-> 정렬 액션은 데이터베이스에서 처리
  //-> ORDER BY 구문
  //-> SELECT 구문을 정렬 기준별로 작성
  //3. SELECT 쿼리 실행
  //4. 결과를 컬렉션 저장
  //5. 데이터베이스 연결 마무리
  //6. 결과 반환
  
  /*
  String sql = String.format("SELECT 쿼리...");
  switch (key) {
  case "사번": sql += " ORDER BY num"; break;
  case "이름": sql += " ORDER BY name"; break;
  ...
  }
  */
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection();  
   
   String sql = String.format("SELECT num, name, ssn, ibsadate, tel, city, buseo, jikwi, basicPay, sudang, pay FROM insaView ORDER BY %s", key);

   pstmt = conn.prepareStatement(sql);
   //바인딩 데이터 연결하는 과정
   ResultSet rs = pstmt.executeQuery(); //SELECT 쿼리인 경우
   
   while(rs.next()) {
    //num, name, ssn, ibsadate
    //, tel, city, buseo, jikwi
    //, basicPay, sudang, pay
    Insa i = new Insa();
    i.setNum(rs.getString("num"));
    i.setName(rs.getString("name"));
    i.setSsn(rs.getString("ssn"));
    i.setIbsadate(rs.getString("ibsadate"));
    i.setTel(rs.getString("tel"));
    i.setCity(rs.getString("city"));
    i.setBuseo(rs.getString("buseo"));
    i.setJikwi(rs.getString("jikwi"));
    i.setBasicPay(rs.getInt("basicPay"));
    i.setSudang(rs.getInt("sudang"));
    i.setPay(rs.getInt("pay"));
    
    result.add(i);
   }
  
   rs.close();
  
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }  
  
  return result;
 }
 
 
 //직원 정보 검색 메소드
 //반환자료형 -> ArrayList<Insa>
 //매개변수 -> key, value -> 검색 기준(사번, 이름, 지역, 부서, 직위), 검색 단어
 //(->메소드 오버로딩)
 public ArrayList<Insa> list(String key, String value) {
  ArrayList<Insa> result = new ArrayList<Insa>();
  
  //문제)
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비
  //-> 검색 기준별로 검색 액션 준비
  //-> 검색 액션은 WHERE 컬럼명=? 구문 준비
  //-> ORDER BY num
  //3. SELECT 쿼리 실행
  //4. 결과를 컬렉션 저장
  //5. 데이터베이스 연결 마무리
  //6. 결과 반환
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection();  
   
   String sql = String.format("SELECT num, name, ssn, ibsadate, tel, city, buseo, jikwi, basicPay, sudang, pay FROM insaView WHERE %s=? ORDER BY num", key);

   pstmt = conn.prepareStatement(sql);
   //바인딩 데이터 연결하는 과정
   pstmt.setString(1, value);
   ResultSet rs = pstmt.executeQuery(); //SELECT 쿼리인 경우
   
   while(rs.next()) {
    //num, name, ssn, ibsadate
    //, tel, city, buseo, jikwi
    //, basicPay, sudang, pay
    Insa i = new Insa();
    i.setNum(rs.getString("num"));
    i.setName(rs.getString("name"));
    i.setSsn(rs.getString("ssn"));
    i.setIbsadate(rs.getString("ibsadate"));
    i.setTel(rs.getString("tel"));
    i.setCity(rs.getString("city"));
    i.setBuseo(rs.getString("buseo"));
    i.setJikwi(rs.getString("jikwi"));
    i.setBasicPay(rs.getInt("basicPay"));
    i.setSudang(rs.getInt("sudang"));
    i.setPay(rs.getInt("pay"));
    
    result.add(i);
   }
  
   rs.close();
  
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }  
  
  return result;
 }
 
 //직원 정보 삭제 메소드
 //반환자료형 -> int형 -> 삭제된 로우의 갯수 반환
 //매개변수 -> String num -> 사번을 외부에서 전달 받는다.
 public int remove(String num) {

  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //삭제 쿼리 준비
  //DELETE FROM insa WHERE num=?
  //바인딩 문자열에 num 변수값 바인딩
  //삭제 쿼리 실행->결과값을 변수에 저장
  //데이터베이스 연결 마무리
  //결과값 반환
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection();  
   
   String sql = String.format("DELETE FROM insa WHERE num=?");

   pstmt = conn.prepareStatement(sql);
   //바인딩 데이터 연결하는 과정
   pstmt.setInt(1, Integer.parseInt(num));
   result = pstmt.executeUpdate(); //INSERT, DELETE, UPDATE
  
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }   
  
  return result;
  
 }
 
 
 //직원 정보 입력 메소드
 public int add(Insa insa) {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //입력 쿼리 준비
  //INSERT INTO insa (num, name, ssn, ibsadate, tel
  //  , cid, bid, jid
  //  ,basicPay, sudang) 
     //  VALUES ((SELECT MAX(num)+1 AS newNum FROM insa)
  //  , ?, ?, ?, ?, ?, ?, ?, ?, ?)
  //바인딩 문자열에 변수값(insa.getXXX()) 바인딩
  //입력 쿼리 실행->결과값을 변수에 저장
  //데이터베이스 연결 마무리
  //결과값 반환  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection();  
   
   String sql = String.format("INSERT INTO insa (num, name, ssn, ibsadate, tel, cid, bid, jid, basicPay, sudang) VALUES ((SELECT MAX(num)+1 AS newNum FROM insa), ?, ?, ?, ?, ?, ?, ?, ?, ?)");

   pstmt = conn.prepareStatement(sql);
   //바인딩 데이터 연결하는 과정
   //name, ssn, ibsadate, tel
   //, cid, bid, jid, basicPay, sudang
   pstmt.setString(1, insa.getName());
   pstmt.setString(2, insa.getSsn());
   pstmt.setString(3, insa.getIbsadate());
   pstmt.setString(4, insa.getTel());
   pstmt.setInt(5, Integer.parseInt(insa.getCid()));
   pstmt.setInt(6, Integer.parseInt(insa.getBid()));
   pstmt.setInt(7, Integer.parseInt(insa.getJid()));
   pstmt.setInt(8, insa.getBasicPay());
   pstmt.setInt(9, insa.getSudang());
   result = pstmt.executeUpdate(); //INSERT, DELETE, UPDATE
  
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }     
  
  
  return result;
 }
 
 
 //지역 정보 출력 메소드
 public ArrayList<City> cityList() {
  ArrayList<City> clist = new ArrayList<City>();
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(City 객체)에 저장 -> 컬렉션(clist) 저장
  //데이터베이스 연결 마무리
  //결과(컬렉션) 반환
  
  return clist;
 }
 
 //부서 정보 출력 메소드
 public ArrayList<Buseo> buseoList() {
  ArrayList<Buseo> blist = new ArrayList<Buseo>();

  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(Buseo 객체)에 저장 -> 컬렉션(blist) 저장
  //데이터베이스 연결 마무리
  //결과(컬렉션) 반환

  
  return blist;
 }
 
 //직위 정보 출력 메소드
 public ArrayList<Jikwi> jikwiList() {
  ArrayList<Jikwi> jlist = new ArrayList<Jikwi>();
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(Jikwi 객체)에 저장 -> 컬렉션(jlist) 저장
  //데이터베이스 연결 마무리
  //결과(컬렉션) 반환

  return jlist;
 } 
 
  
 //직원 전체 인원수 반환 메소드
 public int count() {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 및 실행
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과 반환
  
  
  return result;
 }
 
 
 //직원 검색 인원수 반환 메소드
 public int count(String key, String value) {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //SELECT 쿼리 준비 -> WHERE 구문을 경우의 수만큼 작성 -> 가변적 상태
  //SELECT COUNT(*) AS "count" FROM insaView WHERE %s=?
  //SELECT 쿼리 실행
  //결과를 변수(result)에 저장
  //데이터베이스 연결 마무리
  //결과 반환
  
  return result;
 }
 
 

 //최소 기본급 검색 메소드
 public int getMinBasicPay(String jid) {
  int result = 0;
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection();  
   
   String sql = String.format("SELECT min_basicPay FROM jikwi WHERE jid=?");

   //SELECT ... WHERE jid='1'
   //SELECT ... WHERE jid=1

   pstmt = conn.prepareStatement(sql);
   //바인딩 데이터 연결하는 과정
   pstmt.setInt(1, Integer.parseInt(jid));
   ResultSet rs = pstmt.executeQuery(); //SELECT 쿼리인 경우
   
   while(rs.next()) {
    result = rs.getInt("min_basicPay");
   }
  
   rs.close();
  
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }  
    
  
  return result;
 }
 


}

 


//ListTest.java
package com.test;

public class ListTest {

 public static void main(String[] args) {
  
  InsaDAO dao = new InsaDAO();
  
  System.out.printf("지역번호 종류(%s)%n", cityList(dao));
  System.out.printf("부서번호 종류(%s)%n", buseoList(dao));
  System.out.printf("직위번호 종류(%s)%n", jikwiList(dao));

 }
 
 private static String cityList(InsaDAO dao) {
  StringBuilder sb = new StringBuilder();
  
  for (City c : dao.cityList()) {
   sb.append(String.format("%s-%s "
     ,c.getCid(), c.getCity()));
  }
  
  return sb.toString();
 }

 private static String buseoList(InsaDAO dao) {
  StringBuilder sb = new StringBuilder();
  
  return sb.toString();
 }

 private static String jikwiList(InsaDAO dao) {
  StringBuilder sb = new StringBuilder();
  
  return sb.toString();
 }
 
 
}

 

 

//CountTest.java
package com.test;

public class CountTest {

 public static void main(String[] args) {
  
  InsaDAO dao = new InsaDAO();
  
  System.out.printf("전체 인원수 : %d명%n", dao.count());
  
  String key = "buseo";
  String value = "개발부";
  System.out.printf("검색 인원수 : %d명%n", dao.count(key, value));

 }

}

 

 

//PatternTest.java
package com.test;

import java.util.regex.*;

public class PatternTest {

 public static void main(String[] args) {

  
  //주민번호 형식 검사
  //정규식 표현 -> \d{6}-\d{7}
  String ssn = "123456-1234567";
  String ssnPattern = "\\d{6}-\\d{7}";
  
  System.out.print("SSN: ");
  if (patternCheck(ssnPattern, ssn)) {
   System.out.println("일치합니다.");
  } else {
   System.out.println("일치하지 않습니다.");
  }
  
  //전화번호 형식 검사
  String tel = "011-1234-1234";
  String telPattern = "010-\\d{4}-\\d{4}";
  
  System.out.print("TEL: ");
  if (patternCheck(telPattern, tel)) {
   System.out.println("일치합니다.");
  } else {
   System.out.println("일치하지 않습니다.");
  }
  
  //날짜 형식 검사
  String ibsadate = "2015-01-10";
  String datePattern = "\\d{4}-\\d{2}-\\d{2}";
  
  System.out.print("DATE: ");
  if (patternCheck(datePattern, ibsadate)) {
   System.out.println("일치합니다.");
  } else {
   System.out.println("일치하지 않습니다.");
  }

  
 }
 
 private static boolean patternCheck(String pattern, String value) {
  Pattern p = Pattern.compile(pattern);
  Matcher m = p.matcher(value);
  return m.matches();
 }
 
 

}


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

 

 


 

 

'JDBC' 카테고리의 다른 글

11일차_방명록  (0) 2015.06.21
10일차_직원관리_최종버전  (0) 2015.06.21
8일차_직원관리  (0) 2015.06.21
7일차_직원관리  (0) 2015.06.21
6일차_성적관리_최종버전  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

8일차_직원관리

JDBC 2015. 6. 21. 07:31

--------------------------------------
직원 관리
- JDBC 프로그램 작성은 아래 순서를 따른다.
기능 구현 분석 > 화면 구성 > 데이터베이스(샘플 쿼리) 준비 > 클래스 구성 분석 > 액션 코드 작성 > 테스트

5. 소스 코드

//InsaDAO.java
package com.test;

import java.sql.*;
import java.util.*;

//데이터베이스 액션 클래스
public class InsaDAO {
 
 //직원 정보 출력 메소드
 //반환자료형 -> ArrayList<Insa>
 //매개변수 -> key -> 정렬 기준(사번, 이름, 지역, 부서, 직위)
 public ArrayList<Insa> list(String key) {
  ArrayList<Insa> result = new ArrayList<Insa>();
  
  //문제)
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비
  //SELECT num, name, ssn, ibsadate, tel, city, buseo, jikwi
  // ,basicPay, sudang, pay
     //  FROM insaView
     //  ORDER BY num;
  //-> 정렬 액션은 데이터베이스에서 처리
  //-> ORDER BY 구문
  //-> SELECT 구문을 정렬 기준별로 작성
  //3. SELECT 쿼리 실행
  //4. 결과를 컬렉션 저장
  //5. 데이터베이스 연결 마무리
  //6. 결과 반환
  
  /*
  String sql = String.format("SELECT 쿼리...");
  switch (key) {
  case "사번": sql += " ORDER BY num"; break;
  case "이름": sql += " ORDER BY name"; break;
  ...
  }
  */
  String sql = String.format("SELECT 쿼리.... ORDER BY %s", key);  
  
  
  return result;
 }
 
 
 //직원 정보 검색 메소드
 //반환자료형 -> ArrayList<Insa>
 //매개변수 -> key, value -> 검색 기준(사번, 이름, 지역, 부서, 직위), 검색 단어
 //(->메소드 오버로딩)
 public ArrayList<Insa> list(String key, String value) {
  ArrayList<Insa> result = new ArrayList<Insa>();
  
  //문제)
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비
  //-> 검색 기준별로 검색 액션 준비
  //-> 검색 액션은 WHERE 컬럼명=? 구문 준비
  //-> ORDER BY num
  //3. SELECT 쿼리 실행
  //4. 결과를 컬렉션 저장
  //5. 데이터베이스 연결 마무리
  //6. 결과 반환

  return result;
 }
 
 //직원 정보 삭제 메소드
 //반환자료형 -> int형 -> 삭제된 로우의 갯수 반환
 //매개변수 -> String num -> 사번을 외부에서 전달 받는다.
 public int remove(String num) {

  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //삭제 쿼리 준비
  //DELETE FROM insa WHERE num=?
  //바인딩 문자열에 num 변수값 바인딩
  //삭제 쿼리 실행->결과값을 변수에 저장
  //데이터베이스 연결 마무리
  //결과값 반환
 
  
  return result;
  
 }
 
 
 //직원 정보 입력 메소드
 public int add(Insa insa) {
  int result = 0;
  
  //문제)
  //데이터베이스 연결
  //입력 쿼리 준비
  //INSERT INTO insa (num, name, ssn, ibsadate, tel
  //  , cid, bid, jid
  //  ,basicPay, sudang) 
     //  VALUES ((SELECT MAX(num)+1 AS newNum FROM insa)
  //  , ?, ?, ?, ?, ?, ?, ?, ?, ?)
  //바인딩 문자열에 변수값(insa.getXXX()) 바인딩
  //입력 쿼리 실행->결과값을 변수에 저장
  //데이터베이스 연결 마무리
  //결과값 반환  
  
  return result;
 }
 


}

 

 

//RemoveTest.java
package com.test;

import java.util.*;

public class RemoveTest {

 public static void main(String[] args) {

  InsaDAO dao = new InsaDAO();
  Scanner sc = new Scanner(System.in);
  
  String num = "1070";
  
  ArrayList<Insa> list = dao.list("num", num);
  
  if (list.size() > 0) {
   //검색 결과 있음->결과 출력 및 삭제 진행
   for (Insa i : list) {
    System.out.printf("출력 서식 지정"
      , "출력 항목 지정");
   }
   
   System.out.print("이 자료를 삭제하시겠습니까(Y/N)?");
   String m = sc.next();
   if (m.equalsIgnoreCase("y")) {
    //문제)
    //삭제 진행-> private 메소드
   }
   
   
  } else {
   //검색 결과 없음.
   System.out.println("검색 결과가 없습니다.");
  }
   
   
   
 }

}

 

 

//AddTest.java
package com.test;

import java.util.*;

public class AddTest {

 public static void main(String[] args) {

  InsaDAO dao = new InsaDAO();
  
  //외부에서 받는 데이터 자료형은 일단 String 자료형으로 처리.
  String name = "황길동";
  //...
  
  Insa insa = new Insa();
  //num 컬럼의 값은 자동 입력될 예정.
  insa.setName(name);
  //...
  
  //정상적인 입력 액션 -> 1개의 행이 삽입되었습니다.
  //에러 발생 -> 0개의 행이 삽입되었습니다.
  int result = dao.add(insa);
  System.out.printf("%d개의 행이 삽입되었습니다.%n", result);
  
  
 }

}

 


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

 

 

'JDBC' 카테고리의 다른 글

10일차_직원관리_최종버전  (0) 2015.06.21
9일차_직원관리  (0) 2015.06.21
7일차_직원관리  (0) 2015.06.21
6일차_성적관리_최종버전  (0) 2015.06.21
5일차_성적관리  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

7일차_직원관리

JDBC 2015. 6. 21. 07:30

--------------------------------------
직원 관리
- JDBC 프로그램 작성은 아래 순서를 따른다.
기능 구현 분석 > 화면 구성 > 데이터베이스(샘플 쿼리) 준비 > 클래스 구성 분석 > 액션 코드 작성 > 테스트


1. 기능 구현
- 직원 정보에 대한 입력, 출력, 검색, 삭제 기능 구현
- 직원 정보는 insa 테이블에 저장된다.
- 지역 정보는 city 테이블에 저장된다.
- 부서 정보는 buseo 테이블에 저장된다.
- 직위 정보는 jikwi 테이블에 저장된다.
- 직원 정보 입력 항목은 이름, 주민번호, 입사일, 전화번호, 지역번호, 부서번호, 직위번호, 기본급, 수당으로 구성
- 직원 정보 입력시 기본급은 직위별 최소 기본급 이상 입력되도록 한다.
- 직원 정보 출력 항목은 사번, 이름, 주민번호, 입사일, 전화번호, 지역, 부서, 직위, 기본급, 수당, 급여로 구성
- 직원 정보 출력시 항목별(사번, 이름, 지역, 부서, 직위) 정렬 기능 구현
- 직원 정보 검색은 사번, 이름, 지역, 부서, 직위 등의 항목을 기준으로 검색 결과를 출력하도록 구현
- 직원 삭제는 사번을 기준으로 삭제할 수 있도록 구현

 

-------------------------------------------------------
2. 화면 구성

--- 직원 관리 ---
1. 직원 입력
2. 직원 전체 출력
- 사번 정렬
- 이름 정렬
- 지역 정렬
- 부서 정렬
- 직위 정렬
3. 직원 검색 출력
- 사번 검색
- 이름 검색
- 지역 검색
- 부서 검색
- 직위 검색
4. 직원 삭제
선택(1~4, x 종료)?1

직원 정보 입력 --------------
(입력하는 과정에서 x 입력시 입력 중단)
이름?박길동
주민등록번호(YYMMDD-NNNNNNN)?800110-1234567
입사일(YYYY-MM-DD)?2010-10-10
전화번호(010-XXXX-XXXX)?010-345-6789
지역번호 종류(1-강원 2-경기 3-경남 4-경북 .... )
지역번호?2
부서번호 종류(1-개발부 2-기획부 3-영업부 ....)
부서번호?3
직위번호 종류(1-과장 2-대리 3-사원 ...)
직위번호?1
기본급(최소 2000000원 이상)?2000000
수당?100000
직원 정보 입력 완료!


--- 직원 관리 ---
1. 직원 입력
2. 직원 전체 출력
- 사번 정렬
- 이름 정렬
- 지역 정렬
- 부서 정렬
- 직위 정렬
3. 직원 검색 출력
- 사번 검색
- 이름 검색
- 지역 검색
- 부서 검색
- 직위 검색
4. 직원 삭제
선택(1~4, x 종료)?2

직원 전체 출력(서브 메뉴)-------------
1.사번 정렬
2.이름 정렬
3.지역 정렬
4.부서 정렬
5.직위 정렬
선택(1~5, x 종료)?1

전체 인원: 62명
------------------------------------------------------------------
사번 이름   주민번호       입사일     지역 전화번호      부서   직위 기본급  수당   급여
1001 홍길동 771212-1022432 1998-10-11 서울 011-2356-4528 기획부 부장 2610000 200000 2810000
1002 이순신 801007-1544236 2000-11-29 경기 010-4758-6532 총무부 사원 1320000 200000 1520000
...


--- 직원 관리 ---
1. 직원 입력
2. 직원 전체 출력
- 사번 정렬
- 이름 정렬
- 지역 정렬
- 부서 정렬
- 직위 정렬
3. 직원 검색 출력
- 사번 검색
- 이름 검색
- 지역 검색
- 부서 검색
- 직위 검색
4. 직원 삭제
선택(1~4, x 종료)?3

직원 검색 출력(서브 메뉴)-------------
1.사번 검색
2.이름 검색
3.지역 검색
4.부서 검색
5.직위 검색
선택(1~5, x 종료)?1

검색할 사번?1001


검색 인원 : 1명
------------------------------------------------------------------
사번 이름   주민번호       입사일     지역 전화번호      부서   직위 기본급  수당   급여
1001 홍길동 771212-1022432 1998-10-11 서울 011-2356-4528 기획부 부장 2610000 200000 2810000

 


--- 직원 관리 ---
1. 직원 입력
2. 직원 전체 출력
- 사번 정렬
- 이름 정렬
- 지역 정렬
- 부서 정렬
- 직위 정렬
3. 직원 검색 출력
- 사번 검색
- 이름 검색
- 지역 검색
- 부서 검색
- 직위 검색
4. 직원 삭제
선택(1~4, x 종료)?4

삭제하고자하는 자료의 사번?1001

------------------------------------------------------------------
사번 이름   주민번호       입사일     지역 전화번호      부서   직위 기본급  수당   급여
1001 홍길동 771212-1022432 1998-10-11 서울 011-2356-4528 기획부 부장 2610000 200000 2810000

이 자료를 삭제하시겠습니까(Y/N)?y
1개의 행이 삭제됨.


1. 직원 입력
2. 직원 전체 출력
- 사번 정렬
- 이름 정렬
- 지역 정렬
- 부서 정렬
- 직위 정렬
3. 직원 검색 출력
- 사번 검색
- 이름 검색
- 지역 검색
- 부서 검색
- 직위 검색
4. 직원 삭제
선택(1~4, x 종료)?x

프로그램이 종료되었습니다.


-------------------------------------------
3. 데이터베이스 준비 (insa, city, buseo, jikwi 테이블)


--insa 테이블 생성
CREATE TABLE insa(
        num NUMBER(5) --PK
       ,name VARCHAR2(20) NOT NULL  -->NVARCHAR2(20) 자리로 변경
       ,ssn  VARCHAR2(14) NOT NULL
       ,ibsaDate DATE     NOT NULL
       ,tel   VARCHAR2(15)
       ,cid NUMBER --FK
       ,bid NUMBER --FK
       ,jid NUMBER --FK
       ,basicPay NUMBER(10) NOT NULL
       ,sudang NUMBER(10) NOT NULL
);


--직원 정보 출력 쿼리
--사번 이름   주민번호       입사일     지역 전화번호      부서   직위 기본급  수당   급여
SELECT num, name, ssn, ibsadate, tel, city, buseo, jikwi
  ,basicPay, sudang, pay
 FROM insaView
 ORDER BY num;


--직원 정보 검색 쿼리
--사번 이름   주민번호       입사일     지역 전화번호      부서   직위 기본급  수당   급여
SELECT num, name, ssn, ibsadate, tel, city, buseo, jikwi
  ,basicPay, sudang, pay
 FROM insaView
 WHERE name='홍길동'
 ORDER BY num;

 

CREATE OR REPLACE VIEW insaView
AS
 SELECT i.num, i.name, i.ssn
 , TO_CHAR(i.ibsadate, 'YYYY-MM-DD') AS ibsadate
 , i.tel, i.cid, c.city, i.bid, b.buseo
 , i.jid, j.jikwi, i.basicPay
 ,i.sudang, i.basicpay+i.sudang AS pay
 FROM insa i, city c, buseo b, jikwi j
 WHERE i.cid=c.cid AND i.bid=b.bid AND i.jid=j.jid;

 

--직원 정보 삭제 쿼리
--사번 기준 삭제
DELETE FROM insa WHERE num=특정번호;
COMMIT;


--직원 정보 입력 쿼리
--num 컬럼은 자동 부여된 일련번호(시퀀스 객체, 기존번호+1 자동 생성 쿼리)를 저장하도록 한다.
--cid, bid, jid 컬럼은 FK 제약 때문에 한정된 범위의 숫자만 입력 가능.

--CREATE SEQUENCE insaSeq;

SELECT MAX(num)+1 AS newNum FROM insa;

INSERT INTO insa (num, name, ssn, ibsadate, tel
  , cid, bid, jid
  ,basicPay, sudang) 
 VALUES ((SELECT MAX(num)+1 AS newNum FROM insa)
  , '박길동', '801010-1234567', '2010-10-10', '010-654-9876', 11, 7, 4, 1500000, 1000000);
COMMIT;

 

--지역 정보 출력 쿼리
SELECT cid, city FROM city ORDER BY cid;
 
--부서 정보 출력 쿼리
SELECT bid, buseo FROM buseo ORDER BY bid;

--직위 정보 출력 쿼리
SELECT jid, jikwi, min_basicPay FROM jikwi ORDER BY jid;


--직원 전체 인원수 반환 쿼리
SELECT COUNT(*) AS "count" FROM insaView;


--직원 검색 인원수 반환 쿼리
SELECT COUNT(*) AS "count"
 FROM insaView
 WHERE 특정컬럼=값;

--최소 기본급 검색 쿼리
SELECT min_basicPay
 FROM jikwi
 WHERE jid=직위번호;

 

4. 프로그램 구성
자료형 클래스 준비 > 데이터베이스 액션 클래스 > 메뉴 액션 클래스 > 메인 클래스

City.java -> 지역 정보 자료형 클래스
Buseo.java -> 부서 정보 자료형 클래스
Jikwi.java -> 직위 정보 자료형 클래스
Insa.java -> 직원 정보 자료형 클래스

DBConn.java -> 데이터베이스 연결 정보 클래스
InsaDAO.java -> 직원 정보 데이터베이스 입출력 액션 클래스

MenuAction.java -> 메뉴 액션 클래스. 콘솔 액션.
Main.java -> 메인 클래스. 콘솔 액션.

Test.java -> 메소드 단위 테스트 클래스


5. 소스 코드


//Insa.java
package com.test;

//자료형 클래스
public class Insa {
 
 //문제)
 //멤버변수
 //-> 데이터베이스 컬럼명, 출력항목
 //사번(num),이름,주민번호,입사일,전화번호
 //,지역(city),부서,직위,기본급,수당,급여
 //,지역번호(cid), 부서번호, 직위번호
 
 //int -> 기본급,수당,급여
 
 
}

 

 

 

 

//InsaDAO.java
package com.test;

import java.sql.*;
import java.util.*;

//데이터베이스 액션 클래스
public class InsaDAO {
 
 //직원 정보 출력 메소드
 //반환자료형 -> ArrayList<Insa>
 //매개변수 -> key -> 정렬 기준(사번, 이름, 지역, 부서, 직위)
 public ArrayList<Insa> list(String key) {
  ArrayList<Insa> result = new ArrayList<Insa>();
  
  //문제)
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비
  //SELECT num, name, ssn, ibsadate, tel, city, buseo, jikwi
  // ,basicPay, sudang, pay
     //  FROM insaView
     //  ORDER BY num;
  //-> 정렬 액션은 데이터베이스에서 처리
  //-> ORDER BY 구문
  //-> SELECT 구문을 정렬 기준별로 작성
  //3. SELECT 쿼리 실행
  //4. 결과를 컬렉션 저장
  //5. 데이터베이스 연결 마무리
  //6. 결과 반환
  
  /*
  String sql = String.format("SELECT 쿼리...");
  switch (key) {
  case "사번": sql += " ORDER BY num"; break;
  case "이름": sql += " ORDER BY name"; break;
  ...
  }
  */
  String sql = String.format("SELECT 쿼리.... ORDER BY %s", key);  
  
  
  return result;
 }
 
 
 //직원 정보 검색 메소드
 //반환자료형 -> ArrayList<Insa>
 //매개변수 -> key, value -> 검색 기준(사번, 이름, 지역, 부서, 직위), 검색 단어
 //(->메소드 오버로딩)
 public ArrayList<Insa> list(String key, String value) {
  ArrayList<Insa> result = new ArrayList<Insa>();
  
  //문제)
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비
  //-> 검색 기준별로 검색 액션 준비
  //-> 검색 액션은 WHERE 컬럼명=? 구문 준비
  //-> ORDER BY num
  //3. SELECT 쿼리 실행
  //4. 결과를 컬렉션 저장
  //5. 데이터베이스 연결 마무리
  //6. 결과 반환

  return result;
 }
 
 

}

 

 


//Test.java
package com.test;

//InsaDAO 클래스의 메소드에 대한 테스트
public class Test {

 public static void main(String[] args) {
  
  InsaDAO dao = new InsaDAO();
  
  //문제)
  //직원 정보 출력(검색) 메소드 테스트
  //-> list(String key) 메소드
  //-> list(String key, String value) 메소드
  
  //정렬(검색) 기준 제시(num, name, city, buseo, jikwi)
  String key = "name";
  String value = "홍길동";
  
  //사번,이름,주민번호,입사일,전화번호
  //,지역,부서,직위,기본급,수당,급여
  //기본급,수당,급여
  //-> int 자료형
  //-> 천단위마다 , 출력 서식 지정
  //-> %,d
  for (Insa i : dao.list(key, value)) {
   System.out.printf("출력 서식 지정"
     , "출력 항목 지정");
  }
  

 }

}

 

 

 

 

 

---------------------------------------
직원 정보 출력, 검색 기능 구현

 

 

 

 

 

'JDBC' 카테고리의 다른 글

9일차_직원관리  (0) 2015.06.21
8일차_직원관리  (0) 2015.06.21
6일차_성적관리_최종버전  (0) 2015.06.21
5일차_성적관리  (0) 2015.06.21
4일차_성적관리  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

----------------------------------------------
성적관리 JDBC 프로그램
- JDBC 프로그램 작성은 아래 순서를 따른다.
기능 구현 분석 > 화면 구성 > 데이터베이스(샘플 쿼리) 준비 > 클래스 구성 분석 > 액션 코드 작성 > 테스트

5. 소스 코드 (최종 버전)

//DBConn.java
package com.test;

import java.sql.*;

//데이터베이스 연결 액션 클래스
public class DBConn {
 
 //메소드들 내부에서 공통 사용하는 멤버는
 //멤버변수로 등록한다.
 //static 키워드 추가
 private static Connection conn;
 
 //커넥션 객체 준비 메소드
 //-> Singleton
 public static Connection getConnection() throws ClassNotFoundException, SQLException  {
  if (conn == null) {

   Class.forName("oracle.jdbc.driver.OracleDriver");
   conn = DriverManager.getConnection("jdbc:oracle:thin:username/password@IP주소:1521:xe");;
   
  }
  return conn;
 }
 
 //마무리 메소드
 public static void close() {
  try {
   if (conn != null) {
    conn.close();
   }
  }catch(Exception e){
  }
  conn = null;
 }

}

 

 


//Student.java
package com.test;

//자료형 클래스
public class Student {
 
 //멤버변수 -> 데이터베이스 컬럼명, 출력 항목
 //sid, name, tel, gradeCheck
 //기본 자료형은 String으로 지정.
 
 private String sid, name, tel;
 
 //성적 입력 여부 확인용
 //입력 O -> 1
 //입력 X -> 0
 private int gradeCheck;
 
 public String getSid() {
  return sid;
 }
 public void setSid(String sid) {
  this.sid = sid;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getTel() {
  return tel;
 }
 public void setTel(String tel) {
  this.tel = tel;
 }
 public int getGradeCheck() {
  return gradeCheck;
 }
 public void setGradeCheck(int gradeCheck) {
  this.gradeCheck = gradeCheck;
 }

 
}

 

 


//Grade.java
package com.test;

//자료형 클래스
public class Grade {
 
 //멤버변수 -> 데이터베이스 컬럼명, 출력 항목
 //->sid, sub1, sub2, sub3
 //->name, tot, ave, grade
 
 //null 자료는 int 자료형 변수에 저장 불가능
 //null 자료는 String 자료형 변수에 저장 가능
 private String sid, name, sub1, sub2, sub3, tot, ave;
 private int grade; //0 합격, 1 과락, 2 불합격
 
 public String getSid() {
  return sid;
 }
 public void setSid(String sid) {
  this.sid = sid;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSub1() {
  return sub1;
 }
 public void setSub1(String sub1) {
  this.sub1 = sub1;
 }
 public String getSub2() {
  return sub2;
 }
 public void setSub2(String sub2) {
  this.sub2 = sub2;
 }
 public String getSub3() {
  return sub3;
 }
 public void setSub3(String sub3) {
  this.sub3 = sub3;
 }
 public String getTot() {
  return tot;
 }
 public void setTot(String tot) {
  this.tot = tot;
 }
 public String getAve() {
  return ave;
 }
 public void setAve(String ave) {
  this.ave = ave;
 }
 public int getGrade() {
  return grade;
 }
 public void setGrade(int grade) {
  this.grade = grade;
 }

}

 

 

//StudentDAO.java
package com.test;

import java.util.*;
import java.sql.*;

public class StudentDAO {

 //학생 명단 출력 메소드
 public ArrayList<Student> list() {
  ArrayList<Student> result = new  ArrayList<Student>();
  
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비 및 실행
  //3. 결과를 컬렉션에 저장
  //4. 데이터베이스 연결 마무리
  //5. 컬렉션 반환
  
  Connection conn = null;
  Statement stmt = null;
  try {
   conn = DBConn.getConnection();

   stmt = conn.createStatement();
   //주의: 쿼리 문자열 끝에 ;(semicolon) 없음.
   String sql = String.format("SELECT sid, name, tel, gradeCheck  FROM studentView  ORDER BY sid");
   ResultSet rs = stmt.executeQuery(sql);
   
   while(rs.next()) {
    //문제)
    //데이터베이스 자료를 순차적으로 읽어내서
    //Student 객체에 저장하고
    //Student 객체를 컬렉션에 저장하는 액션 추가
    String sid = rs.getString("sid");
    String name = rs.getString("name");
    String tel = rs.getString("tel");
    int gradeCheck = rs.getInt("gradeCheck");
      
    Student s = new Student();
    s.setSid(sid);
    s.setName(name);
    s.setTel(tel);
    s.setGradeCheck(gradeCheck);
    
    result.add(s);

   }
   
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (stmt != null) {
     stmt.close();
    }
   }catch(Exception e){
   }
   DBConn.close();
  }
  
  return result;
 }
 
 //학생 수 출력 메소드
 public int count() {
  int result = 0;
  
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비 및 실행
  //->SELECT COUNT(*) AS "count" FROM student
  //3. 결과를 변수에 저장
  //4. 데이터베이스 연결 마무리
  //5. 변수 반환  
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection();  
   
   String sql = String.format("SELECT COUNT(*) AS \"count\" FROM student");

   pstmt = conn.prepareStatement(sql);
   //바인딩 데이터 연결하는 과정
   ResultSet rs = pstmt.executeQuery(); //SELECT 쿼리인 경우
   
   while(rs.next()) {
    result = rs.getInt("count");
   }
  
   rs.close();
  
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }
  
  return result;
 }
 
 
 
 //학생 추가(입력) 메소드
 public int add(Student student) {
  int result = 0;
  
  //문제)
  //1. 데이터베이스 연결
  //2. INSERT 쿼리 준비 및 실행
  //-> INSERT INTO student (sid, name, tel)
  //      VALUES (studentSeq.nextval, ?, ?)
  //3. 결과를 변수에 저장
  //4. 데이터베이스 연결 마무리
  //5. 변수 반환   
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection(); 
  
   String sql = String.format("INSERT INTO student (sid, name, tel) VALUES (studentSeq.nextval, ?, ?)");
   pstmt = conn.prepareStatement(sql); //쿼리를 사전 분석한다.
   
   pstmt.setString(1, student.getName()); //'(작은 따옴표) 추가
   pstmt.setString(2, student.getTel()); //'(작은 따옴표) 추가
   result = pstmt.executeUpdate();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }
  
  return result;
 }
 
 
 
 //학생 번호 검색 메소드
 public Student searchSid(String sid) {
  
  Student result = null;
  
  //문제)
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비 및 실행
  //SELECT sid, name, tel, gradeCheck
  //     FROM studentView
  //     WHERE sid=?
  //3. 결과를 변수에 저장
  //4. 데이터베이스 연결 마무리
  //5. 변수 반환  
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection();  
   
   //검색 액션은 PK 가 지정된 sid 컬럼을 대상으로
   //하기 때문에
   //검색 결과는 0 또는 1 이다.
   //검색 결과가 있다면 Student 객체에 저장해서 반환.
   
   String sql = String.format("SELECT sid, name, tel, gradeCheck FROM studentView WHERE sid=?");
   
   pstmt = conn.prepareStatement(sql);
   //바인딩 데이터 연결하는 과정
   pstmt.setInt(1, Integer.parseInt(sid));
   ResultSet rs = pstmt.executeQuery(); //SELECT 쿼리인 경우
   
   //SELECT 결과가 존재하는 경우
   //rs.next() 메소드 결과는 true가 된다.
   //-> 반복문 실행 가능
   /*
   while(rs.next()) {
    result = new Student();
    
   }
    */ 
   while(rs.next()) {
    
    String name = rs.getString("name");
    String tel = rs.getString("tel");
    int gradeCheck = rs.getInt("gradeCheck");
    
    result = new Student();
    result.setSid(sid);
    result.setName(name);
    result.setTel(tel);
    result.setGradeCheck(gradeCheck);

   }
  
   rs.close();
  
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }  

  return result;  //null 또는 Student객체
  
 }
  
 
}

 

 


//GradeDAO.java
package com.test;

import java.util.*;
import java.sql.*;

public class GradeDAO {
 
 //성적 추가(입력) 메소드
 public int add(Grade grade) {
  int result = 0;
  
  //문제)
  //1. 데이터베이스 연결
  //2. INSERT 쿼리 준비 및 실행
  //-> INSERT INTO grade (sid, sub1, sub2, sub3)
  //        VALUES (?, ?, ?, ?)
  //3. 결과를 변수에 저장
  //4. 데이터베이스 연결 마무리
  //5. 변수 반환  
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection(); 
  
   String sql = String.format("INSERT INTO grade(SID,sub1,sub2,sub3) VALUES(?, ?, ?, ?)");
   pstmt = conn.prepareStatement(sql); //쿼리를 사전 분석한다.
   
   pstmt.setString(1, grade.getSid()); //'(작은 따옴표) 추가
   pstmt.setInt(2, Integer.parseInt(grade.getSub1()));
   pstmt.setInt(3, Integer.parseInt(grade.getSub2()));
   pstmt.setInt(4, Integer.parseInt(grade.getSub3()));
   result = pstmt.executeUpdate();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }  
  
  return result;
 }
 
 
 //성적 출력 메소드
 public ArrayList<Grade> list() {
  ArrayList<Grade> result = new ArrayList<Grade>();
  
  //문제)
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비 및 실행
  //SELECT sid, name, sub1, sub2, sub3
  //     , tot, ave, grade
  //   FROM gradeView
  //   ORDER BY sid;
  //3. 결과를 컬렉션에 저장
  //4. 데이터베이스 연결 마무리
  //5. 컬렉션 반환
  
  Connection conn = null;
  Statement stmt = null;
  try {
   conn = DBConn.getConnection();

   stmt = conn.createStatement();
   //주의: 쿼리 문자열 끝에 ;(semicolon) 없음.
   String sql = String.format("SELECT sid, name, sub1, sub2, sub3, tot, ave, grade FROM gradeView ORDER BY sid");
   ResultSet rs = stmt.executeQuery(sql);
   
   while(rs.next()) {

    String sid = rs.getString("sid");
    String name = rs.getString("name");
    String sub1 = rs.getString("sub1");
    String sub2 = rs.getString("sub2");
    String sub3 = rs.getString("sub3");
    String tot = rs.getString("tot");
    String ave = rs.getString("ave");
    int grade = rs.getInt("grade");
      
    Grade g = new Grade();
    g.setSid(sid);
    g.setName(name);
    g.setSub1(sub1);
    g.setSub2(sub2);
    g.setSub3(sub3);
    g.setTot(tot);
    g.setAve(ave);
    g.setGrade(grade);
    
    result.add(g);

   }
   
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (stmt != null) {
     stmt.close();
    }
   }catch(Exception e){
   }
   DBConn.close();
  }  
  
  return result;
 }
 
}

 

 

 

//MenuAction.java
package com.test;

import java.util.*;

//콘솔 액션 O. 데이터베이스 관련 액션 코드 X.
public class MenuAction {
 
 //StudentDAO, GradeDAO 객체 준비 -> 생성자
 private StudentDAO sdao;
 private GradeDAO gdao;
 
 public MenuAction() {
  sdao = new StudentDAO();
  gdao = new GradeDAO();
 }
 
 //1. 학생 입력
 public void menu1(Scanner sc) {
  
  //이름, 전화번호를 외부 입력 받아서
  //데이터베이스에 저장하는 액션
  System.out.print("이름 전화번호?");
  String name = sc.next();
  String tel = sc.next();
  
  Student student = new Student();
  student.setName(name);
  student.setTel(tel);
  
  int result = sdao.add(student);
  System.out.printf("%d개의 행이 삽입되었습니다.%n", result);
  
 }
 
 
 //2. 성적 입력 (학생 검색)
 public void menu2(Scanner sc) {
  System.out.print("학생 번호 검색(x exit)?");
  String sid = sc.next();

  if (!sid.equalsIgnoreCase("x")) {
   Student student = sdao.searchSid(sid);

   if (student == null) {
    System.out.println("검색 결과가 없습니다.");
   } else {
    System.out.printf("%s %s %s %s%n", student.getSid(),
      student.getName(), student.getTel(),
      (student.getGradeCheck() == 1) ? "O" : "X");
    if (student.getGradeCheck() == 1) {
     System.out.println("이미 성적이 입력된 상태입니다.");
    } else {
     // System.out.println("성적 입력 가능....");

     System.out.print("과목1 과목1 과목1?");
     String sub1 = sc.next();
     String sub2 = sc.next();
     String sub3 = sc.next();

     Grade grade = new Grade();
     grade.setSid(sid);
     grade.setSub1(sub1);
     grade.setSub2(sub2);
     grade.setSub3(sub3);

     int result = gdao.add(grade);
     System.out.printf("%d개의 행이 삽입되었습니다.", result);

    }
   }

  }
 }
 
 //3. 학생 출력
 public void menu3() {
  //인원수 및 학생 명단 출력
  System.out.printf("전체 학생 수 : %d명%n", sdao.count());
  System.out.println("------------------------");
  System.out.println("SID NAME TEL GRADECHECK");
  System.out.println("------------------------");
  for (Student s : sdao.list()) {
   System.out.printf("%s %s %s %s %n"
     , s.getSid()
     , s.getName()
     , s.getTel()
     , (s.getGradeCheck()==1)?"O":"X" );
  }
  
 }
 
 //4. 성적 출력
 public void menu4() {
  //인원수 및 성적 출력
  String[] gradeArray = {"합격", "과락", "불합격"};
  System.out.printf("전체 학생 수 : %d명%n", sdao.count());
  System.out.println("------------------------");
  System.out.println("SID NAME SUB1 SUB2 SUB3 TOT AVE GRADE");
  System.out.println("------------------------");
  for (Grade grade : gdao.list()) {
   System.out.printf("%s %s %s %s %s %s %s %s%n"
     , grade.getSid()
     , grade.getName()
     , grade.getSub1()
     , grade.getSub2()
     , grade.getSub3()
     , grade.getTot()  //총점
     , (grade.getAve()==null)?grade.getAve():String.format("%.1f", Double.parseDouble(grade.getAve()))  //평균. 소수 이하 1자리 지정. 문자열->실수. NULL 값은 제외.
     , gradeArray[grade.getGrade()]); //판정. 0 합격, 1 과락, 2 불합격
  }
  
 }
 
 

}

 

 

//Main.java
package com.test;

import java.util.*;

//메인 메뉴 액션 클래스
public class Main {

 public static void main(String[] args) {

  MenuAction menu = new MenuAction();
  Scanner sc = new Scanner(System.in);
  
  do {
   System.out.println("--- 성적 관리(ORACLE) ---");
   System.out.println("1. 학생 입력");
   System.out.println("2. 성적 입력 (학생 검색)");
   System.out.println("3. 학생 출력");
   System.out.println("4. 성적 출력");
   System.out.print("선택(1~4, 0 종료)?");
   int m = sc.nextInt();
   if (m==0) {
    break;
   }
   
   switch (m) {
   case 1: menu.menu1(sc); break;
   case 2: menu.menu2(sc); break;
   case 3: menu.menu3(); break;
   case 4: menu.menu4(); break;
   }
   System.out.println();
   
  }while(true);
  
  sc.close();
  
 }

}

 


-----------------------------------
성적관리 완성됨.

 


 

 

'JDBC' 카테고리의 다른 글

8일차_직원관리  (0) 2015.06.21
7일차_직원관리  (0) 2015.06.21
5일차_성적관리  (0) 2015.06.21
4일차_성적관리  (0) 2015.06.21
3일차_회원관리 JDBC 프로그램2, Statement 객체 종류별 액션 처리  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,

5일차_성적관리

JDBC 2015. 6. 21. 07:30

----------------------------------------------
성적관리 JDBC 프로그램
- JDBC 프로그램 작성은 아래 순서를 따른다.
기능 구현 분석 > 화면 구성 > 데이터베이스(샘플 쿼리) 준비 > 클래스 구성 분석 > 액션 코드 작성 > 테스트

5. 소스 코드

//StudentDAO.java
package com.test;

import java.util.*;
import java.sql.*;

public class StudentDAO {

 //학생 명단 출력 메소드
 public ArrayList<Student> list() {
  ArrayList<Student> result = new  ArrayList<Student>();
  
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비 및 실행
  //3. 결과를 컬렉션에 저장
  //4. 데이터베이스 연결 마무리
  //5. 컬렉션 반환
  
  Connection conn = null;
  Statement stmt = null;
  try {
   conn = DBConn.getConnection();

   stmt = conn.createStatement();
   //주의: 쿼리 문자열 끝에 ;(semicolon) 없음.
   String sql = String.format("SELECT sid, name, tel, gradeCheck  FROM studentView  ORDER BY sid");
   ResultSet rs = stmt.executeQuery(sql);
   
   while(rs.next()) {
    //문제)
    //데이터베이스 자료를 순차적으로 읽어내서
    //Student 객체에 저장하고
    //Student 객체를 컬렉션에 저장하는 액션 추가
    String sid = rs.getString("sid");
    String name = rs.getString("name");
    String tel = rs.getString("tel");
    int gradeCheck = rs.getInt("gradeCheck");
      
    Student s = new Student();
    s.setSid(sid);
    s.setName(name);
    s.setTel(tel);
    s.setGradeCheck(gradeCheck);
    
    result.add(s);

   }
   
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (stmt != null) {
     stmt.close();
    }
   }catch(Exception e){
   }
   DBConn.close();
  }
  
  return result;
 }
 
 //학생 수 출력 메소드
 public int count() {
  int result = 0;
  
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비 및 실행
  //->SELECT COUNT(*) AS "count" FROM student
  //3. 결과를 변수에 저장
  //4. 데이터베이스 연결 마무리
  //5. 변수 반환  
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection();  
   
   String sql = String.format("SELECT COUNT(*) AS \"count\" FROM student");

   pstmt = conn.prepareStatement(sql);
   //바인딩 데이터 연결하는 과정
   ResultSet rs = pstmt.executeQuery(); //SELECT 쿼리인 경우
   
   while(rs.next()) {
    result = rs.getInt("count");
   }
  
   rs.close();
  
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }
  
  return result;
 }
 
 
 
 //학생 추가(입력) 메소드
 public int add(Student student) {
  int result = 0;
  
  //문제)
  //1. 데이터베이스 연결
  //2. INSERT 쿼리 준비 및 실행
  //-> INSERT INTO student (sid, name, tel)
  //      VALUES (studentSeq.nextval, ?, ?)
  //3. 결과를 변수에 저장
  //4. 데이터베이스 연결 마무리
  //5. 변수 반환   
  
  Connection conn = null;
  PreparedStatement pstmt = null;
  try {
   conn = DBConn.getConnection(); 
  
   String sql = String.format("INSERT INTO student (sid, name, tel) VALUES (studentSeq.nextval, ?, ?)");
   pstmt = conn.prepareStatement(sql); //쿼리를 사전 분석한다.
   
   pstmt.setString(1, student.getName()); //'(작은 따옴표) 추가
   pstmt.setString(2, student.getTel()); //'(작은 따옴표) 추가
   result = pstmt.executeUpdate();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();   
  }
  
  return result;
 }
 
 
 
 //학생 번호 검색 메소드
 public Student searchSid(String sid) {
  
  Student result = null;
  
  //문제)
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비 및 실행
  //SELECT sid, name, tel, gradeCheck
  //     FROM studentView
  //     WHERE sid=?
  //3. 결과를 변수에 저장
  //4. 데이터베이스 연결 마무리
  //5. 변수 반환  
  

  //검색 액션은 PK 가 지정된 sid 컬럼을 대상으로
  //하기 때문에
  //검색 결과는 0 또는 1 이다.
  //검색 결과가 있다면 Student 객체에 저장해서 반환.
  
  String sql = String.format("SELECT sid, name, tel, gradeCheck FROM studentView WHERE sid=?");
  
  //SELECT 결과가 존재하는 경우
  //rs.next() 메소드 결과는 true가 된다.
  //-> 반복문 실행 가능
  /*
  while(rs.next()) {
   result = new Student();
   
  }
   */
  
  
  return result;  //null 또는 Student객체
  
 }
 
 
 
}

 

 

 

//Test.java
package com.test;

import java.util.*;

//데이터베이스 액션 테스트용 클래스
public class Test {
 
 public static void main(String[] args) {
  
  //StudenDAO 클래스의 add(), count(), list() 메소드 테스트
  StudentDAO dao = new StudentDAO();
  
  Scanner sc = new Scanner(System.in);
  System.out.print("이름 전화번호?");
  String name = sc.next();
  String tel = sc.next();
  
  Student student = new Student();
  student.setName(name);
  student.setTel(tel);
  
  int result = dao.add(student);
  System.out.printf("%d개의 행이 삽입되었습니다.%n", result);
  
  sc.close();
  
  
  System.out.printf("전체 학생 수 : %d명%n", dao.count());
  System.out.println("------------------------");
  System.out.println("SID NAME TEL GRADECHECK");
  System.out.println("------------------------");
  for (Student s : dao.list()) {
   System.out.printf("%s %s %s %s %n"
     , s.getSid()
     , s.getName()
     , s.getTel()
     , (s.getGradeCheck()==1)?"O":"X" );
  }
  
 }

}

 

 


//Grade.java
package com.test;

//자료형 클래스
public class Grade {
 
 //멤버변수 -> 데이터베이스 컬럼명, 출력 항목
 //->sid, sub1, sub2, sub3
 //->name, tot, ave, grade
 
 //null 자료는 int 자료형 변수에 저장 불가능
 //null 자료는 String 자료형 변수에 저장 가능
 private String sid, name, sub1, sub2, sub3, tot, ave;
 private int grade; //0 합격, 1 과락, 2 불합격
 
 public String getSid() {
  return sid;
 }
 public void setSid(String sid) {
  this.sid = sid;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSub1() {
  return sub1;
 }
 public void setSub1(String sub1) {
  this.sub1 = sub1;
 }
 public String getSub2() {
  return sub2;
 }
 public void setSub2(String sub2) {
  this.sub2 = sub2;
 }
 public String getSub3() {
  return sub3;
 }
 public void setSub3(String sub3) {
  this.sub3 = sub3;
 }
 public String getTot() {
  return tot;
 }
 public void setTot(String tot) {
  this.tot = tot;
 }
 public String getAve() {
  return ave;
 }
 public void setAve(String ave) {
  this.ave = ave;
 }
 public int getGrade() {
  return grade;
 }
 public void setGrade(int grade) {
  this.grade = grade;
 }

}

 

 


//GradeDAO.java
package com.test;

public class GradeDAO {
 
 //성적 추가(입력) 메소드
 public int add(Grade grade) {
  int result = 0;
  
  //문제)
  //1. 데이터베이스 연결
  //2. INSERT 쿼리 준비 및 실행
  //-> INSERT INTO grade (sid, sub1, sub2, sub3)
  //        VALUES (?, ?, ?, ?)
  //3. 결과를 변수에 저장
  //4. 데이터베이스 연결 마무리
  //5. 변수 반환  
  
  
  
  
  
  return result;
 }
 

}

 

 


//SungjukTest.java
package com.test;

import java.util.Scanner;

public class SungjukTest {

 public static void main(String[] args) {

  StudentDAO dao = new StudentDAO();
  GradeDAO gdao = new GradeDAO();
  
  Scanner sc = new Scanner(System.in);
  
  System.out.print("학생 번호 검색?");
  String sid = sc.next();
  
  Student student = dao.searchSid(sid);
  
  if (student == null) {
   System.out.println("검색 결과가 없습니다.");
  } else {
   System.out.printf("%s %s %s %s%n"
     , student.getSid()
     , student.getName()
     , student.getTel()
     , (student.getGradeCheck()==1)?"O":"X");
   if (student.getGradeCheck() == 1) {
    System.out.println("이미 성적이 입력된 상태입니다.");
   } else {
    //System.out.println("성적 입력 가능....");
    
    System.out.print("과목1 과목1 과목1?");
    String sub1 = sc.next();
    String sub2 = sc.next();
    String sub3 = sc.next();
    
    Grade grade = new Grade();
    grade.setSid(sid);
    grade.setSub1(sub1);
    grade.setSub2(sub2);
    grade.setSub3(sub3);
    
    int result = gdao.add(grade);
    System.out.printf("%d개의 행이 삽입되었습니다.", result);
    
   }
  }
  
  sc.close();
  
  
 }

}

 

 


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

 

 

블로그 이미지

알 수 없는 사용자

,

4일차_성적관리

JDBC 2015. 6. 21. 07:30

----------------------------------------------
성적관리 JDBC 프로그램
- JDBC 프로그램 작성은 아래 순서를 따른다.
기능 구현 분석 > 화면 구성 > 데이터베이스(샘플 쿼리) 준비 > 클래스 구성 분석 > 액션 코드 작성 > 테스트


1. 기능 구현
- 학생 테이블에는 학생의 개인 정보(번호, 학생 이름, 전화번호)가 저장된다.
- 성적 테이블에는 학생의 성적 정보(번호, 과목1, 과목2, 과목3)가 저장된다.
- 번호 항목은 학생 테이블의 PK, 성적 테이블의 PK&FK(1대1 관계)로 지정한다.
- 학생 출력시 번호, 학생 이름, 전화번호, 성적 입력 여부가 출력된다.
- 학생 입력은 학생 이름, 전화번호를 입력한다.
- 성적 출력시 번호, 학생이름, 과목1, 과목2, 과목3, 총점, 평균, 판정 점수가 출력한다.
- 판정 기준은 합격, 과락, 불합격으로 구분한다.
- 성적 입력이 안된 학생인 경우는 번호, 학생 이름만 출력하고 점수는 null 문자 또는 X 문자로 출력한다.
- 성적 입력은 학생 개개인별로 과목1, 과목2, 과목3 점수를 입력한다.

2. 화면 구성

--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?1

--- 학생 입력 ---
이름 전화번호(x 종료)?kim 010-111-1111
1명의 학생을 입력했습니다.
이름 전화번호(x 종료)?x

--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?2

-- 성적 입력 ---
학생 번호 검색(x 종료)?1
1, kim, 010-111-1111, O
이미 성적이 입력된 상태입니다.
학생 번호 검색(x 종료)?2
2, park, 010-222-2222, X
과목1의 점수?100
과목2의 점수?100
과목3의 점수?100
1명의 성적을 입력했습니다.
학생 번호 검색(x 종료)?3
검색 결과 없습니다.
학생 번호 검색(x 종료)?x

--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?3

--- 학생 출력 ---
전체 학생 수 : 2명
-----------------------------------------
번호, 학생 이름, 전화번호, 성적 입력 여부
-----------------------------------------
1, kim, 010-111-1111, O
2, park, 010-222-2222, X


--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?4

--- 성적 출력 ---
전체 학생 수 : 2명
-----------------------------------------
번호, 학생이름, 과목1, 과목2, 과목3, 총점, 평균, 판정
-----------------------------------------
1, kim, 100, 100, 100, 300, 100.0, 합격
2, park, null, null, null, null, null, 불합격

--- 성적 관리 ---
1. 학생 입력
2. 성적 입력 (학생 검색)
3. 학생 출력
4. 성적 출력
메뉴 선택(1~4, x 종료)?x


3. 데이터베이스 준비

-- 학생 테이블 생성
CREATE TABLE student (
 sid NUMBER --PK
 ,name VARCHAR2(30)
 ,tel VARCHAR2(30)
);

--PK 제약 추가
ALTER TABLE student
  ADD CONSTRAINT student_sid_pk
      PRIMARY KEY(sid);

--일련번호 생성을 위한 시퀀스 객체 생성
CREATE SEQUENCE studentSeq;

--INSERT 쿼리 샘플 (프로그램 사용 예정)
INSERT INTO student (sid, name, tel)
    VALUES (studentSeq.nextval, 'hong', '010-123-1234');
INSERT INTO student (sid, name, tel)
    VALUES (studentSeq.nextval, 'park', '010-432-4321');
COMMIT;

 

--성적 테이블 생성
CREATE TABLE grade (
 sid NUMBER --PK and FK
 ,sub1 NUMBER(3) --CHECK 제약 추가
 ,sub2 NUMBER(3) --CHECK 제약 추가
 ,sub3 NUMBER(3) --CHECK 제약 추가
);

--문제) 제약 추가
--grade 테이블의 sid 컬럼에 PK 제약 추가.
--grade 테이블의 sid 컬럼에 FK 제약 추가. 참조는 student 테이블의 sid 컬럼 참조.
--grade 테이블의 sub1 컬럼에 CHECK 제약 추가. 0~100 사이의 점수만 입력 가능.
--grade 테이블의 sub2 컬럼에 CHECK 제약 추가. 0~100 사이의 점수만 입력 가능.
--grade 테이블의 sub3 컬럼에 CHECK 제약 추가. 0~100 사이의 점수만 입력 가능.
ALTER TABLE grade
  ADD CONSTRAINT GRADE_SID_PK PRIMARY KEY(sid);
 
ALTER TABLE grade
 ADD (CONSTRAINT GRADE_SID_FK
   FOREIGN KEY(sid)
   REFERENCES student(sid));
ALTER TABLE grade
 ADD (CONSTRAINT GRADE_SUB1_CK
      CHECK (sub1 BETWEEN 0 AND 100)); 
     
ALTER TABLE grade
 ADD (CONSTRAINT GRADE_SUB2_CK CHECK (sub2 BETWEEN 0 AND 100));
 
ALTER TABLE grade
 ADD (CONSTRAINT GRADE_SUB3_CK CHECK (sub3 BETWEEN 0 AND 100));
 

 


--문제) INSERT 쿼리 샘플 (프로그램에서 사용 예정)
--grade 테이블에 'hong'의 성적(과목1, 과목2, 과목3)만 입력할 것.
--COMMIT;
INSERT INTO grade(SID,sub1,sub2,sub3)
  VALUES( 4 ,70,90,85);
COMMIT; 

 

--문제) 학생수 출력 쿼리
SELECT COUNT(*) AS "count"
  FROM student;


--문제) 학생 전체 명단 출력 쿼리 (프로그램에서 사용 예정)
--번호, 학생 이름, 전화번호, 성적 입력 여부(0 또는 1)
--학생 테이블 + 성적 테이블 -> JOIN, SUB QUERY
--OUTER JOIN의 경우
SELECT s.sid, name, tel
  ,DECODE(g.sub1, NULL, 0 , 1) AS gradeCheck
  FROM student s, grade g
  WHERE s.sid = g.sid(+);


--SUB QUERY의 경우


-->뷰(View)로 등록하는 것을 권장
CREATE OR REPLACE VIEW studentView
AS
SELECT s.sid, name, tel
  ,DECODE(g.sub1, NULL, 0 , 1) AS gradeCheck
  FROM student s, grade g
  WHERE s.sid = g.sid(+);

-->뷰를 이용한 학생 전체 명단  출력 쿼리
SELECT sid, name, tel, gradeCheck
  FROM studentView
  ORDER BY sid;


--문제) 학생 검색 쿼리(성적 입력 전에 학생 정보 검색 과정에서 사용. 프로그램에서 사용 예정)
SELECT sid, name, tel, gradeCheck
 FROM studentView
 WHERE sid=번호;


--문제) 성적 출력 쿼리 (프로그램에서 사용 예정)
--번호, 학생이름, 과목1, 과목2, 과목3, 총점, 평균, 판정(0 합격, 1 과락, 2 불합격)
--학생 테이블->번호, 학생이름
--성적 테이블->과목1, 과목2, 과목3
--총점, 평균, 판정 -> 계산 결과
--학생 테이블 + 성적 테이블 -> JOIN, SUB QUERY

-- (과목1 + 과목2 + 과목3) AS 총점
-- ROUND((과목1 + 과목2 + 과목3)/3, 1) AS 평균
-- 판정은 CASE ~ END 구문 사용

 

주의) 오라클에서 NULL 데이터는 자바에서는 String 자료형인 경우에만 처리 가능.
NUMBER -> int -> 숫자 서식 지정 가능
VARCHAR2 -> String -> 문자열 서식 지정 가능
NUMBER + NULL -> String -> NULL이 아닌 경우에만 Integer.parseInt(String) 가능
VARCHAR2 + NULL -> String

--OUTER JOIN의 경우
SELECT sid, name, sub1, sub2, sub3
    , tot, ave
    , CASE
      WHEN ave>=60 AND sub1>=40 AND sub2>=40 AND sub3>=40 THEN 0
      WHEN ave>=60 THEN 1
      ELSE 2
    END AS grade
FROM (SELECT s.sid AS sid, name, sub1, sub2, sub3
  ,(sub1 + sub2 + sub3) AS tot
  ,ROUND((sub1 + sub2 + sub3)/3, 1) AS ave
  FROM student s, grade g
  WHERE s.sid = g.sid(+));

 


--> 뷰(View) 등록
CREATE OR REPLACE VIEW gradeView
AS
SELECT sid, name, sub1, sub2, sub3
    , tot, ave
    , CASE
      WHEN ave>=60 AND sub1>=40 AND sub2>=40 AND sub3>=40 THEN 0
      WHEN ave>=60 THEN 1
      ELSE 2
    END AS grade
FROM (SELECT s.sid AS sid, name, sub1, sub2, sub3
  ,(sub1 + sub2 + sub3) AS tot
  ,ROUND((sub1 + sub2 + sub3)/3, 1) AS ave
  FROM student s, grade g
  WHERE s.sid = g.sid(+));

--> 뷰를 이용한 성적 출력
SELECT sid, name, sub1, sub2, sub3
 , tot  --총점
 , ave  --평균
 , grade --판정
 FROM gradeView
 ORDER BY sid;


SELECT sid, name, sub1, sub2, sub3, tot, ave, grade
 FROM gradeView
 ORDER BY sid


4. 프로그램 구성
//DBConn.java -> 데이터베이스 커넥션 담당 클래스. JDBC 프로젝트 생성시 복사해서 사용 예정
//Student.java -> 자료형 클래스. 학생 정보 저장용.
//Grade.java -> 자료형 클래스. 성적 정보 저장용. NULL 값 처리 주의.
//StudentDAO.java -> 데이터베이스 액션 처리 클래스
//GradeDAO.java -> 데이터베이스 액션 처리 클래스
//MenuAction.java -> 서브 메뉴 액션 클래스. 콘솔 액션.
//Main.java -> main() 메소드. 메인 메뉴 클래스. 콘솔 액션.

//Test.java -> 테스트용 클래스. 데이터베이스 액션에 대한 메소드 단위 테스트.


5. 소스 코드

//DBConn.java -> JDBC 프로젝트 생성시 복사해서 사용
package com.test;

import java.sql.*;

//데이터베이스 연결 액션 클래스
public class DBConn {
 
 //메소드들 내부에서 공통 사용하는 멤버는
 //멤버변수로 등록한다.
 //static 키워드 추가
 private static Connection conn;
 
 //커넥션 객체 준비 메소드
 //-> Singleton
 public static Connection getConnection() throws ClassNotFoundException, SQLException  {
  if (conn == null) {

   Class.forName("oracle.jdbc.driver.OracleDriver");
   conn = DriverManager.getConnection("jdbc:oracle:thin:username/password@IP주소:1521:xe");;
   
  }
  return conn;
 }
 
 //마무리 메소드
 public static void close() {
  try {
   if (conn != null) {
    conn.close();
   }
  }catch(Exception e){
  }
  conn = null;
 }

}

 


//Student.java
package com.test;

//자료형 클래스
public class Student {
 
 //멤버변수 -> 데이터베이스 컬럼명, 출력 항목
 //sid, name, tel, gradeCheck
 //기본 자료형은 String으로 지정.
 
 private String sid, name, tel;
 
 //성적 입력 여부 확인용
 //입력 O -> 1
 //입력 X -> 0
 private int gradeCheck;
 
 public String getSid() {
  return sid;
 }
 public void setSid(String sid) {
  this.sid = sid;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getTel() {
  return tel;
 }
 public void setTel(String tel) {
  this.tel = tel;
 }
 public int getGradeCheck() {
  return gradeCheck;
 }
 public void setGradeCheck(int gradeCheck) {
  this.gradeCheck = gradeCheck;
 }

 
}

 


//StudentDAO.java
package com.test;

import java.util.*;
import java.sql.*;

public class StudentDAO {

 //학생 명단 출력 메소드
 public ArrayList<Student> list() {
  ArrayList<Student> result = new  ArrayList<Student>();
  
  //1. 데이터베이스 연결
  //2. SELECT 쿼리 준비 및 실행
  //3. 결과를 컬렉션에 저장
  //4. 데이터베이스 연결 마무리
  //5. 컬렉션 반환
  
  Connection conn = null;
  Statement stmt = null;
  try {
   conn = DBConn.getConnection();

   stmt = conn.createStatement();
   //주의: 쿼리 문자열 끝에 ;(semicolon) 없음.
   String sql = String.format("SELECT sid, name, tel, gradeCheck  FROM studentView  ORDER BY sid");
   ResultSet rs = stmt.executeQuery(sql);
   
   while(rs.next()) {
    //문제)
    //데이터베이스 자료를 순차적으로 읽어내서
    //Student 객체에 저장하고
    //Student 객체를 컬렉션에 저장하는 액션 추가
    String sid = rs.getString("sid");
    String name = rs.getString("name");
    String tel = rs.getString("tel");
    int gradeCheck = rs.getInt("gradeCheck");
      
    Student s = new Student();
    s.setSid(sid);
    s.setName(name);
    s.setTel(tel);
    s.setGradeCheck(gradeCheck);
    
    result.add(s);

   }
   
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (stmt != null) {
     stmt.close();
    }
   }catch(Exception e){
   }
   DBConn.close();
  }
  
  return result;
 }
 
 
}

 


//Test.java
package com.test;

//데이터베이스 액션 테스트용 클래스
public class Test {
 
 public static void main(String[] args) {
  
  //StudenDAO 클래스의 list() 메소드 테스트
  StudentDAO dao = new StudentDAO();
  System.out.println("SID NAME TEL GRADECHECK");
  System.out.println("------------------------");
  for (Student s : dao.list()) {
   System.out.printf("%s %s %s %s %n"
     , s.getSid()
     , s.getName()
     , s.getTel()
     , (s.getGradeCheck()==1)?"O":"X");
  }
  
 }

}

 


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

 

 

블로그 이미지

알 수 없는 사용자

,

------------------------------------------------
회원관리 JDBC 프로그램 작성2
-> 자료형 클래스 및 액션, 화면구성 클래스 분리


1. 기능 구현
- 이름, 전화번호를 입력 받아서 데이터베이스에 저장
- 번호, 이름, 전화번호를 콘솔에 출력

2. 화면 구성
이름 전화번호(x exit)?kim 010-123-1234
1명의 회원이 추가되었습니다.
이름 전화번호(x exit)?x

------------------
전체 회원수 : 1명
------------------
번호 이름 전화번호
1 kim 010-123-1234
------------------

3. 데이터베이스 준비


--테이블 생성
CREATE TABLE memberList (
  mid NUMBER --회원 고유 번호 지정. PK 지정(필수). 시퀀스 지정(선택).
  ,name NVARCHAR2(20) --한글 입력 가능. 20자 이내
  ,phone VARCHAR2(20) --20자 이내.
);


--제약 조건 추가
ALTER TABLE 테이블이름
 ADD CONSTRAINT 제약이름 제약종류(제약대상);
ALTER TABLE 테이블이름
 DROP CONSTRAINT 제약이름;

--mid 컬럼에 PK 제약 지정
ALTER TABLE memberList
  ADD CONSTRAINT memberList_mid_pk PRIMARY KEY(mid);


--시퀀스 객체 사용시
CREATE SEQUENCE memberListSeq;


--입력 쿼리를 이용한 샘플 데이터 입력.
INSERT INTO memberList (mid, name, phone)
  VALUES (memberListSeq.nextval, 'hong', '010-123-1234');
INSERT INTO memberList (mid, name, phone)
  VALUES (memberListSeq.nextval, 'park', '010-234-2345');
COMMIT;


--권장하지 않는 표현. 컬럼 리스트에서 * 사용하지 않는다.
SELECT * FROM memberList;

--전체 명단 출력 쿼리 (프로그램에서 사용 예정)
--권장하는 표현
SELECT mid, name, phone FROM memberList  ORDER BY mid;

--인원수 출력 쿼리 (프로그램에서 사용 예정)
--함수 사용시 반드시 별칭 사용.
SELECT COUNT(*) AS "count" FROM memberList;

 

 

 

4. 프로그램 준비
//Member.java -> 자료형 클래스
//MemberDAO.java -> 데이터베이스 액션 처리. 메소드 단위로 액션 처리.
//JDBC05.java -> main() 메소드. 화면 구성. 콘솔 액션.


5. 소스 코드

//Member.java
package com.test;

//자료형 클래스
public class Member {

 //멤버변수, getter, setter 등록
 
 //멤버변수
 //입력, 출력에 관련된 모든 항목
 //->번호, 이름, 전화번호

 //동일 자료, 동일 변수 사용할 것.
 //-> 데이터베이스 테이블에서 사용한 컬럼명을 변수명으로 사용.
 //-> 특별한 자료형을 사용하지 않는 경우 외에는 모두 String으로 처리.
 private String mid, name, phone;

 public String getMid() {
  return mid;
 }

 public void setMid(String mid) {
  this.mid = mid;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public String getPhone() {
  return phone;
 }

 public void setPhone(String phone) {
  this.phone = phone;
 }

}

 

 

 

//MemberDAO.java
package com.test;

//1. 패키지 등록
import java.util.*;
import java.sql.*;

//데이터베이스 액션 클래스
//-> 메소드 단위로 작성
//-> 콘솔 관련 액션 코드 작성 X
public class MemberDAO {
 
 //샘플 쿼리 종류만큼 메소드 작성.
 //1. INSERT INTO memberList (mid, name, phone) VALUES (memberListSeq.nextval, 'hong', '010-123-1234');
 //2. SELECT mid, name, phone FROM memberList  ORDER BY mid;
 //3. SELECT COUNT(*) AS "count" FROM memberList;
 //-> 메소드 작성시 데이터베이스 연결 액션은 각각 별도 진행.
 //-> 메소드 작성시 반환자료형, 매개변수 구성 확인
 
 //출력 관련 메소드 -> 인원수 반환
 //->반환자료형 int 사용
 public int count() {
  int result = 0;
  
  Connection conn = null;
  Statement stmt = null;
  try {
   //2. JDBC 드라이버 등록
   Class.forName("oracle.jdbc.driver.OracleDriver");
   
   //3. 커넥션 객체 준비
   conn = DriverManager.getConnection("jdbc:oracle:thin:username/password@IP주소:1521:xe");
      
   //4. 출력 쿼리 준비 및 실행
   stmt = conn.createStatement();
   //주의. 문장 끝에 ;(semicolon) 없다.
   String sql = String.format("SELECT COUNT(*) AS \"count\" FROM memberList");
   //executeQuery() 메소드는 SELECT 쿼리 전용
   ResultSet rs = stmt.executeQuery(sql);
   while(rs.next()) {
    result = rs.getInt("count");
   }
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   //5. 마무리
   try {
    if (stmt != null) {
     stmt.close();
    }
   }catch(Exception e){
   }
   try {
    if (conn != null) {
     conn.close();
    }
   }catch(Exception e){
   }
  }
  
  return result;
 }
 
 //출력 관련 메소드 -> 명단 반환
 //데이터베이스에서 읽어온 자료 전체를 하나의 자료형으로 반환
 //->반환자료형 컬렉션 자료형(ArrayList<Member>) 사용
 public ArrayList<Member> list() {
  ArrayList<Member> result = new ArrayList<Member>();
  
  Connection conn = null;
  Statement stmt = null;
  try {
   //2. JDBC 드라이버 등록
   Class.forName("oracle.jdbc.driver.OracleDriver");
   
   //3. 커넥션 객체 준비
   conn = DriverManager.getConnection("jdbc:oracle:thin:username/password@IP주소:1521:xe");
      
   //문제) 명단 출력 관련 쿼리 액션
   stmt = conn.createStatement();
   String sql = "SELECT mid, name, phone FROM memberList ORDER BY mid";
   ResultSet rs = stmt.executeQuery(sql);
   while(rs.next()) {
    
    String mid = rs.getString("mid");
    //int mid = rs.getInt("mid");
    String name = rs.getString("name");
    String phone = rs.getString("phone");
    
    Member member = new Member();
    member.setMid(mid);
    member.setName(name);
    member.setPhone(phone);
    
    result.add(member);
    
   }
   rs.close();
   
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (stmt != null) {
     stmt.close();
    }
   }catch(Exception e){
   }
   try {
    if (conn != null) {
     conn.close();
    }
   }catch(Exception e){
   }
  }
  
  return result;
 }
 
 //입력 관련 메소드
 //-> 반환 자료형 int 사용
 //-> 입력 실패시 예외 발생
 //-> 입력 데이터는 매개변수를 통해서 전달 받는다.
 public int add(Member member) {
  int result = 0;

  Connection conn = null;
  Statement stmt = null;
  try {
   //2. JDBC 드라이버 등록
   Class.forName("oracle.jdbc.driver.OracleDriver");
   
   //3. 커넥션 객체 준비
   conn = DriverManager.getConnection("jdbc:oracle:thin:username/password@IP주소:1521:xe");
   
   
   //문제) 입력 관련 쿼리 액션
   stmt = conn.createStatement();
   String sql = String.format("INSERT INTO memberList (mid, name, phone) VALUES (memberListSeq.nextval, '%s', '%s')"
     , member.getName(), member.getPhone());
   
   result = stmt.executeUpdate(sql);
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (stmt != null) {
     stmt.close();
    }
   }catch(Exception e){
   }
   try {
    if (conn != null) {
     conn.close();
    }
   }catch(Exception e){
   }
  }
  
  return result;
 }


}

 

 

 


//JDBC05.java
package com.test;

import java.util.*;

//콘솔 액션 클래스
public class JDBC05 {

 public static void main(String[] args) {
  
  //MemberDAO 객체를 위한 지역변수 선언
  MemberDAO dao = new MemberDAO();
  
  //입력 과정
  Scanner sc = new Scanner(System.in);
  
  //문제) 입력 관련 콘솔 액션 부분 작성
  do {
   
   System.out.print("이름 전화번호(x exit)?");
   String name = sc.next();
   if (name.equalsIgnoreCase("x")) {
    break;
   }
   String phone = sc.next(); 
   
   Member member = new Member();
   member.setName(name);
   member.setPhone(phone);

   int result = dao.add(member);
   //System.out.printf("1개 행이 삽입되었습니다.%n");
   System.out.printf("%d개 행이 삽입되었습니다.%n", result);
   
  }while(true);
  sc.close();
  
  
  //출력 과정
  //저장소로부터 회원 정보 전체를 반환하는 메소드 호출
  //-> list()->ArrayList<Member>
  //-> 컬렉션에 들어있는 회원 정보(Member 자료형)를 순차적으로 출력
  //-> 향상된 for문 이용 
  
  System.out.printf("전체 인원수 : %s명 %n", dao.count());
  
  for (Member m : dao.list()) {
   System.out.printf("%s %s %s %n"
     , m.getMid()
     , m.getName()
     , m.getPhone());
  }

 }

}

 

 

 

----------------------------------------------
콘솔, 데이터베이스 액션이 클래스별로 분리가 되었다.

데이터베이스 액션 처리 클래스 내부에서 보면, 데이터베이스 연결 및 연결 종료 과정에 대해서 중복(반복)된 코드가 존재한다.
-> 데이터베이스 연결 및 연결 종료 과정을 별도의 클래스(메소드)로 분리할 필요가 있다.

입력 쿼리에서 외부 데이터를 바인딩할 때 String.format() 메소드, %s 문자열보다는 PrepareStatement 객체를 이용한 바인딩 방법을 권장한다.
-> Statement 객체를 PrepareStatment 객체로 변경. 바인딩 문자열 ? 로 변경

 


//DBConn.java
package com.test;

import java.sql.*;

//데이터베이스 연결 액션 클래스
public class DBConn {
 
 //메소드들 내부에서 공통 사용하는 멤버는
 //멤버변수로 등록한다.
 //static 키워드 추가
 private static Connection conn;
 
 //커넥션 객체 준비 메소드
 //-> Singleton
 public static Connection getConnection() throws ClassNotFoundException, SQLException  {
  if (conn == null) {

   Class.forName("oracle.jdbc.driver.OracleDriver");
   conn = DriverManager.getConnection("jdbc:oracle:thin:username/password@IP주소:1521:xe");;

  }
  return conn;
 }
 
 //마무리 메소드
 public static void close() {
  try {
   if (conn != null) {
    conn.close();
   }
  }catch(Exception e){
  }
  conn = null;
 }

}

 

 

//MemberDAO.java -> DBConn 클래스 사용 버전
package com.test;

//1. 패키지 등록
import java.util.*;
import java.sql.*;

//데이터베이스 액션 클래스
//-> 메소드 단위로 작성
//-> 콘솔 관련 액션 코드 작성 X
public class MemberDAO {
 
 //샘플 쿼리 종류만큼 메소드 작성.
 //1. INSERT INTO memberList (mid, name, phone) VALUES (memberListSeq.nextval, 'hong', '010-123-1234');
 //2. SELECT mid, name, phone FROM memberList  ORDER BY mid;
 //3. SELECT COUNT(*) AS "count" FROM memberList;
 //-> 메소드 작성시 데이터베이스 연결 액션은 각각 별도 진행.
 //-> 메소드 작성시 반환자료형, 매개변수 구성 확인
 
 //출력 관련 메소드 -> 인원수 반환
 //->반환자료형 int 사용
 public int count() {
  int result = 0;
  
  Connection conn = null;
  Statement stmt = null;
  try {
   
   conn = DBConn.getConnection();
   
   //4. 출력 쿼리 준비 및 실행
   stmt = conn.createStatement();
   //주의. 문장 끝에 ;(semicolon) 없다.
   String sql = String.format("SELECT COUNT(*) AS \"count\" FROM memberList");
   //executeQuery() 메소드는 SELECT 쿼리 전용
   ResultSet rs = stmt.executeQuery(sql);
   while(rs.next()) {
    result = rs.getInt("count");
   }
   rs.close();
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   //5. 마무리
   try {
    if (stmt != null) {
     stmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();
   
  }
  
  return result;
 }
 
 //출력 관련 메소드 -> 명단 반환
 //데이터베이스에서 읽어온 자료 전체를 하나의 자료형으로 반환
 //->반환자료형 컬렉션 자료형(ArrayList<Member>) 사용
 public ArrayList<Member> list() {
  ArrayList<Member> result = new ArrayList<Member>();
  
  Connection conn = null;
  Statement stmt = null;
  try {

   conn = DBConn.getConnection();
   
   //문제) 명단 출력 관련 쿼리 액션
   stmt = conn.createStatement();
   String sql = "SELECT mid, name, phone FROM memberList ORDER BY mid";
   ResultSet rs = stmt.executeQuery(sql);
   while(rs.next()) {
    
    String mid = rs.getString("mid");
    //int mid = rs.getInt("mid");
    String name = rs.getString("name");
    String phone = rs.getString("phone");
    
    Member member = new Member();
    member.setMid(mid);
    member.setName(name);
    member.setPhone(phone);
    
    result.add(member);
    
   }
   rs.close();
   
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (stmt != null) {
     stmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();
   
  }
  
  return result;
 }
 
 //입력 관련 메소드
 //-> 반환 자료형 int 사용
 //-> 입력 실패시 예외 발생
 //-> 입력 데이터는 매개변수를 통해서 전달 받는다.
 public int add(Member member) {
  int result = 0;

  Connection conn = null;
  Statement stmt = null;
  try {

   conn = DBConn.getConnection();
   
   //문제) 입력 관련 쿼리 액션
   stmt = conn.createStatement();
   String sql = String.format("INSERT INTO memberList (mid, name, phone) VALUES (memberListSeq.nextval, '%s', '%s')"
     , member.getName(), member.getPhone());
   
   result = stmt.executeUpdate(sql);
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (stmt != null) {
     stmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();
   
  }
  
  return result;
 }


}

 

 

 

---------------------------
Statement 객체 종류별 액션 처리(Statement)

1. Creating Statement Object

Statement stmt = conn.createStatement();

2. execute methods

- boolean execute(String SQL) : Returns a boolean value of true if a ResultSet object can be retrieved; otherwise, it returns false. Use this method to execute SQL DDL statements or when you need to use truly dynamic SQL.

- int executeUpdate(String SQL) : Returns the numbers of rows affected by the execution of the SQL statement. Use this method to execute SQL statements for which you expect to get a number of rows affected - for example, an INSERT, UPDATE, or DELETE statement.

- ResultSet executeQuery(String SQL) : Returns a ResultSet object. Use this method when you expect to get a result set, as you would with a SELECT statement.

3.Closing Statement Obeject

stmt.close();


-------------------------------------------
Employees 테이블의 자료 삭제 과정

DELETE FROM employees WHERE id=100;

SELECT * FROM employees;

ROLLBACK;
--COMMIT;


-----------------------------------------
Employees 테이블의 자료 삭제 과정(Statement 객체 이용)

//Sample06.java
package com.test;

import java.sql.*;
import java.util.*;

public class Sample06 {

 public static void main(String[] args) {
  
  Scanner sc = new Scanner(System.in);
  
  Connection conn = null;
  Statement stmt = null;
  try {
   
   //id 기준 삭제 데이터 입력 추가
   System.out.print("id(x exit)?");
   String id = sc.next();
   if (id.equalsIgnoreCase("x")) {
    return;
   }
   
   Class.forName("oracle.jdbc.driver.OracleDriver");
   
   String url = "jdbc:oracle:thin:아이디/패스워드@211.63.89.XX:1521:xe";
   conn = DriverManager.getConnection(url);
   
   stmt = conn.createStatement();
   String sql = String.format("DELETE FROM employees WHERE id=%s", id);
   int result = stmt.executeUpdate(sql);
   //auto COMMIT
   System.out.printf("%d개의 행이 삭제되었습니다. %n", result);
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (stmt != null) {
     stmt.close();
    }
    if (conn != null) {
     conn.close();
    }
   }catch(Exception e){
    e.printStackTrace();
   }
  }

  sc.close();

 }

}

 


---------------------------
Statement 객체 종류별 액션 처리(PreparedStatement)

1. Creating PreparedStatement Object

String sql = "쿼리(데이터 바인딩 과정 필요-> ? 서식)";
PreparedStatement pstmt = conn.prepareStatement(sql);


2. 데이터 바인딩

pstmt.setXXX(인덱스, 값); //인덱스는 1부터 출발.


예를 들어,
String sql = "DELETE FROM employees WHERE id=?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);


3. execute methods

- boolean execute() : Returns a boolean value of true if a ResultSet object can be retrieved; otherwise, it returns false. Use this method to execute SQL DDL statements or when you need to use truly dynamic SQL.

- int executeUpdate() : Returns the numbers of rows affected by the execution of the SQL statement. Use this method to execute SQL statements for which you expect to get a number of rows affected - for example, an INSERT, UPDATE, or DELETE statement.

- ResultSet executeQuery() : Returns a ResultSet object. Use this method when you expect to get a result set, as you would with a SELECT statement.

4. Closing PreparedStatement Obeject

pstmt.close();


-----------------------------------------
Employees 테이블의 자료 삭제 과정(PreparedStatement 객체 이용)

//JDBC06.java
package com.test;

import java.sql.*;

public class JDBC06 {

 public static void main(String[] args) {

  Connection conn = null;
  //Statement stmt = null;
  PreparedStatement pstmt = null;
  try {
   
   conn = DBConn.getConnection();
   
   String id = "104";
   String age = "20";
   String first = "Steven";
   String last = "King";
   
   //String sql1 = String.format("INSERT INTO employees (id, age, first, last) VALUES (%s, %s, '%s', '%s')", id, age, first, last);
   String sql2 = String.format("INSERT INTO employees (id, age, first, last) VALUES (?, ?, ?, ?)");
   //stmt = conn.createStatement();
   pstmt = conn.prepareStatement(sql2); //쿼리를 사전 분석한다.
   
   //int result = stmt.executeUpdate(sql1); //쿼리를 실행시 분석한다.
   pstmt.setInt(1, Integer.parseInt(id));
   pstmt.setInt(2, Integer.parseInt(age));
   pstmt.setString(3, first); //'(작은 따옴표) 추가
   pstmt.setString(4, last); //'(작은 따옴표) 추가
   int result = pstmt.executeUpdate();
   
   System.out.printf("%d개의 행이 삽입되었습니다.", result);
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    /*
    if (stmt != null) {
     stmt.close();
    }
    */
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();
  }
  
  
 }

}

 


//JDBC07.java
package com.test;

import java.sql.*;

public class JDBC07 {

 public static void main(String[] args) {
  
  Connection conn = null;
  //Statement stmt = null;
  PreparedStatement pstmt = null;
  try {
   
   conn = DBConn.getConnection();
   
   String id = "104";
   
   //String sql1 = String.format("DELETE FROM employees WHERE id=%s", id);
   String sql2 = String.format("DELETE FROM employees WHERE id=?");
   //stmt = conn.createStatement();
   pstmt = conn.prepareStatement(sql2); //쿼리를 사전 분석한다.
   
   //int result = stmt.executeUpdate(sql1); //쿼리를 실행시 분석한다.
   pstmt.setInt(1, Integer.parseInt(id)); //바인딩 문자열 ? 와 데이터를 바인딩하는 과정
   int result = pstmt.executeUpdate();
   
   System.out.printf("%d개의 행이 삭제되었습니다.", result);
   
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    /*
    if (stmt != null) {
     stmt.close();
    }
    */
    if (pstmt != null) {
     pstmt.close();
    }
   }catch(Exception e){
   }
   
   DBConn.close();
  }  
  

 }

}

 

 

--------------------------------
저장 프로시저 생성

CREATE OR REPLACE PROCEDURE 프로시저명
(
  매개변수 자료형,
  매개변수 자료형,
  ...
)
IS
  내부변수 자료형;
  ...
BEGIN
  PL/SQL 구문;
END;

EXECUTE 프로시저명(값, ....);

 

--employees 테이블 자료 삭제용 프로시저 작성
CREATE OR REPLACE PROCEDURE empDelete
(
 vid NUMBER
)
IS
BEGIN
 DELETE FROM employees WHERE id=vid;
 COMMIT;
END;

EXECUTE empDelete(100);
EXECUTE empDelete(101);

SELECT * FROM employees;

 


---------------------------
Statement 객체 종류별 액션 처리(CallableStatement)


1.Creating CallableStatement Object

String sql = "{call 프로시저명(바인딩 문자열 ?)}";
CallableStatement  cstmt = conn.prepareCall(sql);

2. 데이터 바인딩

cstmt.setXXX(인덱스, 값); //인덱스는 1부터 출발

3. execute methods

- boolean execute() : Returns a boolean value of true if a ResultSet object can be retrieved; otherwise, it returns false. Use this method to execute SQL DDL statements or when you need to use truly dynamic SQL.


4. Closing CallableStatement  Obeject

cstmt.close();

-----------------------------------------
Employees 테이블의 자료 삭제 과정(CallableStatement 객체 이용)

//Sample08.java
package com.test;

import java.sql.*;
import java.util.*;

public class Sample08 {

 public static void main(String[] args) {
  
  Scanner sc = new Scanner(System.in);
  
  Connection conn = null;
  CallableStatement cstmt = null;
  try {
   
   //id 기준 삭제 데이터 입력 추가
   System.out.print("id(x exit)?");
   String id = sc.next();
   if (id.equalsIgnoreCase("x")) {
    return;
   }
   
   Class.forName("oracle.jdbc.driver.OracleDriver");
   
   String url = "jdbc:oracle:thin:아이디/패스워드@211.63.89.XX:1521:xe";
   conn = DriverManager.getConnection(url);
   
   String sql = "{call empDelete(?)}";
   cstmt = conn.prepareCall(sql);
   cstmt.setInt(1, Integer.parseInt(id));

   //true -> SELECT 쿼리 실행시
   //false -> INSERT, UPDATE, DELETE 쿼리 실행시
   boolean result = cstmt.execute();
   if (!result) {
    System.out.println("empDelete 프로시저 실행 완료!");
   }    

  }catch(Exception e){
   e.printStackTrace();
  }finally{
   try {
    if (cstmt != null) {
     cstmt.close();
    }
    if (conn != null) {
     conn.close();
    }
   }catch(Exception e){
    e.printStackTrace();
   }
  }
  
  sc.close();

 }

}


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


 

 

'JDBC' 카테고리의 다른 글

6일차_성적관리_최종버전  (0) 2015.06.21
5일차_성적관리  (0) 2015.06.21
4일차_성적관리  (0) 2015.06.21
2일차_JDBC Connection 방법, 회원관리 JDBC 프로그램1  (0) 2015.06.21
1일차_JDBC 환경설정, Sample Code  (0) 2015.06.21
블로그 이미지

알 수 없는 사용자

,