-
006. DB 연동 직원 관리 프로그램 구현 (해설)SsY/Class 2023. 4. 28. 12:50728x90
JDBC05_1
- DBConn
- JDBC05 에서 복사 가져오기
SQL DEVELOPER
더보기※ 5. INSERT 문에도 서브쿼리 사용 가능
7. VIEW 의 활용을 잘하자SELECT USER FROM DUAL; --==>> SCOTT --■■■ 문제 해결을 위한 쿼리문 준비 ■■■-- DESC TBL_EMP; --==>> /* 이름 널? 유형 -------- -------- ------------ EMP_ID NOT NULL NUMBER(5) EMP_NAME VARCHAR2(30) SSN CHAR(14) IBSADATE DATE CITY_ID NUMBER(5) TEL VARCHAR2(20) BUSEO_ID NUMBER(5) JIKWI_ID NUMBER(5) BASICPAY NUMBER(10) SUDANG NUMBER(10) */ --1. 지역 리스트 조회 쿼리문 구성 -- 입력 받을 때 사용 SELECT CITY_NAME FROM TBL_CITY; --> 한 줄 구성 SELECT CITY_NAME FROM TBL_CITY ; --2. 부서 리스트 조회 쿼리문 구성 -- 입력 받을 때 사용 SELECT BUSEO_NAME FROM TBL_BUSEO; --> SELECT BUSEO_NAME FROM TBL_BUSEO ; --3. 직위 리스트 조회 쿼리문 구성 -- 입력 받을 때 사용 SELECT JIKWI_NAME FROM TBL_JIKWI; --> SELECT JIKWI_NAME FROM TBL_JIKWI ; --4. 직위에 따른 최소 기본급 조회 쿼리문 구성 -- 입력 받을 때 사용 SELECT MIN_BASICPAY FROM TBL_JIKWI WHERE JIKWI_NAME = '부장'; --> SELECT MIN_BASICPAY FROM TBL_JIKWI WHERE JIKWI_NAME = '부장' ; -- 5번 + CITY명 -> CITY_ID SELECT CITY_ID FROM TBL_CITY WHERE CITY_NAME = '경기' ; -- 5번 ++ 부서명 -> 부서ID SELECT BUSEO_ID FROM TBL_BUSEO WHERE BUSEO_NAME='개발부' ; -- 5번 +++ 직위명 -> 직위ID SELECT JIKWI_ID FROM TBL_JIKWI WHERE JIKWI_NAME='대리' ; --5. 데이터(직원 데이터) 입력 쿼리문 구성 INSERT INTO TBL_EMP(EMP_ID, EMP_NAME, SSN, IBSADATE, CITY_ID, TEL, BUSEO_ID, JIKWI_ID, BASICPAY, SUDANG) VALUES(EMPSEQ.NEXTVAL, '유서영', '990224-2234567', TO_DATE('2019-06-08','YYYY-MM-DD') ,(SELECT CITY_ID FROM TBL_CITY WHERE CITY_NAME = '경기') ,'010-2222-2222' , (SELECT BUSEO_ID FROM TBL_BUSEO WHERE BUSEO_NAME='개발부') , (SELECT JIKWI_ID FROM TBL_JIKWI WHERE JIKWI_NAME='대리') , 5000000 , 2000000); --> INSERT INTO TBL_EMP(EMP_ID, EMP_NAME, SSN, IBSADATE, CITY_ID, TEL, BUSEO_ID, JIKWI_ID, BASICPAY, SUDANG) VALUES(EMPSEQ.NEXTVAL, '유서영', '990224-2234567', TO_DATE('2019-06-08','YYYY-MM-DD'),(SELECT CITY_ID FROM TBL_CITY WHERE CITY_NAME = '경기'),'010-2222-2222', (SELECT BUSEO_ID FROM TBL_BUSEO WHERE BUSEO_NAME='개발부'), (SELECT JIKWI_ID FROM TBL_JIKWI WHERE JIKWI_NAME='대리'), 5000000, 2000000) ; --==>> 1 행 이(가) 삽입되었습니다. SELECT * FROM TBL_EMP; COMMIT; --==>> 커밋 완료. --6. 전체 직원 수 출력 쿼리문 구성 SELECT COUNT(*) AS COUNT FROM TBL_EMP; --> SELECT COUNT(*) AS COUNT FROM TBL_EMP ; --7. 전체 직원 리스트 조회 쿼리문 구성 -- 사번, 이름, 주민번호, 입사일, 지역, 전화번호, 부서, 직위, 기본급, 수당, 급여 --SELECT EMP_ID, EMP_NAME, SSN, IBSADATE, CITY_ID, TEL, BUSEO_ID, JIKWI_ID, BASICPAY, SUDANG --FROM TBL_EMP; SELECT E.EMP_ID, E.EMP_NAME, E.SSN, TO_CHAR(E.IBSADATE,'YYYY-MM-DD') AS IBSADATE , C.CITY_NAME, E.TEL, B.BUSEO_NAME, J.JIKWI_NAME , E.BASICPAY, E.SUDANG , (E.BASICPAY + E.SUDANG) AS PAY FROM TBL_EMP E, TBL_CITY C, TBL_BUSEO B, TBL_JIKWI J WHERE E.CITY_ID = C.CITY_ID AND E.BUSEO_ID = B.BUSEO_ID AND E.JIKWI_ID = J.JIKWI_ID; -- 7.1 뷰 생성(EMPVIEW) CREATE OR REPLACE VIEW EMPVIEW AS SELECT E.EMP_ID, E.EMP_NAME, E.SSN, TO_CHAR(E.IBSADATE,'YYYY-MM-DD') AS IBSADATE , C.CITY_NAME, E.TEL, B.BUSEO_NAME, J.JIKWI_NAME , E.BASICPAY, E.SUDANG , (E.BASICPAY + E.SUDANG) AS PAY FROM TBL_EMP E, TBL_CITY C, TBL_BUSEO B, TBL_JIKWI J WHERE E.CITY_ID = C.CITY_ID AND E.BUSEO_ID = B.BUSEO_ID AND E.JIKWI_ID = J.JIKWI_ID; --==>> View EMPVIEW이(가) 생성되었습니다. -- 생성 된 뷰(VIEW) 확인 SELECT * FROM EMPVIEW; --> SELECT * FROM EMPVIEW ; --8. 전체 직원 리스트 출력 쿼리문 구성(사번/이름/부서/직위/급여내림차순) -- 사번, 이름, 주민번호, 입사일, 지역, 전화번호, 부서, 직위, 기본급, 수당, 급여 SELECT EMP_ID, EMP_NAME, SSN, IBSADATE , CITY_NAME, TEL, BUSEO_NAME, JIKWI_NAME , BASICPAY, SUDANG, PAY FROM EMPVIEW --ORDER BY EMP_ID; -- 사번 --ORDER BY EMP_NAME; -- 이름 --ORDER BY BUSEO_NAME; -- 부서 --ORDER BY JIKWI_NAME; -- 직위 ORDER BY PAY DESC; -- 기본급 --> SELECT EMP_ID, EMP_NAME, SSN, IBSADATE, CITY_NAME, TEL, BUSEO_NAME, JIKWI_NAME, BASICPAY, SUDANG, PAY FROM EMPVIEW ORDER BY EMP_ID ; -- 전화번호 없는 직원들을 위한 쿼리문 구성 SELECT EMP_ID, EMP_NAME, SSN, IBSADATE, CITY_NAME, NVL(TEL,'번호없음') AS TEL, BUSEO_NAME, JIKWI_NAME, BASICPAY, SUDANG, PAY FROM EMPVIEW ORDER BY EMP_ID ; --9. 검색 직원 수 출력 쿼리문 구성(사번/이름/부서/직위) SELECT COUNT(*) AS COUNT FROM EMPVIEW --WHERE EMP_ID = 1002; --WHERE EMP_NAME = '유서영'; --WHERE BUSEO_NAME='개발부'; WHERE JIKWI_NAME='대리'; --> SELECT COUNT(*) AS COUNT FROM EMPVIEW WHERE EMP_ID = 1002 ; --10. 검색 직원 쿼리문 구성 SELECT EMP_ID, EMP_NAME, SSN, IBSADATE , CITY_NAME, NVL(TEL,'번호없음') AS TEL , BUSEO_NAME, JIKWI_NAME , BASICPAY, SUDANG, PAY FROM EMPVIEW --WHERE EMP_ID = 1002; --WHERE EMP_NAME = '유서영'; --WHERE BUSEO_NAME = '개발부'; WHERE JIKWI_NAME='대리'; --> SELECT EMP_ID, EMP_NAME, SSN, IBSADATE, CITY_NAME, NVL(TEL,'번호없음') AS TEL, BUSEO_NAME, JIKWI_NAME, BASICPAY, SUDANG, PAY FROM EMPVIEW WHERE EMP_ID = 1002 ; --11. 직원 데이터 수정 쿼리문 구성 UPDATE TBL_EMP SET EMP_NAME = '박건우', SSN ='991212-1234567' , IBSADATE = TO_DATE('2022-10-10','YYYY-MM-DD') , CITY_ID =(SELECT CITY_ID FROM TBL_CITY WHERE CITY_NAME = '제주') , TEL = '010-3333-3333' , BUSEO_ID =(SELECT BUSEO_ID FROM TBL_BUSEO WHERE BUSEO_NAME = '개발부') , JIKWI_ID =(SELECT JIKWI_ID FROM TBL_JIKWI WHERE JIKWI_NAME = '과장') , BASICPAY = 3000000 , SUDANG = 3000000 WHERE EMP_ID = 1002; --> UPDATE TBL_EMP SET EMP_NAME = '박건우', SSN ='991212-1234567', IBSADATE = TO_DATE('2022-10-10','YYYY-MM-DD'), CITY_ID =(SELECT CITY_ID FROM TBL_CITY WHERE CITY_NAME = '제주'), TEL = '010-3333-3333', BUSEO_ID =(SELECT BUSEO_ID FROM TBL_BUSEO WHERE BUSEO_NAME = '개발부'), JIKWI_ID =(SELECT JIKWI_ID FROM TBL_JIKWI WHERE JIKWI_NAME = '과장'), BASICPAY = 3000000, SUDANG = 3000000 WHERE EMP_ID = 1002 ; --==>> 1 행 이(가) 업데이트되었습니다. SELECT * FROM TBL_EMP; COMMIT; --==>> 커밋 완료. --12. 직원 데이터 삭제 쿼리문 구성 SELECT * FROM TBL_EMP WHERE EMP_ID=1002; DELETE FROM TBL_EMP WHERE EMP_ID=1002; --> DELETE FROM TBL_EMP WHERE EMP_ID=1002 ; --==> 1 행 이(가) 삭제되었습니다. ROLLBACK; --==>> 롤백 완료.
- MemberDTO
- 주요 속성 구성을 위해 앞서 필요한 쿼리문들을 구성하고 ECLIPSE 에서 작업한다
/*=================== MemberDTO.java =====================*/ /* 이름 널? 유형 -------- -------- ------------ EMP_ID NOT NULL NUMBER(5) EMP_NAME VARCHAR2(30) SSN CHAR(14) IBSADATE DATE CITY_ID NUMBER(5) TEL VARCHAR2(20) BUSEO_ID NUMBER(5) JIKWI_ID NUMBER(5) BASICPAY NUMBER(10) SUDANG NUMBER(10) */ package com.test; public class MemberDTO { // 주요 속성 구성 //-- 사번, 이름, 주민번호, 입사일, 지역, 전화번호 // , 부서, 직위, 기본급, 수당, 급여 private int empId, basicPay, sudang, pay; private String empName, ssn, cityName, tel, buseoName, jikwiName; private String ibsaDate; // ※ 입사일은 오라클에서 날짜 형식으로 처리되지만 문자열로 구성 // getter / setter 구성 public int getEmpId() { return empId; } public void setEmpId(int empId) { this.empId = empId; } 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; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } public String getSsn() { return ssn; } public void setSsn(String ssn) { this.ssn = ssn; } public String getCityName() { return cityName; } public void setCityName(String cityName) { this.cityName = cityName; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getBuseoName() { return buseoName; } public void setBuseoName(String buseoName) { this.buseoName = buseoName; } public String getJikwiName() { return jikwiName; } public void setJikwiName(String jikwiName) { this.jikwiName = jikwiName; } public String getIbsaDate() { return ibsaDate; } public void setIbsaDate(String ibsaDate) { this.ibsaDate = ibsaDate; } }
- MemberDAO
- 검색 결과 직원 수 조회 memberCount(value, key) 오버로딩 (MAP 자료구조 느낌)
- 직원 데이터 전체 조회와 같이 order by 절만 변하는 경우도 매개변수 넘겨받아서 메소드 하나로 처리가능
- 직원 데이터 검색 조회는 ( 직원수 조회 + 데이터 전체조회 ) 구조로 메소드 하나로 처리 가능
- 지역/부서/직위 리스트의 경우 String 단일 값만 들어가기 때문에 ArrayList<String> 으로 return 가능
이 경우, 반복문에서 단일 String 값이 나올 때마다, 바로 ArrayList 에 String 값 추가 가능
/*========================================= MemberDAO.java - 데이터베이스 액션 처리 전용 클래스 ==========================================*/ package com.test; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import com.util.DBConn; public class MemberDAO { // ○ 주요 속성 구성 private Connection conn; // ○ 주요 기능 정의 // - 데이터베이스 연결 public Connection connection() { conn = DBConn.getConnection(); return conn; } // - 데이터베이스 연결 종료 public void close() { DBConn.close(); } // - 직원 데이터 입력 public int add(MemberDTO dto) throws SQLException { int result = 0; Statement stmt = conn.createStatement(); String sql = String.format("INSERT INTO TBL_EMP" + "(EMP_ID, EMP_NAME, SSN, IBSADATE, CITY_ID" + ", TEL, BUSEO_ID, JIKWI_ID, BASICPAY, SUDANG)" + " VALUES(EMPSEQ.NEXTVAL, '%s', '%s', TO_DATE('%s','YYYY-MM-DD')" + ",(SELECT CITY_ID FROM TBL_CITY WHERE CITY_NAME = '%s')" + ",'%s'" + ", (SELECT BUSEO_ID FROM TBL_BUSEO WHERE BUSEO_NAME='%s')" + ", (SELECT JIKWI_ID FROM TBL_JIKWI WHERE JIKWI_NAME='%s')" + ", %d, %d)" , dto.getEmpName(),dto.getSsn(), dto.getIbsaDate() , dto.getCityName(),dto.getTel(), dto.getBuseoName(), dto.getJikwiName() , dto.getBasicPay(), dto.getSudang()); result = stmt.executeUpdate(sql); stmt.close(); return result; } // - 전체 직원 수 조회 public int memberCount() throws SQLException { int result = 0; Statement stmt = conn.createStatement(); String sql = "SELECT COUNT(*) AS COUNT FROM TBL_EMP"; ResultSet rs = stmt.executeQuery(sql); //ResultSet 처리 → 반복문 구성(단일 값의 경우 조건문도 가능) → 결과 수신 while (rs.next()) result = rs.getInt("COUNT"); rs.close(); stmt.close(); return result; } // - 검색 결과 직원 수 조회 // map // EMP_ID = 1002; → key : EMP_ID / value : 1002 // EMP_NAME = '유서영'; → key : EMP_NAME / value : '유서영' // BUSEO_NAME='개발부'; → key : BUSEO_NAME / value : '개발부' // JIKWI_NAME='대리'; → key : JIKWI_NAME / value : '대리' public int memberCount(String key, String value) throws SQLException { int result = 0; Statement stmt = conn.createStatement(); String sql = ""; if (key.contentEquals("EMP_ID")) sql = String.format("SELECT COUNT(*) AS COUNT FROM EMPVIEW WHERE %s = %s", key, value); else sql = String.format("SELECT COUNT(*) AS COUNT FROM EMPVIEW WHERE %s = '%s'", key, value); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) result = rs.getInt("COUNT"); rs.close(); stmt.close(); return result; } // - 직원 데이터 전체 조회(사번/이름/부서/직위/급여내림차순) public ArrayList<MemberDTO> lists(String key) throws SQLException { // 반환할 결과 값 선언 및 초기화 ArrayList<MemberDTO> result = new ArrayList<MemberDTO>(); // 작업 객체 생성 Statement stmt = conn.createStatement(); // 쿼리문 준비 String sql = String.format("SELECT EMP_ID, EMP_NAME, SSN, IBSADATE" + ", CITY_NAME, NVL(TEL,'번호없음') AS TEL" + ", BUSEO_NAME, JIKWI_NAME" + ", BASICPAY, SUDANG, PAY" + " FROM EMPVIEW" + " ORDER BY %s" , key); // 쿼리문 실행 ResultSet rs = stmt.executeQuery(sql); // ResultSet 처리 → 반복문 구성 while (rs.next()) { // 한 개의 MemberDTO 생성 → 비어있는 상태 MemberDTO dto = new MemberDTO(); // 생성된 MemberDTO 에 값 채워넣기 → 속성값이 채워진 MemberDTO 구성 dto.setEmpId(rs.getInt("EMP_ID")); dto.setEmpName(rs.getString("EMP_NAME")); dto.setSsn(rs.getString("SSN")); dto.setIbsaDate(rs.getString("IBSADATE")); dto.setCityName(rs.getString("CITY_NAME")); dto.setTel(rs.getString("TEL")); dto.setBuseoName(rs.getString("BUSEO_NAME")); dto.setJikwiName(rs.getString("JIKWI_NAME")); dto.setBasicPay(rs.getInt("BASICPAY")); dto.setSudang(rs.getInt("SUDANG")); dto.setPay(rs.getInt("PAY")); // ArrayList 에 요소로 추가 result.add(dto); } // 리소스 반납 rs.close(); stmt.close(); // 최종 결과값 반환 return result; } // - 직원 데이터 검색 조회(사번/이름/부서/직위) public ArrayList<MemberDTO> searchList(String key, String value) throws SQLException { ArrayList<MemberDTO> result = new ArrayList<MemberDTO>(); Statement stmt = conn.createStatement(); String sql = ""; if (key.equals("EMP_ID")) { sql = String.format("SELECT EMP_ID, EMP_NAME, SSN, IBSADATE" + ", CITY_NAME, NVL(TEL,'번호없음') AS TEL" + ", BUSEO_NAME, JIKWI_NAME" + ", BASICPAY, SUDANG, PAY" + " FROM EMPVIEW" + " WHERE %s = %s", key, value); } else { sql = String.format("SELECT EMP_ID, EMP_NAME, SSN, IBSADATE" + ", CITY_NAME, NVL(TEL,'번호없음') AS TEL" + ", BUSEO_NAME, JIKWI_NAME" + ", BASICPAY, SUDANG, PAY" + " FROM EMPVIEW" + " WHERE %s = '%s'", key, value); } ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { MemberDTO dto = new MemberDTO(); dto.setEmpId(rs.getInt("EMP_ID")); dto.setEmpName(rs.getString("EMP_NAME")); dto.setSsn(rs.getString("SSN")); dto.setIbsaDate(rs.getString("IBSADATE")); dto.setCityName(rs.getString("CITY_NAME")); dto.setTel(rs.getString("TEL")); dto.setBuseoName(rs.getString("BUSEO_NAME")); dto.setJikwiName(rs.getString("JIKWI_NAME")); dto.setBasicPay(rs.getInt("BASICPAY")); dto.setSudang(rs.getInt("SUDANG")); dto.setPay(rs.getInt("PAY")); result.add(dto); } rs.close(); stmt.close(); return result; } // 지역 리스트 조회 public ArrayList<String> searchCity() throws SQLException { ArrayList<String> result = new ArrayList<String>(); Statement stmt = conn.createStatement(); String sql = "SELECT CITY_NAME FROM TBL_CITY"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) result.add(rs.getString("CITY_NAME")); rs.close(); stmt.close(); return result; } // 부서 리스트 조회 public ArrayList<String> searchBuseo() throws SQLException { ArrayList<String> result = new ArrayList<String>(); Statement stmt = conn.createStatement(); String sql = "SELECT BUSEO_NAME FROM TBL_BUSEO"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) result.add(rs.getString("BUSEO_NAME")); rs.close(); stmt.close(); return result; } // 직위 리스트 조회 public ArrayList<String> searchJikwi() throws SQLException { ArrayList<String> result = new ArrayList<String>(); Statement stmt = conn.createStatement(); String sql = "SELECT JIKWI_NAME FROM TBL_JIKWI"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) result.add(rs.getString("JIKWI_NAME")); rs.close(); stmt.close(); return result; } // 직위에 따른 최소 기본급 검색 public int searchBasicPay(String jikwi) throws SQLException { int result = 0; Statement stmt = conn.createStatement(); String sql = String.format("SELECT MIN_BASICPAY FROM TBL_JIKWI WHERE JIKWI_NAME = '%s'", jikwi); ResultSet rs = stmt.executeQuery(sql); while (rs.next()) result = rs.getInt("MIN_BASICPAY"); rs.close(); stmt.close(); return result; } // 직원 데이터 수정 public int modify(MemberDTO dto) throws SQLException { int result = 0; Statement stmt = conn.createStatement(); String sql = String.format("UPDATE TBL_EMP" + " SET EMP_NAME = '%s', SSN ='%s', IBSADATE = TO_DATE('%s','YYYY-MM-DD')" + ", CITY_ID =(SELECT CITY_ID FROM TBL_CITY WHERE CITY_NAME = '%s')" + ", TEL = '010-3333-3333'" + ", BUSEO_ID =(SELECT BUSEO_ID FROM TBL_BUSEO WHERE BUSEO_NAME = '%s')" + ", JIKWI_ID =(SELECT JIKWI_ID FROM TBL_JIKWI WHERE JIKWI_NAME = '%s')" + ", BASICPAY = %d, SUDANG = %d" + " WHERE EMP_ID = %d" , dto.getEmpName(), dto.getSsn(), dto.getIbsaDate() , dto.getCityName(), dto.getTel(), dto.getBuseoName(), dto.getJikwiName() , dto.getBasicPay(), dto.getSudang(), dto.getEmpId() ); result = stmt.executeUpdate(sql); stmt.close(); return result; } // 직원 데이터 삭제 public int remove(int empId) throws SQLException { int result = 0; Statement stmt = conn.createStatement(); String sql = String.format("DELETE FROM TBL_EMP WHERE EMP_ID=%d", empId); result = stmt.executeUpdate(sql); stmt.close(); return result; } }
- MemberProcess
- 해당 클래스 생성 이유 : DAO 에서 기능 + 입출력 시 사용자에게 메시지 출력/ 데이터 입력 받아오는 역할
- 메소드 시작시 데이터베이스 연결되어야 사용가능
- StringBuilder 클래스의 append() 활용법
/*=============================================== MemberProcess.java - 콘솔 기반 서브 메뉴 입출력 전용 클래스 ================================================*/ package com.test; import java.util.ArrayList; import java.util.Scanner; public class MemberProcess { // 주요 속성 구성 private MemberDAO dao; // 생성자 정의(사용자 정의 생성자) public MemberProcess() { dao = new MemberDAO(); } // 직원 데이터 입력 메소드 정의 public void memberInsert() { Scanner sc = new Scanner(System.in); try { // 데이터베이스 연결 dao.connection(); // 지역 리스트 구성 ArrayList<String> citys = dao.searchCity(); StringBuilder cityStr = new StringBuilder(); for (String city : citys) cityStr.append(city + "/"); //-- "강원/경기/경남/.../충북/" // 부서 리스트 구성 ArrayList<String> buseos = dao.searchBuseo(); StringBuilder buseoStr = new StringBuilder(); for (String buseo : buseos) buseoStr.append(buseo + "/"); //-- "개발부/기획부/.../홍보부/" // 직위 리스트 구성 ArrayList<String> jikwis = dao.searchJikwi(); StringBuilder jikwiStr = new StringBuilder(); for (String jikwi : jikwis) jikwiStr.append(jikwi + "/"); //-- "사장/전무/.../사원/" // 사용자에게 보여지는 화면 처리 /* 직원 정보 입력 ------------------------------------------------------------------ 이름 : 김재혁 주민등록번호(yymmdd-nnnnnnn) : 980202-1234567 입사일(yyyy-mm-dd) : 2019-06-08 지역(강원/경기/경남/경북/부산/서울/인천/전남/전북/제주/충남/충북/) : 경기 전화번호 : 010-1212-3434 부서(개발부/기획부/영업부/인사부/자재부/총무부/홍보부/) : 개발부 직위(사장/전무/상무/이사/부장/차장/과장/대리/사원/) : 대리 기본급(최소 1800000 이상) : 4000000 수당 : 1000000 직원 정보 입력 완료~!!! ------------------------------------------------------------------ 직원 정보 입력 */ System.out.println(); System.out.println("직원 정보 입력 ------------------------------------------------------------------"); System.out.print("이름 : "); String empName = sc.next(); System.out.print("주민등록번호(yymmdd-nnnnnnn) : "); String ssn = sc.next(); System.out.print("입사일(yyyy-mm-dd) : "); String ibsaDate = sc.next(); System.out.printf("지역(%s) : ", cityStr.toString()); String cityName = sc.next(); System.out.print("전화번호 : "); String tel = sc.next(); System.out.printf("부서(%s) : ", buseoStr.toString()); String buseoName = sc.next(); System.out.printf("직위(%s) : ", jikwiStr.toString()); String jikwiName = sc.next(); System.out.printf("기본급(최소 %d 이상) : ", dao.searchBasicPay(jikwiName)); int basicPay = sc.nextInt(); System.out.print("수당 : "); int sudang = sc.nextInt(); System.out.println(); MemberDTO dto = new MemberDTO(); dto.setEmpName(empName); dto.setSsn(ssn); dto.setIbsaDate(ibsaDate); dto.setCityName(cityName); dto.setTel(tel); dto.setBuseoName(buseoName); dto.setJikwiName(jikwiName); dto.setBasicPay(basicPay); dto.setSudang(sudang); int result = dao.add(dto); if (result>0) System.out.println("직원 정보 입력 완료~!!!"); System.out.println("------------------------------------------------------------------ 직원 정보 입력 "); } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } }// end memberInsert() // 직원 전체 출력 메소드 정의 public void memberList() { Scanner sc = new Scanner(System.in); // 서브 메뉴 출력 안내 System.out.println(""); System.out.println("1. 사번 정렬"); // EMP_ID System.out.println("2. 이름 정렬"); // EMP_NAME System.out.println("3. 부서 정렬"); // BUSEO_NAME System.out.println("4. 직위 정렬"); // JIKWI_NAME System.out.println("5. 급여 내림차순 정렬"); // PAY DESC System.out.print(">> 항목 선택(1~5, -1종료)"); String menuStr = sc.next(); try { int menu = Integer.parseInt(menuStr); if (menu==-1) return; // 메인 메뉴로 돌아감 String key = ""; switch (menu) { case 1: key = "EMP_ID"; break; case 2: key = "EMP_NAME"; break; case 3: key = "BUSEO_NAME"; break; case 4: key = "JIKWI_NAME"; break; case 5: key = "PAY DESC"; break; } // 데이터베이스 연결 dao.connection(); // 직원 리스트 출력 System.out.println(); System.out.printf("전체 인원 : %d 명\n", dao.memberCount()); System.out.println("사번 이름 주민번호 입사일 지역 전화번호 부서 직위 기본급 수당 급여"); ArrayList<MemberDTO> memList = dao.lists(key); for (MemberDTO dto : memList) { System.out.printf("%5d %4s %14s %10s %4s %12s %4s %3s %8d %7d %8d\n" , dto.getEmpId(), dto.getEmpName(), dto.getSsn() , dto.getIbsaDate(), dto.getCityName(), dto.getTel() , dto.getBuseoName(), dto.getJikwiName() , dto.getBasicPay(), dto.getSudang(), dto.getPay()); } } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } }// end memberList() // 직원 검색 출력 메소드 정의 public void memberSearch() { Scanner sc = new Scanner(System.in); // 서브 메뉴 출력 안내 System.out.println(""); System.out.println("1. 사번 검색"); // → key : EMP_ID / value : 1002 System.out.println("2. 이름 검색"); // → key : EMP_NAME / value : '유서영' System.out.println("3. 부서 검색"); // → key : BUSEO_NAME / value : '개발부' System.out.println("4. 직위 검색"); // → key : JIKWI_NAME / value : '대리' System.out.print(">> 항목 선택(1~4, -1종료) : "); String menuStr = sc.next(); try { int menu = Integer.parseInt(menuStr); if (menu==-1) return; // 메인 메뉴로 돌아감 String key = ""; String value = ""; switch (menu) { case 1: key = "EMP_ID"; System.out.println(); System.out.print(">> 검색할 사원번호 입력 : "); value = sc.next(); break; case 2: key = "EMP_NAME"; System.out.println(); System.out.print(">> 검색할 이름 입력 : "); value = sc.next(); break; case 3: key = "BUSEO_NAME"; System.out.println(); System.out.print(">> 검색할 부서명 입력 : "); value = sc.next(); break; case 4: key = "JIKWI_NAME"; System.out.println(); System.out.print(">> 검색할 직위명 입력 : "); value = sc.next(); break; } // 데이터베이스 연결 dao.connection(); // 검색 결과 출력 System.out.println(); System.out.printf("검색 인원 : %d 명\n", dao.memberCount(key, value)); System.out.println("사번 이름 주민번호 입사일 지역 전화번호 부서 직위 기본급 수당 급여"); ArrayList<MemberDTO> memList = dao.searchList(key, value); for (MemberDTO dto : memList) { System.out.printf("%5d %4s %14s %10s %4s %12s %4s %3s %8d %7d %8d\n" , dto.getEmpId(), dto.getEmpName(), dto.getSsn() , dto.getIbsaDate(), dto.getCityName(), dto.getTel() , dto.getBuseoName(), dto.getJikwiName() , dto.getBasicPay(), dto.getSudang(), dto.getPay()); } } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } }// end memberSearch() // 직원 정보 수정 메소드 정의 public void memberUpdate() { Scanner sc = new Scanner(System.in); try { // 수정할 대상 입력받기 System.out.println(); System.out.print("수정할 직원의 사원번호 입력 : "); String value = sc.next(); // 데이터베이스 연결 dao.connection(); ArrayList<MemberDTO> memList = dao.searchList("EMP_ID", value); if (memList.size() > 0) { // 수정 대상을 찾은 경우... // 지역 리스트 구성 ArrayList<String> citys = dao.searchCity(); StringBuilder cityStr = new StringBuilder(); for (String city : citys) cityStr.append(city + "/"); // 부서 리스트 구성 ArrayList<String> buseos = dao.searchBuseo(); StringBuilder buseoStr = new StringBuilder(); for (String buseo : buseos) buseoStr.append(buseo + "/"); // 직위 리스트 구성 ArrayList<String> jikwis = dao.searchJikwi(); StringBuilder jikwiStr = new StringBuilder(); for (String jikwi : jikwis) jikwiStr.append(jikwi + "/"); // 사용자에게 보여지는 화면 처리 /* 직원 정보 수정 ------------------------------------------------------------------ 기존 이름 : 김재혁 수정 이름 : 이재혁 | - (안바꾸겠다는 의미) 기존 주민등록번호(yymmdd-nnnnnnn) : 980202-1234567 수정 주민등록번호(yymmdd-nnnnnnn) : 980202-2234567 | - 기존 입사일(yyyy-mm-dd) : 2019-06-08 수정 입사일(yyyy-mm-dd) : 2019-07-08 | - 기존 지역 : 경기 수정 지역(강원/경기/경남/경북/부산/서울/인천/전남/전북/제주/충남/충북/) : 서울 | - 기존 전화번호 : 010-1212-3434 수정 전화번호 : 010-1212-3456 | - 기존 부서 : 개발부 수정 부서(개발부/기획부/영업부/인사부/자재부/총무부/홍보부/) : 기획부 | - 기존 직위 : 대리 수정 직위(사장/전무/상무/이사/부장/차장/과장/대리/사원/) : 과장 | - 기존 기본급 : 4000000 수정 기본급(최소 2260000 이상) : 4000000 | - 기존 수당 : 1000000 수정 수당 : 1000000 | - 직원 정보 수정 완료~!!! ------------------------------------------------------------------ 직원 정보 수정 */ MemberDTO mMember = memList.get(0); int mEmpId = mMember.getEmpId(); String mEmpName = mMember.getEmpName(); String mSsn = mMember.getSsn(); String mIbsaDate = mMember.getIbsaDate(); String mCityName = mMember.getCityName(); String mTel = mMember.getTel(); String mBuseoName = mMember.getBuseoName(); String mJikwiName = mMember.getJikwiName(); int mBasicPay = mMember.getBasicPay(); int mSudang = mMember.getSudang(); System.out.println(); System.out.println("직원 정보 수정 ------------------------------------------------------------------"); System.out.printf("기존 이름 : %s\n", mEmpName); System.out.print("수정 이름 : "); String empName = sc.next(); if (empName.equals("-")) empName = mEmpName; System.out.printf("기존 주민등록번호 : %s\n", mSsn); System.out.print("수정 주민등록번호(yymmdd-nnnnnnn) : "); String ssn = sc.next(); if (ssn.equals("-")) ssn = mSsn; System.out.printf("기존 입사일 : %s\n", mIbsaDate); System.out.print("수정 입사일(yyyy-mm-dd) : "); String ibsaDate = sc.next(); if (ibsaDate.equals("-")) ibsaDate = mIbsaDate; System.out.printf("기존 지역 : %s\n", mCityName); System.out.printf("수정 지역(%s) : ", cityStr.toString()); String cityName = sc.next(); if (cityName.equals("-")) cityName = mCityName; System.out.printf("기존 전화번호 : %s\n", mTel); System.out.print("수정 전화번호 : "); String tel = sc.next(); if (tel.equals("-")) tel = mTel; System.out.printf("기존 부서 : %s\n", mBuseoName); System.out.printf("수정 부서(%s) : ", buseoStr.toString()); String buseoName = sc.next(); if (buseoName.equals("-")) buseoName = mBuseoName; System.out.printf("기존 직위 : %s\n", mJikwiName); System.out.printf("수정 직위(%s) : ", jikwiStr.toString()); String jikwiName = sc.next(); if (jikwiName.equals("-")) jikwiName = mJikwiName; System.out.printf("기존 기본급 : %d\n", mBasicPay); System.out.printf("수정 기본급(최소 %d 이상) : ",dao.searchBasicPay(jikwiName)); String basicPayStr = sc.next(); int basicPay = 0; if (basicPayStr.equals("-")) basicPay = mBasicPay; else basicPay = Integer.parseInt(basicPayStr); System.out.printf("기존 수당 : %d\n", mSudang); System.out.print("수정 수당 : "); String sudangStr = sc.next(); int sudang = 0; if (sudangStr.equals("-")) sudang = mSudang; else sudang = Integer.parseInt(sudangStr); System.out.println(); // 새로 입력받은(수정한) 내용을 통해 DTO 구성 MemberDTO member = new MemberDTO(); member.setEmpId(mEmpId); // check!!! member.setEmpName(empName); member.setSsn(ssn); member.setIbsaDate(ibsaDate); member.setCityName(cityName); member.setTel(tel); member.setBuseoName(buseoName); member.setJikwiName(jikwiName); member.setBasicPay(basicPay); member.setSudang(sudang); int result = dao.modify(member); if (result > 0) System.out.println("직원 정보 수정 완료~!!!"); System.out.println("------------------------------------------------------------------ 직원 정보 수정 "); /* 내 풀이 =========================================================================================== MemberDTO dto = memList.get(0); System.out.println(); System.out.println("직원 정보 수정 ------------------------------------------------------------------"); System.out.printf("기존 이름 : %s\n", dto.getEmpName()); System.out.print("수정 이름 : "); String name = sc.next(); if (!name.equals("-")) dto.setEmpName(name); System.out.printf("기존 주민등록번호(yymmdd-nnnnnnn) : %s\n", dto.getSsn()); System.out.print("수정 주민등록번호(yymmdd-nnnnnnn) : "); String ssn = sc.next(); if (!ssn.equals("-")) dto.setEmpName(ssn); System.out.printf("기존 입사일(yyyy-mm-dd) : %s\n", dto.getIbsaDate()); System.out.print("수정 입사일(yyyy-mm-dd) : "); String ibsaDate = sc.next(); if (!ibsaDate.equals("-")) dto.setIbsaDate(ibsaDate); System.out.printf("기존 지역 : %s\n", dto.getCityName()); System.out.printf("수정 지역(%s) : ", cityStr.toString()); String cityName = sc.next(); if (!cityName.equals("-")) dto.setCityName(cityName); System.out.printf("기존 전화번호 : %s\n", dto.getTel()); System.out.print("수정 전화번호 : "); String tel = sc.next(); if (!tel.equals("-")) dto.setTel(tel); System.out.printf("기존 부서 : %s\n", dto.getBuseoName()); System.out.printf("수정 부서(%s) : ", buseoStr.toString()); String buseoName = sc.next(); if (!buseoName.equals("-")) dto.setBuseoName(buseoName); System.out.printf("기존 직위 : %s\n", dto.getJikwiName()); System.out.printf("수정 직위(%s) : ", jikwiStr.toString()); String jikwiName = sc.next(); if (!jikwiName.equals("-")) dto.setJikwiName(jikwiName); System.out.printf("기존 기본급 : %s\n", dto.getBasicPay()); System.out.printf("수정 기본급(최소 %d 이상) : ",dao.searchBasicPay(dto.getJikwiName())); String basicPay = sc.next(); if (!basicPay.equals("-")) dto.setBasicPay(Integer.parseInt(basicPay)); System.out.printf("기존 수당 : %s\n", dto.getSudang()); System.out.print("수정 수당 : "); String sudang = sc.next(); if (!sudang.equals("-")) dto.setBasicPay(Integer.parseInt(sudang)); System.out.println(); int result = dao.modify(dto); if (result > 0) { System.out.println("직원 정보 수정 완료~!!!"); System.out.println("------------------------------------------------------------------ 직원 정보 수정 "); } ===========================================================================================================*/ } else { // 수정 대상을 찾지 못한 경우... System.out.println(">> 수정 대상을 검색하지 못했습니다."); } } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } }// end memberUpdate() // 직원 정보 삭제 메소드 정의 public void memberDelete() { Scanner sc = new Scanner(System.in); try { System.out.print("삭제할 직원의 사원번호 입력 : "); String value = sc.next(); // 사용자가 입력한 직원의 사원번호에 대한 유효성 검사 코드 삽입 가능 // 직원 정보 확인 후 삭제여부 결정 dao.connection(); ArrayList<MemberDTO> members = dao.searchList("EMP_ID", value); if (members.size()>0) { // 삭제 대상을 찾은 경우 System.out.println(); System.out.println("사번 이름 주민번호 입사일 지역 전화번호 부서 직위 기본급 수당 급여"); for (MemberDTO dto : members) { System.out.printf("%5d %4s %14s %10s %4s %12s %4s %3s %8d %7d %8d\n" , dto.getEmpId(), dto.getEmpName(), dto.getSsn() , dto.getIbsaDate(), dto.getCityName(), dto.getTel() , dto.getBuseoName(), dto.getJikwiName() , dto.getBasicPay(), dto.getSudang(), dto.getPay()); } System.out.println("\n정말 삭제하시겠습니까?(Y/N) : "); String response = sc.next(); if (response.equals("Y")||response.equals("y")) { int result = dao.remove(Integer.parseInt(value)); if (result > 0) System.out.println("직원 데이터가 정상적으로 삭제되었습니다."); } } else { // 삭제 대상을 찾지 못한 경우 System.out.println("삭제 대상을 찾지 못하였습니다."); } } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } }// end memberDelete() } // end class MemberProcess
- MemberMain
- Main() 에 Process 호출하여 처리하기 → 구문 먼저 작성 전에 메소드 들이 잘 작동하는지 먼저 확인
/*===================== MemberMain.java =======================*/ /* ○ 직원 관리 프로그램을 구현한다. - 데이터베이스 연동 프로그램으로 작성한다. - MemberDTO, MemberDAO 를 활용한다. - 메뉴 구성 및 기능을 구현한다. → MemberProcess 실행 예) ======[ 직원 관리 ]====== ========================= 1. 직원 정보 입력 2. 직원 전체 출력 - 사번 정렬 - 이름 정렬 - 부서 정렬 - 직위 정렬 - 급여 내림차순 정렬 3. 직원 검색 출력 - 사번 검색 - 이름 검색 - 부서 검색 - 직위 검색 4. 직원 정보 수정 5. 직원 정보 삭제 ========================= >> 메뉴 선택(1~5, -1 종료) : 1 직원 정보 입력 ------------------------------------------------------------------ 이름 : 김재혁 주민등록번호(yymmdd-nnnnnnn) : 980202-1234567 입사일(yyyy-mm-dd) : 2019-06-08 지역(강원/경기/경남/경북/부산/서울/인천/전남/전북/제주/충남/충북/) : 경기 -- 지역도 city 테이블에 있는 것 만 출력 전화번호 : 010-1212-3434 부서(개발부/기획부/영업부/인사부/자재부/총무부/홍보부/) : 개발부 -- 부서도 buseo 테이블에 있는 것 만 출력 직위(사장/전무/상무/이사/부장/차장/과장/대리/사원/) : 대리 기본급(최소 1800000 이상) : 4000000 -- 직위에 따른 최소 급여로 출력 수당 : 1000000 직원 정보 입력 완료~!!! ------------------------------------------------------------------ 직원 정보 입력 ======[ 직원 관리 ]====== ========================= 1. 직원 정보 입력 2. 직원 전체 출력 - 사번 정렬 - 이름 정렬 - 부서 정렬 - 직위 정렬 - 급여 내림차순 정렬 3. 직원 검색 출력 - 사번 검색 - 이름 검색 - 부서 검색 - 직위 검색 4. 직원 정보 수정 5. 직원 정보 삭제 ========================= >> 메뉴 선택(1~5, -1 종료) : 2 1. 사번 정렬 2. 이름 정렬 3. 부서 정렬 4. 직위 정렬 5. 급여 내림차순 정렬 >> 선택(1~5, -1 종료) : -1 ======[ 직원 관리 ]====== ========================= 1. 직원 정보 입력 2. 직원 전체 출력 - 사번 정렬 - 이름 정렬 - 부서 정렬 - 직위 정렬 - 급여 내림차순 정렬 3. 직원 검색 출력 - 사번 검색 - 이름 검색 - 부서 검색 - 직위 검색 4. 직원 정보 수정 5. 직원 정보 삭제 ========================= >> 메뉴 선택(1~5, -1 종료) : 2 1. 사번 정렬 2. 이름 정렬 3. 부서 정렬 4. 직위 정렬 5. 급여 내림차순 정렬 >> 선택(1~5, -1 종료) : 1 전체 인원 : xx 명 사번 이름 주민번호 입사일 지역 전화번호 부서 직위 기본급 수당 급여 -- id 가 아닌 실제 값이 출력되게 구성 1001 -- 급여 = 기본급 + 수당 1002 1003 : ... 1060 ======[ 직원 관리 ]====== ========================= 1. 직원 정보 입력 2. 직원 전체 출력 - 사번 정렬 - 이름 정렬 - 부서 정렬 - 직위 정렬 - 급여 내림차순 정렬 3. 직원 검색 출력 - 사번 검색 - 이름 검색 - 부서 검색 - 직위 검색 4. 직원 정보 수정 5. 직원 정보 삭제 ========================= >> 메뉴 선택(1~5, -1 종료) : */ package com.test; import java.util.Scanner; public class MemberMain { public static void main(String[] args) { Scanner sc = new Scanner(System.in); MemberProcess prc = new MemberProcess(); // 직원 데이터 입력 메소드 호출 //prc.memberInsert(); // 직원 데이터 전체 출력 메소드 호출 //prc.memberList(); // 직원 검색 메소드 호출 //prc.memberSearch(); // 직원 데이터 수정 메소드 호출 //prc.memberUpdate(); // 직원 데이터 삭제 메소드 호출 // prc.memberDelete(); do { System.out.println(); 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("4. 직원 정보 수정 "); System.out.println("5. 직원 정보 삭제 "); System.out.println("========================"); System.out.print(">> 메뉴 선택(1~5, -1 종료) : "); String menuStr = sc.next(); try { int menu= Integer.parseInt(menuStr); if (menu == -1) break; switch (menu) { case 1: // 직원 데이터 입력 메소드 호출 prc.memberInsert(); break; case 2: // 직원 전체 출력 메소드 호출 prc.memberList(); break; case 3: // 직원 검색 출력 메소드 호출 prc.memberSearch(); break; case 4: // 직원 데이터 수정 메소드 호출 prc.memberUpdate(); break; case 5: // 직원 데이터 삭제 메소드 호출 prc.memberDelete(); break; } } catch (Exception e) { System.out.println(e.toString()); } } while (true); System.out.println(); System.out.println(">> 프로그램이 종료되었습니다."); } }
728x90'SsY > Class' 카테고리의 다른 글
008. CallableStatement (0) 2023.05.02 007. PreparedStatement / 성적 처리 프로그램 구현 (0) 2023.05.02 005. DB 연동 직원 관리 프로그램 구현 (DTO, DAO, PROCESS, MAIN) (0) 2023.04.27 004. DAO/DTO/VO 개념, 성적 처리 → 데이터베이스 연동(데이터베이스 연결 및 액션 처리) (0) 2023.04.25 003. Singleton(싱글톤) 패턴으로 DB연결 + DAO/DTO 클래스로 문제 해결 (0) 2023.04.24 - DBConn