2020년 11월 16일
업데이트:
JDBC
JDBC란?
자바에서 데이터베이스에 접근할 수 있게 해주는 Programming API
DriverManager
데이터 원본에 JDBC드라이버를 통하여 커넥션을 만드는 역할을 한다. Class.forName() 메소드를 통해 생성되며 직접 객체 생성이 불가능하고 getConnection() 메소드를 사용하여 객체를 생성 할 수 있다.
Connection
특정 데이터 원본과 연결된 커넥션을 나타내며 SQL문장을 실행시키기 전에 우선 Connection객체가 있어야 한다.
Statement
생성된 Statement객체로 질의문장을 String객체에 담아 인자로 전달하여 executeQuery() 메소드를 호출하여 SQL질의를 수행한다.
PreparedStatement
SQL문장이 미리 컴파일 되고 실행 시간동안 인수 값을 위한 공간을 확보한다는 점에서 Statement와 구분 가능하며, 각각의 인수에 대해 위치 홀더(?)를 사용하여 SQL문장을 정의할 수 있게 한다.
ResultSet
SELECT문을 사용한 질의 성공 시 Result Set 반환하며 SQL질의에 의해 생성된 테이블을 담고 있으며 커서(cursor)로 특정 행에 대한 참조 조작한다.
// EmpRun.java
package com.kh.scott.run;
import com.kh.scott.view.EmpView;
public class EmpRun {
public static void main(String[] args) {
new EmpView().displayMain();
}
}
// Emp.java
package com.kh.scott.model.vo;
import java.sql.Date;
public class Emp {
private int empNo; // 사번
private String eName; // 이름
private String job; // 직책
private int mgr; // 직속상사
private Date hireDate; // 입사일
private int sal; // 급여
private int comm; // 커미션
private int deptNo; // 부서번호
// 기본 생성자
public Emp() { }
// 사원정보를 수정하기 위해.. 생성자 하나 더 만든것
public Emp(int empNo, String job, int sal, int comm) {
super();
this.empNo = empNo;
this.job = job;
this.sal = sal;
this.comm = comm;
}
// 사원 정보 삽입을 위해 hireDate를 빼고 만든 생성자.
public Emp(int empNo, String eName, String job, int mgr, int sal, int comm, int deptNo) {
super();
this.empNo = empNo;
this.eName = eName;
this.job = job;
this.mgr = mgr;
this.sal = sal;
this.comm = comm;
this.deptNo = deptNo;
}
// 매개 변수 전부 다 있는 생성자
public Emp(int empNo, String eName, String job, int mgr, Date hireDate, int sal, int comm, int deptNo) {
this(empNo, eName, job, mgr, sal, comm, deptNo); //this 생성자.
this.hireDate = hireDate;
}
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 String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
public int getSal() {
return sal;
}
public void setSal(int sal) {
this.sal = sal;
}
public int getComm() {
return comm;
}
public void setComm(int comm) {
this.comm = comm;
}
public int getDeptNo() {
return deptNo;
}
public void setDeptNo(int deptNo) {
this.deptNo = deptNo;
}
@Override
public String toString() { //alt + shift + s s
return "Emp 사번:" + empNo + " 이름:" + eName + " 직책:" + job + " 관리자:" + mgr + " 입사일:" + hireDate
+ " 급여:" + sal + " 커미션:" + comm + " 부서코드:" + deptNo + "]";
}
}
// EmpView.java
package com.kh.scott.view;
import java.sql.SQLException;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import com.kh.scott.model.service.EmpService;
import com.kh.scott.model.vo.Emp;
public class EmpView {
private Scanner sc = new Scanner(System.in);
private EmpService empService = new EmpService();
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(); break;
case 2 : 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 );
}
}
2. 사번으로 사원 정보 조회
// EmpView.java
// 2. 사번을 입력받아 사원 한 명의 정보를 조회하는 View
private void selectOne() {
System.out.println("[사번으로 사원 정보 조회]");
System.out.print("사번 입력 :");
int empNo = sc.nextInt();
sc.nextLine();
Emp emp = empService.selectOne(empNo);
if(emp == null) {
System.out.println("조회 결과가 없습니다.");
}else {
System.out.println("사번 : " + emp.getEmpNo());
System.out.println("이름 : " + emp.geteName());
System.out.println("직책 : " + emp.getJob());
System.out.println("직속상사 : " + emp.getMgr());
System.out.println("입사일 : " + emp.getHireDate());
System.out.println("급여 : " + emp.getSal());
System.out.println("커미션 : " + emp.getComm());
System.out.println("부서번호 : " + emp.getDeptNo());
}
}
// EmpService.java
// 2. 사번으로 사원 정보 조회 Service
public Emp selectOne(int empNo) {
Emp emp = empDAO.selectOne(empNo);
return emp;
}
// EmpDAO.java
// 2. 사번으로 사원 정보 조회용 DAO
public Emp selectOne(int empNO) {
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
Emp emp = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott","tiger");
String query = "SELECT * FROM EMP WHERE EMPNO =" + empNO;
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
if(rset.next()) {
int empNo = rset.getInt("EMPNO");
String eName = rset.getString("ENAME");
String job = rset.getString("JOB");
int mgr = rset.getInt("MGR");
Date hireDate = rset.getDate("HIREDATE");
int sal = rset.getInt("SAL");
int comm = rset.getInt("COMM");
int deptNo = rset.getInt("DEPTNO");
emp = (new Emp(empNo, eName, job, mgr, hireDate, sal, comm, deptNo));
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
if(rset != null) rset.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} catch(SQLException e) {
e.printStackTrace();
}
}
return emp;
}
3. 새로운 사원 정보 추가
// EmpView.java
// 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();
sc.nextLine();
// 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();
Emp emp = new Emp(empNo, eName.toUpperCase(), job.toUpperCase(), mgr, sal, comm, deptNo);
int result = empService.insertEmp(emp);
if (result > 0) {
System.out.println("사원 정보 삽입 성공!!");
}
else System.out.println("사원 정보 삽입 실패..!!");
}
// EmpService.java
// 3. 새로운 사원 정보 삽입용 Service
public int insertEmp(Emp emp) {
int result = empDAO.insertEmp(emp);
return result;
}
// EmpDAO.java
// 3. 새로운 사원 정보 삽입용 DAO
public int insertEmp(Emp emp) {
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);
String query = "INSERT INTO EMP VALUES(?, ?, ?, ?, SYSDATE, ?, ?, ?)";
pstmt = conn.prepareStatement(query);
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());
result = pstmt.executeUpdate();
if(result>0) conn.commit();
else conn.rollback();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if(pstmt != null) pstmt.close();
if(conn != null) conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
return result;
}
4. 사번으로 사원 정보 수정
// EmpView.java
// 4. 사번으로 사원 정보 수정
private void updateEmp() {
System.out.println("[사원 정보 수정]");
System.out.print("정보를 수정할 사원의 사번 입력 : ");
int empNo = sc.nextInt();
sc.nextLine();
int check = empService.existsEmp(empNo);
if(check>0) {
System.out.print("직책 : ");
String job = sc.nextLine();
System.out.print("급여 : ");
int sal = sc.nextInt();
System.out.println("커미션 : ");
int comm = sc.nextInt();
sc.nextLine();
Emp temp = new Emp(empNo, job.toUpperCase(), sal, comm);
int result = empService.updateEmp(temp);
if(result >0) {
System.out.println("수정 성공!!!");
}else {
System.out.println("수정 실패...");
}
}else {
System.out.println("해당 사번을 가진 사원이 없습니다.");
}
}
// EmpService.java
// 4. 사원 정보 수정용 Service
public int updateEmp(Emp emp) {
return empDAO.updateEmp(emp);
}
// 4_1. 사번 정보 수정 전 사번이 일치하는 사원 유무 판단용 Service
public int existsEmp(int empNo) {
return empDAO.existsEmp(empNo);
}
// EmpDAO.java
//4. 사원정보 수정용 DAO
public int updateEmp(Emp emp) {
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) {
e.printStackTrace();
}finally {
try {
if(pstmt != null) pstmt.close();
if(conn != null) pstmt.close();
}catch(Exception e) {
e.printStackTrace();
}
}
return result;
}
//4_1. 사원정보 수정시 사번이 일치하는 사원이 있는지 확인
public int existsEmp(int empNo) {
Connection conn = null;
Statement stmt = null;
ResultSet rset = 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");
String query = "SELECT COUNT(*) FROM EMP WHERE EMPNO=" + empNo;
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
if(rset.next()) {
result = rset.getInt(1);
}
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if (rset != null) rset.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
return result;
}
5. 사번으로 사원 정보 삭제
// EmpView.java
// 5. 사원정보 삭제
private void deleteEmp() {
// 1단계 : 입력받은 사번을 가진 사원이 존재하는지 확인
System.out.println("[사번으로 사원 정보 삭제]");
System.out.print("삭제할 사번 입력 : ");
int empNo = sc.nextInt();
sc.nextLine();
int result = empService.selectEmp(empNo);
// 1단계 결과가 있다고 판별 된 경우
// "정말 삭제하시겠습니까?(Y/N) 출력 후"
// 'Y'를 입력한 경우 DB에서 삭제
if(result == 1) {
System.out.print("정말 삭제하시겠습니까? (Y/N) :");
char input = sc.nextLine().toUpperCase().charAt(0);
if(input == 'Y') {
int num = empService.deleteEmp(empNo);
if(num >0) {
System.out.println("삭제 성공!!!");
}else {
System.out.println("삭제 실패...");
}
} else if(input =='N') {
System.out.println("삭제가 취소되었습니다.");
} else {
System.out.println("Y 또는 N을 입력해주세요");
}
} else {
System.out.println("일치하는 사번을 가진 사원이 없습니다.");
}
}
// EmpService.java
// 5. 삭제를 위해 입력받은 사번을 가진 사원이 존재하는지 확인
public int selectEmp(int empNo) {
return empDAO.selectEmp(empNo);
}
// 5_1 삭제
public int deleteEmp(int empNo) {
return empDAO.deleteEmp(empNo);
}
// EmpDAO.java
// 5. 삭제를 위해 입력받은 사번을 가진 사원이 존재하는지 확인
public int selectEmp(int empNo) {
Connection conn = null;
Statement stmt = null;
ResultSet rset = 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");
String query = "SELECT EMPNO FROM EMP WHERE EMPNO =" +empNo;
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
if(rset.next()) {
result = 1;
}else {
result = 0;
}
}catch(Exception e) {
e.printStackTrace();
}
return result;
}
// 5_1 삭제
public int deleteEmp(int empNo) {
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 = "DELETE FROM EMP WHERE EMPNO = ?";
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, empNo);
result = pstmt.executeUpdate();
if(result>0) conn.commit();
else conn.rollback();
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
if (pstmt!=null) pstmt.close();
if (conn!=null) conn.close();
}catch(Exception e) {
e.printStackTrace();
}
}
return result;
}
6. 사번, 이름이 모두 일치하는 사원 정보 조회
// EmpView.java
// 6. 사번, 이름이 모두 일치하는 사원 정보 조회
private void selectOne2() {
System.out.println("[사번, 이름이 모두 일치하는 사원 정보 조회]");
System.out.print("사번 입력 :");
int empNo = sc.nextInt();
sc.nextLine();
System.out.print("이름 입력 :");
String eName = sc.nextLine();
Emp emp = empService.selectOne2(empNo, eName);
if(emp == null) System.out.println("일치하는 데이터가 없습니다.");
else {
System.out.println("사번 : " + emp.getEmpNo());
System.out.println("이름 : " + emp.geteName());
System.out.println("직책 : " + emp.getJob());
System.out.println("직속상사 : " + emp.getMgr());
System.out.println("입사일 : " + emp.getHireDate());
System.out.println("급여 : " + emp.getSal());
System.out.println("커미션 : " + emp.getComm());
System.out.println("부서번호 : " + emp.getDeptNo());
}
}
// EmpService.java
// 6. 사번, 이름이 모두 일치하는 사원 정보 조회용 Service
public Emp selectOne2(int empNo, String eName) {
Emp emp = empDAO.selectOne2(empNo, eName.toUpperCase()); // eName에 입력된 값이 모두 자동으로 대문자로 변환된다.
return emp;
}
// EmpDAO.java
// 6. 사번,이름으로 사원 정보 조회용 DAO
public Emp selectOne2(int empNo, String eName) {
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
Emp emp = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "scott","tiger");
String query =
"SELECT * FROM EMP WHERE EMPNO=" + empNo+ "AND UPPER(ENAME) = \'" + eName +"\'";
// DB에 있는 값을 모두 대문자로 변경함.
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
if(rset.next()) {
int empNum = rset.getInt("EMPNO");
String ename = rset.getString("ENAME");
String job = rset.getString("JOB");
int mgr = rset.getInt("MGR");
Date hireDate = rset.getDate("HIREDATE");
int sal = rset.getInt("SAL");
int comm = rset.getInt("COMM");
int deptNo = rset.getInt("DEPTNO");
emp = (new Emp(empNum, ename, job, mgr, hireDate, sal, comm, deptNo));
}
} catch(ClassNotFoundException e) {
e.printStackTrace();
} catch(SQLException e) {
e.printStackTrace();
}finally {
try {
if(rset!=null) rset.close();
if(stmt!=null) stmt.close();
if(conn!=null) conn.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
return emp;
}
공유하기
Twitter Google+ LinkedIn
댓글남기기