20일차

고규빈·2022년 1월 13일
0

자바 DB 연동 프로그램 만들어보기!

MainRun

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

}

EmpView

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

}

EmpVO

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

}

EmpDao

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

}
profile
안녕하세요

0개의 댓글