-
JDBC (Java DataBase Connectivity) - 추가프로그래밍 언어/JDBC 2020. 11. 18. 11:50728x90반응형
본좌는 오늘 사원을 추가해 보려고한다.
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);
이렇게 만든 emp를 empService.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
PreparedStatement란 Statement의 자식으로 좀 더 향상된 기능을 제공한다. 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반응형'프로그래밍 언어 > 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