본문 바로가기
Spring

2022-11-09~10 JDBC 1. insert - 사원등록하기 / 드라이버 로딩, DB서버 연결, 자원반납

by HTT 2022. 11. 11.

jdbc패키지 - DBUtil ,CustomerDAO2, CustomerDTO2, DAOTest, MenuUI .java파일

 

1. 각각의 클래스로 기능을 나눠서 CustomerDAO에 모으기

2. CustomerDAO에서 중복되는 코드를 분리하여 DBUtil에 모으기

3. 각 계층으로 데이터 전달할 때 DTO객체로 만들어서 주고받기

 

 

- 객체생성을 위해 CustomerDTO클래스와 생성자, getter, setter메소드 만들기

 

* 커넥션설정과 자원반납 등 모든 메소드가 공통으로 처리하는 부분을 구현
* DB연동과 관련된 기능을 유틸리티처럼 제공하는 클래스


1. 드라이버 로딩
2. DB서버 연결
3. 자원반납

 => 유틸리티처럼 사용할 것이므로 static으로 구현

package jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBUtil {
	// 드라이버 로딩
	static {  // DBUtil이 시작되는 순간 실행됨
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch(ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	//DB서버 연결 - DB서버에 연결하고 커넥션객체를 리턴
	public static Connection getConnect() {
		Connection con = null;
		String url = "jdbc:oracle:thin:@172.30.1.37:1521:xe";
		String user = "scott";
		String password = "tiger1234";
		try {
			con = DriverManager.getConnection(url, user, password);
		}catch(SQLException e) {
			e.printStackTrace();
		}
		return con;
	}
	//커넥션반납을 위한 메소드
	public static void close(ResultSet rs, Statement stmt, Connection con) {
		try {
			if(rs!=null)rs.close();
			if(stmt!=null)stmt.close();
			if(con!=null)con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

 

<예제풀기>

package jdbc.exam;
import java.util.Scanner;

public class DAOTest {
	public static void main(String[] args) {
		Scanner key = new Scanner(System.in);
		System.out.println("******인사관리시스템********");
		System.out.println("1. 사원등록");
		System.out.println("2. 전체사원조회");
		System.out.println("3. job별로 사원조회하기");
		System.out.println("4. SMITH부서의 전 사원의 급여를 500올려주기");
		System.out.println("5. comm이 0인 직원 삭제하기");
		System.out.println("6. 각 매니저의 정보 조회하기(매니저 아이디로 조회하기)");
		System.out.print("원하는 작업을 선택하세요:");
		int choice  = key.nextInt();
		show(choice);
	}
	public static void show(int choice){
		MenuUI ui = new MenuUI();
		switch(choice){
			case 1:
				ui.insertMenu();
				break;
			case 2:
				ui.selectMenu();
				break;
			case 3:
				ui.searchMenu();
				break;
			case 4:
				ui.updateMenu();
				break;
			case 5:
				ui.deleteMenu();
				break;
			case 6:
				ui.getInfoMenu();
				break;
		}
	}
}

 

 

1. 사원 등록하기(insert)

 

public class MenuUI {
	Scanner key = new Scanner(System.in);
	CustomerDAO2 cd = new CustomerDAO2();
	
	public void insertMenu(){
		System.out.println("*******사원등록********");
		System.out.print("사원번호:");
		String empno = key.next();
		System.out.print("성명:");
		String ename = key.next();
		System.out.print("JOB:");
		String job = key.next();
		System.out.print("매니저아이디:");
		String mgr = key.next();
		System.out.print("부서번호:");
		String deptno = key.next();
		int result = cd.insert(empno, ename, job, mgr, deptno);
		
		if(result>0) {
			System.out.println("가입완료.... 환영합니다.");
		}else {
			System.out.println("이미 가입된 사용자입니다.");
		}
	}
}   

public class CustomerDAO2 {
	public int insert(String empno, String ename, String job, String mgr, String deptno) { // 1.
		String sql = "insert into emp values (?, ?, ?, ?, sysdate, 800, 0, ?)";
		Connection con = null;
		PreparedStatement ptmt = null;
		int result = 0;
		try {
			con = DBUtil.getConnect();
			ptmt = con.prepareStatement(sql);
			ptmt.setString(1, empno);
			ptmt.setString(2, ename);
			ptmt.setString(3, job);
			ptmt.setString(4, mgr);
			ptmt.setString(5, deptno);
			System.out.println("Statement객체 생성 : " + ptmt);
			result = ptmt.executeUpdate(); // sql문 실행
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			DBUtil.close(null, ptmt, con);
		}
		return result;
	}    
}

 

- 메인에서 show메소드를 호출시키고 show메소드에서 insertMenu메소드를 호출하였다. MenuUI클래스로 넘어가보자. 전체 사원의 정보를 조회하는 메소드를 실행하여 데이터를 받아와야 하기 때문에 메소드를 모아둔 CustomerDTO2클래스의 객체를 생성한 후 insert메소드를 호출하였다.

 

- CustomerDAO2 : sql문을 실행하기 위해 드라이버를 로딩하고 DB서버와 연결해준다(커넥션 설정). 후에 데이터를 넘겨주기 위해 객체를 만들어 setString으로 값을 세팅해주고,  insert는 int값을 반환하므로 executeUpdate로 sql문을 실행해준다. 

 

- 쉬운 이해를 위해 지금까지의 과정을 스택으로 표현한다면 이렇게 될 것이다.

 

|           insert           |

|      insertMenu      |          => 가장 위에(나중에 실행된 메소드)있는 메소드가 하나씩 빠져나가며 종료된다.

|            show            |

|            main            |

ㅡㅡㅡㅡㅡㅡㅡㅡ

 

- try문 안에서 변수를 생성하면 지역변수가 되기 때문에 try문 안에서만 사용할 수 없다. 즉, 데이터를 넘겨줄 수 없다는 것이다. 그래서 변수는 try문 밖에 null값으로 초기화를 해주고 int타입(리턴타입과 동일한 타입으로) 변수인 result에 데이터를 담아서 자신을 호출한 클래스로 데이터를 넘겨준다. insert의 메소드는 종료되고 스택에서 빠져나가게 된다.

* CustomerDAO2는 데이터를 넘겨주는 일만 수행한다. 데이터처리는 MenuUI클래스에서 실행한다.

 

- 다시 MenuUI클래스로 돌아와서 리턴값을 받기 위해  동일한 타입의 변수를 만들어 받아준다.

int result = cd.insert(empno, ename, job, mgr, deptno);

 

- 한 줄이 실행되면 1, 두 줄이면 2, 실행되지 않았으면 0으로 나타나기 때문에 if문을 사용해 0과 비교해준다. 경우의 수가 사원등록이 성공했을 때와, 이미 있는 사원번호를 입력했을 때, 2가지로 나눠지기 때문에 if와 else를 사용하였다.

insertMenu 메소드가 종료된 후 break되고, main메소드가 종료되어 모든 메소드가 스택을 빠져나가게 된다.

댓글