ABOUT ME

-

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

    본좌는 오늘 사원을 추가해 보려고한다.

     

    3 - 1) insertEmp() 메소드 생성

    public void displayMain() {
    		int sel = 0;
    		
    		do {
    			try {
    				System.out.println();
    				System.out.println("====================================");
    				System.out.println("[Main Menu]");
    				System.out.println("1. 전체 사원 정보 조회");
    				System.out.println("2. 사번으로 사원 정보 조회");
    				System.out.println("3. 새로운 사원 정보 추가");
    				System.out.println("4. 사번으로 사원 정보 수정");
    				System.out.println("5. 사번으로 사원 정보 삭제");
    				System.out.println("6. 사번, 이름이 모두 일치하는 사원 정보 조회");
    				System.out.println("0. 프로그램 종료");
    				System.out.println("====================================");
    				
    				System.out.print("메뉴 선택 : ");
    				sel = sc.nextInt();
    				System.out.println();
    				
    				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("잘못 입력하셨습니다.");
    				}
    				
    				
    			} catch (InputMismatchException e) {
    				System.out.println("숫자만 입력해 주세요");
    				sel = -1;
    				sc.nextLine();
    			}
    			
    			
    		}while(sel != 0);
    	}

    사원을 추가하는 insertEmp(); 메소드를 생성하여 호출하자.

     

     

    3 - 2) insertEmp() 메소드 설정

    // 3. 새로운 사원 정보 삽입용 View
    	private void insertEmp() {
    		System.out.println("[사원 정보 추가]");
    		System.out.print("사번: ");
    		int empNo = sc.nextInt();
    		sc.nextLine();
    		
    		System.out.print("이름: ");
    		String eName = sc.nextLine();
    		
    		System.out.print("직책: ");
    		String job = sc.nextLine();
    		
    		System.out.print("직속 상사 사번: ");
    		int mgr = sc.nextInt();
    
    		// HIREDATE는 insert 구문에서 SYSDATE로 작성
    		
    		System.out.print("급여: ");
    		int sal = sc.nextInt();
    		
    		System.out.print("커미션: ");
    		int comm = sc.nextInt();
    		
    		System.out.print("부서 번호: ");
    		int deptNo = sc.nextInt();
    		sc.nextLine();
    		
    		// 3_1. 입력받은 사원 정보를 하나의 emp객체 저장할 수 있도록
    		// Emp 클래스에 생성자를 새로 작성한 후 객체 생성
    		Emp emp = new Emp(empNo, eName, job, mgr, sal, comm, deptNo);
    		
    		// 3_2. EmpService객체의 insertEmp(emp) 메소드를 호출하여 
    		// 데이터를 DB 삽입한 후 결과를 반환 받음.
    		int result = empService.insertEmp(emp);
    		
    		// 3_13. 삽입 결과에 따라 출력하기
    		if (result > 0) {
    			System.out.println("사원 정보 삽입 성공 !!");
    		} else {
    			System.out.println("사원 정보 삽입 실패...");
    			
    		}
    		
    		
    	}

    첫번째로  sc.nextLine();으로 사원을 추가하기 위한 정보를 입력 한 뒤 입력받은 변수들을 emp객체에 저장할 수 있도록

    Emp 클래스에 생성자를 만들어 대입시킨다.

     

    Emp emp = new Emp(empNo, eName, job, mgr, sal, comm, deptNo);
    int result = empService.insertEmp(emp);

    이렇게 만든 empempService.insertEmp(emp) 를 생성하여 매개변수로 전달 한뒤 result로 결과 값을 받아온다.

     

    // 3_13. 삽입 결과에 따라 출력하기
    		if (result > 0) {
    			System.out.println("사원 정보 삽입 성공 !!");
    		} else {
    			System.out.println("사원 정보 삽입 실패...");
    			
    		}

    그리고 결과값은 입력한 값이 1개 이기 때문에 int형으로 반환 받아 if문으로 조건을 걸어 결과값을 받으면 성공을

    나타내고 받지 못하면 실패로 나타나게한다.

    그럼 이제 empService.insertEmp(emp)메소드를 생성하여 설정해보자.

     

     

    3 - 3) empService.insertEmp() 메소드 설정

    	// 3. 새로운 사원 정보 삽입용 Service
    	public int insertEmp(Emp emp) {
    		// 3_3. 전달 받은 emp를 EmpDAO객체의 insertEmp(emp)를 전달하여 	
    		// 결과를 반환 받음.
    		int result = empDAO.insertEmp(emp);
    		
    		// 3_12. DB 수행 결과를 그대로 반환
    		return result; 
    		
    	}

    여기선 처리할 정보가 없어서 매개변수로 받은 값을 empDAO.insertEmp(emp);로 넘겨준 뒤 반환값을 받아서 return

    사용하여 EmpView로 보내준다.

    그럼이제 empDAO.insertEmp(emp)에서 설정해보자.

     

     

     

     

    3 - 4) empService.insertEmp() 메소드 설정

    // 3. 새로운 사원 정보 삽입용 DAO
    	public int insertEmp(Emp emp) {
    		
    		// 3_4. JDBC 드라이버 등록 및 DB 연결 관련 변수 선언
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		int result = 0;
    		/*
    			PreparedStatement
    			
    			- Statement의 자식으로 좀 더 향상된 기능을 제공한다.
    			- ? (위치 홀더)를 이용하여 SQL에 작성되는 
    				리터럴 값을 동적으로 작성한다.
    				
    			- 코드 안정성과 가독성이 증가함.
    			- 코드 길이가 늘어나는 단점이 있다.
    		*/
    		
    		try {
    			// 3_5. JDBC 드라이버 로드 및 커넥션 얻어오기
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");
    			
    			// 3_6. 자동 커밋 방지
    			// JDBC에서 DML 구문 수행 시 별도 조작이 없으면
    			// 한 행이 수행 되자마자 COMMIT이 수행된다.
    			conn.setAutoCommit(false);
    			// -> 한 행 수행 시 자동 COMMIT이 되지 않게함.
    			// 단, 추후 COMMIT, ROLLBACK 없이
    			// conn.close()가 수행되면
    			// 모든 내용이 COMMIT됨.
    			
    			// 3_7. SQL 작성 후 PreparedStatement 객체 생성
    			String query = "INSERT INTO EMP VALUES(?, ?, ?, ?, SYSDATE, ?, ?, ?)";
    			
    			pstmt = conn.prepareStatement(query);
    			
    			// 3_8. SQL구문의 ?(위치 홀더)에 알맞은 값 대입
    			pstmt.setInt(1,  emp.getEmpNo());
    			pstmt.setString(2,  emp.geteName());
    			pstmt.setString(3,  emp.getJob());
    			pstmt.setInt(4,  emp.getMgr());
    			pstmt.setInt(5,  emp.getSal());
    			pstmt.setInt(6,  emp.getComm());
    			pstmt.setInt(7,  emp.getDeptNo());
    		
    			// 3_9. SQL 구문 수행 후 결과를 전달받음.
    			// DML 구문 수행 시 executeUpdate() 호출
    			// DB에서 DML 구문 수행 시 DML 구문 수행이 성공한 행의 개수를 반환
    			result = pstmt.executeUpdate();
    			// executeUpdate() : DML 의 성공한 행의 개수를 반환
    			// excuteQuery(): SELECT의 조회 결과인 ResultSet을 반환
    
    			// 트랜잭션 처리(commit, rollback 처리)
    			if (result > 0) {
    				conn.commit();
    			}else {
    				conn.rollback();
    			}
    			
    		} catch (Exception e) {
    			
    		}finally {
    			try {
    				// 3_10. 사용한 JDBC 객체 반환
    				if(pstmt != null) {
    					pstmt.close();
    				} if (conn != null) {
    					conn.close();
    				}
    			} catch (Exception e) {
    				
    			}
    		}
    		
    		// 3_11. DML 수행 결과(result)를 반환
    		return result;
    		
    	}

     

     JDBC객체드라이버 로드와 커넥션을 얻어오는 작업를 우선적으로 해야한다.

    Class.forName("oracle.jdbc.driver.OracleDriver");
    conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott", "tiger");
    			

     

    추가해주는 INSERT문에는 JDBC에서는 DML 구문 수행 시 별도 조작이 없으면 한 행이 수행 되자마자 COMMIT이

    자동적으로 처리된다. 잘못된 값을 처리하지 않기위해서는 별도의 자동커밋 처리를 해제해줘야한다.

    conn.setAutoCommit(false);

     

    이것이 바로 자동커밋을 해제해 주는 코드이다. false를 입력하면 해제가 되고 true가 되면 자동으로 커밋이 처리된다.

     

    이제 SQL문을 작성 한 후 이것을 위치홀더? 를 써서 JDBC의 객체PreparedStatement객체를 사용한다.

    그럼 PreparedStatement객체를 알아보자.

     

     

    PreparedStatement

    PreparedStatementStatement의 자식으로 좀 더 향상된 기능을 제공한다. PreparedStatement은 ? (위치 홀더)를 이용하여 SQL에 작성되는 리터럴 값을 동적으로 작성한다. PreparedStatement의 장점은 코드 안정성과 가독성이

    증가하지만 코드 길이가 늘어나는 단점이 있다.

     

    String query = "INSERT INTO EMP VALUES(?, ?, ?, ?, SYSDATE, ?, ?, ?)";

    이렇게 INSERT문에 들어가는 값을 ? 위치홀더로 표시해 보기 편하게 해준다.

    그 다음 이 ?의 값을 대입하기 위해선 조금 다른 코드를 써야한다.

     

    pstmt.setInt(1,  emp.getEmpNo());
    pstmt.setString(2,  emp.geteName());
    pstmt.setString(3,  emp.getJob());
    pstmt.setInt(4,  emp.getMgr());
    pstmt.setInt(5,  emp.getSal());
    pstmt.setInt(6,  emp.getComm());
    pstmt.setInt(7,  emp.getDeptNo());

    이렇게 pstmt.setInt(1, emp.getEmoNo());를 써준다. 앞에 Int는 데이터 타입형을 설정해주고 1첫번째 ? 위치홀더를가리키고 그다음은 객체emp의 값을 꺼내어 알맞는 값을 설저해주면된다.

     

    result = pstmt.executeUpdate();

    PreparedStatement의 객체를 실행시켜 반환된 값을 result에 넣어준 뒤 return으로 반환해준다.

     

    실행 결과는 이러하다.

     

    이렇게 추가를 성공한 뒤 사번으로 조회해 보자.

     

    이렇게 성공이 된다!

    728x90
    반응형
Designed by Tistory.