-
JDBC (Java DataBase Connectivity) - 수정프로그래밍 언어/JDBC 2020. 11. 18. 16:19728x90반응형
본좌는 이제 사원을 수정 해보려고 한다.
switch(sel) { case 1: selectAll(); // 1_1. 같은 클래스에 있는 selectAll()을 호출 break; case 2: selectOne(); // 2_1. 같은 클래스에 있는 selectOne()을 호출 break; case 3: insertEmp(); break; case 4: updateEmp(); break; case 5: deleteEmp(); break; case 6: selectOne2(); break; case 0: System.out.println("프로그램 종료."); break; default : System.out.println("잘못 입력하셨습니다."); }
같은 클래스 내에서 updateEmp();메소드를 만들어 호출한다.
4 - 1) updateEmp() 메소드 생성
// 4. 사번으로 사원 정보 수정 private void updateEmp() { // 1단계: 사번을 입력 받아 해당 사번을 가진 사원이 있는지 확인 System.out.println("[사원 정보 수정]"); System.out.print("[사원번호를 입력해 주세요]"); int empNo = sc.nextInt(); sc.nextLine(); // selectOne(empNo) 재활용 // Emp emp = empService.selectOne(empNo); // existsEmp(empNo) 메소드를 새로 작성 int check = empService.existsEmp(empNo); // 2단계: 1단계 결과가 있다고 판별된 경우 // 수정할 정보를 입력받은 후 DB 내용을 수정 //if (emp != null) { if(check > 0) { // 수정할 정보 입력받기 System.out.print("직책: "); String job = sc.nextLine(); System.out.print("급여: "); int sal = sc.nextInt(); System.out.print("커미션: "); int comm = sc.nextInt(); sc.nextLine(); // 입력받은 값을 한번에 전달하기 위한 Emp 객체 생성 Emp temp = new Emp(empNo, job, sal, comm); // 생성한 Emp 객체를 DB에 전달하고 결과를 반환받기 // DML수행 결과가 행의 개수(int형)로 받환 될것을 예상해서 // 미리 int result 로 수정 결과를 받도록 작성 int result = empService.updateEmp(temp); // DB 수정 결과에 따른 결과 출력 if (result > 0) { System.out.println("수정성공!!"); }else { System.out.println("수정 실패...."); } }else { System.out.println("해당 사번을 가진 사원이 없습니다."); } }
사원 정보를 수정하기 위해서는 사원 번호를 입력받고 수정할 정보를 입력 한 후에 그값을 Emp객체에 저장 한 후
empService.updateEmp()에게 넘겨준다.
하지만 사원 정보를 수정하기위해선 사원이 있는지 확인을 하기위해 사원번호를 입력해서 있는지 확인한다.
empService.existsEmp(empNo)
empService.existsEmp()에 사원 번호를 전달하여 사원의 존재를 확인한다.
4 - 2) existsEmp() 메소드 설정
public int existsEmp(int empNo) { // 별도의 가공 처리 없이 EmpDAO.existsEmp(empNo)를 호출하여 // 결과를 바로 View에 반환 return empDAO.existsEmp(empNo); }
별도의 처리가 필요 없어 전달받은 값을 empDAO.existsEmp()에 다시 전달한다.
4 - 3) empDAO.existsEmp() 메소드 설정
// 사번이 일치하는 사원 유무 판단용 DAO public int existsEmp(int empNo) { // JDBC 관련 변수 선언 및 결과 저장 변수 선언 Connection conn = null; Statement stmt = null; ResultSet rset = null; int result = 0; try { // JDBC드라이버 로드 및 커넥션 얻어오기 Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger"); // SQL작성 및 Statement 객체 생성 String query = "SELECT COUNT(*) FROM EMP WHERE EMPNO ="+ empNo; stmt = conn.createStatement(); // SQL 수행 및 결과 반환 rset = stmt.executeQuery(query); // 조회 결과가 있을 경우 해당 결과를 result에 저장 if (rset.next()) { result = rset.getInt(1); // 조회 결과 컬럼 인덱스 } } catch (Exception e) { e.printStackTrace(); }finally { // 사용한 JDBC 객체 반환 try { if (rset != null) { rset.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (Exception e) { } } return result; }
SQL문으로 사원번호가 일치하는 값 1개를 전달받는다.
이제 전달받은값을 다시 int형으로 돌려보내 사원 조회를 알려줘야한다.
empService.existsEmp()에서 전달받은 사원 정보를 수정하는값은 1개이기때문에 int형 타입으로 결과값을
result로 받아와 if문으로 설정한다.
if (result > 0) { System.out.println("수정 성공!!"); }else { System.out.println("수정 실패...."); }
DB 수정 결과에 따라 받아온 값이 0보다 큰 경우 수정 성공을 나타내고 그 외값일 경우는 실패로 나타낸다.
이제 empService.updateEmp()로 가서 설정하자
4 - 4) empService.updateEmp() 메소드 설정
// 사원 정보 수정용 Service public int updateEmp(Emp emp) { // View에서 전달받은 emp를 DAO로 전달하고 // 반환받은 결과를 다시 View로 전달 return empDAO.updateEmp(emp); }
전달받은 데이터를 처리할 필요가 없어 바로 empDAO.updateEmp();에 전달한다.
4 -5) empDAO.updateEmp() 메소드 설정
public int updateEmp(Emp emp) { // JDBC 드라이버 등록 및 DB 연결 관련 변수 선언 Connection conn = null; PreparedStatement pstmt = null; int result = 0; // 결과 저장용 변수 try { Class.forName("oracle.jdbc.driver.OracleDriver"); conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger"); conn.setAutoCommit(false); // DMl 자동 커밋 방지 String query = "UPDATE EMP SET JOB= ?, SAL=?, COMM=? WHERE EMPNO = ?"; pstmt = conn.prepareStatement(query); pstmt.setString(1, emp.getJob()); pstmt.setInt(2, emp.getSal()); pstmt.setInt(3, emp.getComm()); pstmt.setInt(4, emp.getEmpNo()); result = pstmt.executeUpdate(); if (result > 0) { conn.commit(); }else { conn.rollback(); } } catch (Exception e) { // TODO: handle exception }finally { try { if (pstmt != null) { pstmt.close(); } if (conn != null) { conn.close(); } } catch (Exception e2) { // TODO: handle exception } } return result; }
여기또한 PreparedStatment를 사용하여 ? 위치홀더를 사용해 SQL문을 작성한다.
String query = "UPDATE EMP SET JOB= ?, SAL=?, COMM=? WHERE EMPNO = ?"; pstmt = conn.prepareStatement(query); pstmt.setString(1, emp.getJob()); pstmt.setInt(2, emp.getSal()); pstmt.setInt(3, emp.getComm()); pstmt.setInt(4, emp.getEmpNo());
UPDATE문에 있는 위치홀더를 차례대로 데이터를 대입시켜 사원의 정보를 수정해준다.
result = pstmt.executeUpdate();
수정된 사원의 결과값을 int형으로 전달받아 수정이 성공되면 1을 반환하여 result에 넣어준다.
if (result > 0) { conn.commit(); }else { conn.rollback(); }
result에 전달받은 값이 1일 경우 성공이므로 commit을 하여 DB에 저장한다.
실패할 경우에는 rollback을 하여 취소 시킨다.
이제 이 result 값을 View로 전달하여 수정성공을 알리면된다.
결과는 아래와 같다.
이제 수정한 사원을 확인해보자
본 좌는 수정 성공이다.
728x90반응형'프로그래밍 언어 > JDBC' 카테고리의 다른 글
JDBC (Java DataBase Connectivity) - 추가 (0) 2020.11.18 JDBC (Java DataBase Connectivity) - 검색 (0) 2020.11.17 JDBC (Java DataBase Connectivity) - 조회 Part 2 (0) 2020.11.13 JDBC (Java DataBase Connectivity) - 조회 Part 1 (0) 2020.11.13