ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JDBC (Java DataBase Connectivity) - 수정
    프로그래밍 언어/JDBC 2020. 11. 18. 16:19
    728x90
    반응형

    본좌는 이제 사원을 수정 해보려고 한다.

     

     

    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
    반응형
Designed by Tistory.