package kr.co.mskim.run;
import kr.co.mskim.dao.EmpDao;
import kr.co.mskim.data.EmpVO;
import kr.co.mskim.view.EmpView;
public class MainRun {
public static void main(String[] args) {
// 사용자에게서부터 값을 받아 DB에 연결하여 값을 입력하기
// View라고 하는 객체를 통해 메뉴별로 관리할 수 있게 구성
EmpView ev = new EmpView();
EmpDao ed = new EmpDao();
while(true) {
// 메인 메뉴 출력
ev.mainMenu();
// 메뉴 번호 입력 선택하기
String menu_code = ev.usr_input_ad();
// 1번 메뉴 : 사원 추가 기능 구현
if(menu_code.equals("1")) {
// 추가할 사원 정보 입력
EmpVO evo = ev.usrEmpInput();
// 추가할 사원 정보를 Database에 연결해서 전달할 수 있도록 구성하기
//EmpDao ed = new EmpDao(); // Dao = Data Access Object -> DB연결을 통한 데이터 처리 역할 객체
int[] result_cnt = ed.insertEmp(evo);
ev.resultView(result_cnt);
} else if(menu_code.equals("2")) {
//사원 수정하기
EmpVO evo = ev.usrEmpInput(); // 새롭게 갱신할 사원 정보(수정할 사원 정보)
//수정되기 전 사원 정보를 저장하기
EmpVO evo_old = ed.getUserInfo(evo.getEmpno());
// evo_old 값에 있는 것을 MariaDB에 Update하기
int result_cnt_maria = ed.updateEmpMaria(evo_old); //결과값이 1이면 -> 마리아 DB에 기존 자료 업데이트 완료!
// 결과값이 0이면 -> 업데이트 실패했다. 수정이 안된다!
// Oracle에 업데이트 하는 단계
int result_cnt = 0;
if(result_cnt_maria == 1) {
//결과값이 1이면 -> 마리아 DB에 기존 자료 업데이트 완료!
result_cnt = ed.updateEmp(evo);
}
ev.resultView(result_cnt);
} else if(menu_code.equals("3")) {
//사원 삭제하기
String empno = ev.usrEmpnoInput();
int result_cnt = ed.deleteEmp(empno);
ev.resultView(result_cnt);
} else if(menu_code.equals("4")) {
// 사원 전체 조회하기
ev.empAllView(ed.getAllEmp());
//ed.getAllEmp();
} else if(menu_code.equals("99")) {
// Oracle DB -> Maria DB 강제 저장 시키기
ev.resultSyncView(ed.syncDB());
}
}
}
}
package kr.co.mskim.view;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.List;
import java.util.Scanner;
import kr.co.mskim.data.EmpVO;
public class EmpView {
// EmpView로 사용자 입력 및 메뉴 출력할 수 있도록 구성하기
// 1. 메인 메뉴 출력하기
public void mainMenu() {
System.out.println("EMP 관리 시스템입니다. 다음 메뉴를 선택하세요.");
System.out.println("-------------------------------------");
System.out.println("1. 사원 추가, 2. 사원 수정, 3. 사원 삭제, 4. 사원 조회, 5. 종료, 99. 자료백업");
}
// 사용자 입력 메소드 만들기
public String usr_input() {
Scanner sc = new Scanner(System.in);
return sc.nextLine();
}
public EmpVO usrEmpInput() {
// 추가할 사원 정보 입력하기
// 입력해야 할 값들 : 1. 사원번호, 2. 사원이름, 3. 사수번호, 4.직무, 5. 입사일, 6. 급여, 7. 성과급, 8. 부서번호
EmpVO ev = new EmpVO();
System.out.println("사원번호를 입력하세요. ");
ev.setEmpno(Integer.parseInt(usr_input_ad()));
System.out.println("사원이름을 입력하세요. ");
ev.setEname(usr_input_ad());
System.out.println("사수번호를 입력하세요. ");
ev.setMgr(Integer.parseInt(usr_input_ad()));
System.out.println("직무를 입력하세요. ");
ev.setJob(usr_input_ad());
System.out.println("입사일을 입력하세요.[ex. 2021-01-01]");
ev.setHiredate(usr_input_ad());
System.out.println("급여를 입력하세요. ");
ev.setSal(Double.parseDouble(usr_input_ad()));
System.out.println("성과급을 입력하세요. ");
ev.setComm(Double.parseDouble(usr_input_ad()));
System.out.println("부서번호를 입력하세요. ");
ev.setDeptno(Integer.parseInt(usr_input_ad()));
// 세팅된(자바로 입력한 사원 입력값)을 리턴
return ev;
}
public void resultView(int result_cnt) {
// DML문을 통해서 나온 결과 갯수를 출력하는 기능 구현
System.out.println(result_cnt + "개의 데이터가 반영되었습니다.");
}
public void resultView(int[] result_cnt) {
// DML문을 통해서 나온 결과 갯수를 출력하는 기능 구현
System.out.println(result_cnt[0] + "개의 데이터가 Oracle DB에 반영되었습니다.");
System.out.println(result_cnt[1] + "개의 데이터가 Maria DB에 반영되었습니다.");
}
public String usrEmpnoInput() {
// 사원번호 입력받기 기능 메소드
return usr_input_ad();
}
public void empAllView(List<EmpVO> allEmp) {
// Database에서 부터 받아온 전체 사원의 정보를 출력할 수 있도록 구성한다.
// allEmp.get(0).getEmpno(); // - 0x0001(첫번째 db값을 세팅한 EmpVO)
System.out.println("총 " + allEmp.size() + " 명의 사원 정보를 검색하였습니다.");
for (int i = 0; i < allEmp.size(); i++) {
System.out.println(i+1 + "번째 사원 정보입니다.");
System.out.println("사원번호 : " + allEmp.get(i).getEmpno());
System.out.println("사원이름 : " + allEmp.get(i).getEname());
System.out.println("사수번호 : " + allEmp.get(i).getMgr());
System.out.println("직무 : " + allEmp.get(i).getJob());
System.out.println("입사일 : " + allEmp.get(i).getHiredate());
System.out.println("급여 : " + allEmp.get(i).getSal());
System.out.println("상여급 : " + allEmp.get(i).getComm());
System.out.println("부서번호 : " + allEmp.get(i).getDeptno());
System.out.println("===========================================");
}
}
public void resultSyncView(int syncDB) {
// Sync 된 DB 갯수 표시
System.out.println(syncDB + "개의 데이터가 백업 되었습니다.");
}
public String usr_input_ad() {
Reader rd = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(rd);
String usr_input = null;
try {
usr_input = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return usr_input;
}
}
package kr.co.mskim.data;
public class EmpVO {
// 입력해야 할 값들 : 1. 사원번호, 2. 사원이름, 3. 사수번호, 4.직무, 5. 입사일, 6. 급여, 7. 성과급, 8. 부서번호
private int empno;
private String ename;
private int mgr;
private String job;
private String hiredate;
private double sal;
private double comm;
private int deptno;
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getHiredate() {
return hiredate;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
public double getSal() {
return sal;
}
public void setSal(double sal) {
this.sal = sal;
}
public double getComm() {
return comm;
}
public void setComm(double comm) {
this.comm = comm;
}
public int getDeptno() {
return deptno;
}
public void setDeptno(int deptno) {
this.deptno = deptno;
}
}
package kr.co.mskim.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import kr.co.mskim.data.EmpVO;
public class EmpDao {
// Database 연결하기 위한 작업 시작
// 1. JDBC 사용을 위한 JDBC Driver 호출, Connection 생성해줌
private Connection jdbcInit() {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "scott", "tiger");
// Class.forName("org.mariadb.jdbc.Driver");
// conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/scott", "scott", "tiger");
System.out.println("Connection 생성 여부 확인 : " + conn);
// getConnection 매개변수에 들어가야할 내용
// Oracle 접속 주소, 계정명, 암호
} catch (ClassNotFoundException e) {
try {
conn.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
} catch (SQLException sqle) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sqle.printStackTrace();
}
return conn;
} // jdbcInit() 메소드 종료문
private Connection jdbc_mariadb_Init() {
Connection conn = null;
try {
Class.forName("org.mariadb.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mariadb://localhost:3306/scott", "scott", "tiger");
System.out.println("Connection mariadb 생성 여부 확인 : " + conn);
// getConnection 매개변수에 들어가야할 내용
// Oracle 접속 주소, 계정명, 암호
} catch (ClassNotFoundException e) {
try {
conn.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
} catch (SQLException sqle) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sqle.printStackTrace();
}
return conn;
} // jdbcInit() 메소드 종료문
// 2. Connection 통해 SQL문을 실행 할 수 있는 메소드 구현하기. EMP 정보 Insert하기
public int[] insertEmp(EmpVO ev) {
// SQL문을 실행시킬 수 있게 하기위해서 인터페이스를 제공 해줌
// Statement, PreparedStatement
PreparedStatement pstmt = null;
PreparedStatement pstmt_mysql = null;
Connection conn = jdbcInit();
Connection conn1 = jdbc_mariadb_Init();
String sql = "INSERT INTO emp(empno, ename, mgr, job, hiredate, sal, comm, deptno) VALUES(?,?,?,?,TO_DATE(?),?,?,?)";
String sql1 = "INSERT INTO emp(empno, ename, mgr, job, hiredate, sal, comm, deptno) VALUES(?,?,?,?,STR_TO_DATE(?,'%Y-%c-%d'),?,?,?)";
// pstmt.executeQuery(); // 결과값이 있는 SQL문 실행시 사용 -> Select문을 사용할 시에 사용
int result_cnt = 0;
int result_cnt2 = 0;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, ev.getEmpno());
pstmt.setString(2, ev.getEname());
pstmt.setInt(3, ev.getMgr());
pstmt.setString(4, ev.getJob());
// [ex. 2021-01-01]
pstmt.setString(5, ev.getHiredate());
pstmt.setDouble(6, ev.getSal());
pstmt.setDouble(7, ev.getComm());
pstmt.setInt(8, ev.getDeptno());
result_cnt = pstmt.executeUpdate();
// pstmt.clearParameters();
pstmt_mysql = conn1.prepareStatement(sql1);
pstmt_mysql.setInt(1, ev.getEmpno());
pstmt_mysql.setString(2, ev.getEname());
pstmt_mysql.setInt(3, ev.getMgr());
pstmt_mysql.setString(4, ev.getJob());
// [ex. 2021-01-01]
pstmt_mysql.setString(5, ev.getHiredate());
pstmt_mysql.setDouble(6, ev.getSal());
pstmt_mysql.setDouble(7, ev.getComm());
pstmt_mysql.setInt(8, ev.getDeptno());
result_cnt2 = pstmt_mysql.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 결과값이 select문을 통해서 가져올 db값이 없는 경우 -> DB에다가 DML문을
// 실행시킬 시에 사용한다!
finally {
try {
pstmt.close();
pstmt_mysql.close();
conn.close();
conn1.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // finally 종료지점
int[] result_ar = { result_cnt, result_cnt2 };
return result_ar;
}
public int updateEmp(EmpVO ev) {
PreparedStatement pstmt = null;
Connection conn = jdbcInit();
String sql = "UPDATE emp SET ename=?, mgr=?, job=?, hiredate=?, sal=?, comm=?, deptno=? WHERE empno=?";
// pstmt.executeQuery(); // 결과값이 있는 SQL문 실행시 사용 -> Select문을 사용할 시에 사용
int result_cnt = 0;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, ev.getEname());
pstmt.setInt(2, ev.getMgr());
pstmt.setString(3, ev.getJob());
// [ex. 2021-01-01]
pstmt.setString(4, ev.getHiredate());
pstmt.setDouble(5, ev.getSal());
pstmt.setDouble(6, ev.getComm());
pstmt.setInt(7, ev.getDeptno());
pstmt.setInt(8, ev.getEmpno());
result_cnt = pstmt.executeUpdate();
// pstmt.clearParameters();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 결과값이 select문을 통해서 가져올 db값이 없는 경우 -> DB에다가 DML문을
// 실행시킬 시에 사용한다!
finally {
try {
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // finally 종료지점
return result_cnt;
}
public int deleteEmp(String empno) {
// EmpView에서부터 입력받은 사원 번호를 통하여 데이터를 삭제할 수있도록 기능 수행
Connection con = jdbcInit();
PreparedStatement pstmt = null;
int result = 0;
try {
pstmt = con.prepareStatement("DELETE FROM emp WHERE empno = ?");
pstmt.setInt(1, Integer.parseInt(empno));
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
pstmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return result;
}
public List<EmpVO> getAllEmp() {
// 전체 사원 정보 출력 기능 구현
Connection conn = null;
conn = jdbcInit();
// 쿼리문을 세팅하고 수행될 수 있도록 PreparedStatement
PreparedStatement pstmt = null;
// Statement stmt = null;
ResultSet rs = null;
String sql = "SELECT empno, ename, job, mgr, TO_CHAR(hiredate,'YYYY-MM-DD'), sal, comm, deptno FROM emp";
List<EmpVO> list = new ArrayList<EmpVO>();
try {
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
EmpVO ev = new EmpVO();
// ev = Java에서 관리할 데이터 객체, rs = Database MS 가져올수 있는 데이터 세트(Set)
ev.setEmpno(rs.getInt(1));
ev.setEname(rs.getString(2));
ev.setJob(rs.getString("job"));
ev.setMgr(rs.getInt(4));
ev.setHiredate(rs.getString(5));
ev.setSal(rs.getDouble(6));
ev.setComm(rs.getDouble(7));
ev.setDeptno(rs.getInt(8));
list.add(ev);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
} // getAllEmp() 종료지점
public int syncDB() {
List<EmpVO> list = getAllEmp();
Connection ma_con = jdbc_mariadb_Init();
PreparedStatement ma_pstmt = null;
int[] result_batch_cnt = null;
int result_total_cnt = 0;
try {
ma_con.setAutoCommit(false);
ma_pstmt = ma_con.prepareStatement(
"INSERT INTO emp_backup(empno, ename, mgr, job, hiredate, sal, comm, deptno) VALUES(?,?,?,?,STR_TO_DATE(?,'%Y-%c-%d'),?,?,?)");
for (int i = 0; i < list.size(); i++) {
ma_pstmt.setInt(1, list.get(i).getEmpno());
ma_pstmt.setString(2, list.get(i).getEname());
ma_pstmt.setInt(3, list.get(i).getMgr());
ma_pstmt.setString(4, list.get(i).getJob());
ma_pstmt.setString(5, list.get(i).getHiredate());
ma_pstmt.setDouble(6, list.get(i).getSal());
ma_pstmt.setDouble(7, list.get(i).getComm());
ma_pstmt.setInt(8, list.get(i).getDeptno());
// SQL 작업 영역 저장
ma_pstmt.addBatch();
// ma_pstmt 저장 파라미터 초기화(setInt, setString 등)
ma_pstmt.clearParameters();
if (i % 10 == 0) {
// 10개 단위로 작업시 마다
// addBatch로 저장된 작업 실행
result_batch_cnt = ma_pstmt.executeBatch();
for (int j = 0; j < result_batch_cnt.length; j++) {
result_total_cnt += result_batch_cnt[j];
}
System.out.println("10 단위 배치 실행");
// 작업 후 Batch 초기화
ma_pstmt.clearBatch();
}
} // for문 종료
// 잔여 작업 쿼리문 실행
result_batch_cnt = ma_pstmt.executeBatch();
for (int j = 0; j < result_batch_cnt.length; j++) {
result_total_cnt += result_batch_cnt[j];
}
// 작업 후 Batch 초기화
ma_con.commit();
ma_con.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
ma_con.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
try {
ma_pstmt.close();
ma_con.close();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
return result_total_cnt;
}
public EmpVO getUserInfo(int empno) {
// 사원번호로 사원 개별 정보 DB에서 가져오기
Connection conn = null;
conn = jdbcInit();
// 쿼리문을 세팅하고 수행될 수 있도록 PreparedStatement
PreparedStatement pstmt = null;
// Statement stmt = null;
ResultSet rs = null;
String sql = "SELECT empno, ename, job, mgr, TO_CHAR(hiredate,'YYYY-MM-DD'), sal, comm, deptno FROM emp WHERE empno = ?";
EmpVO ev = new EmpVO();
try {
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, empno);
rs = pstmt.executeQuery();
while (rs.next()) {
ev = new EmpVO();
// ev = Java에서 관리할 데이터 객체, rs = Database MS 가져올수 있는 데이터 세트(Set)
ev.setEmpno(rs.getInt(1));
ev.setEname(rs.getString(2));
ev.setJob(rs.getString("job"));
ev.setMgr(rs.getInt(4));
ev.setHiredate(rs.getString(5));
ev.setSal(rs.getDouble(6));
ev.setComm(rs.getDouble(7));
ev.setDeptno(rs.getInt(8));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return ev;
}
public int updateEmpMaria(EmpVO ev) {
// MariaDB에 update 실행하기
PreparedStatement pstmt = null;
Connection conn = jdbc_mariadb_Init();
String sql = "UPDATE emp_backup SET ename=?, mgr=?, job=?, hiredate=STR_TO_DATE(?,'%Y-%c-%d'), sal=?, comm=?, deptno=? WHERE empno=?";
// pstmt.executeQuery(); // 결과값이 있는 SQL문 실행시 사용 -> Select문을 사용할 시에 사용
int result_cnt = 0;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, ev.getEname());
pstmt.setInt(2, ev.getMgr());
pstmt.setString(3, ev.getJob());
// [ex. 2021-01-01]
pstmt.setString(4, ev.getHiredate());
pstmt.setDouble(5, ev.getSal());
pstmt.setDouble(6, ev.getComm());
pstmt.setInt(7, ev.getDeptno());
pstmt.setInt(8, ev.getEmpno());
result_cnt = pstmt.executeUpdate();
// pstmt.clearParameters();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // 결과값이 select문을 통해서 가져올 db값이 없는 경우 -> DB에다가 DML문을
// 실행시킬 시에 사용한다!
finally {
try {
pstmt.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // finally 종료지점
return result_cnt;
}
}