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메소드가 종료되어 모든 메소드가 스택을 빠져나가게 된다.
'Spring' 카테고리의 다른 글
2022-11-23 스프링 customer패키지 리뷰 (0) | 2022.11.24 |
---|---|
2022-11-23 Spring에 대해서 (0) | 2022.11.23 |
2022-11-11 JDBC 이론 정리 (0) | 2022.11.12 |
2022-11-11 Servlet 등록, 요청 (0) | 2022.11.12 |
2022-11-09~10 JDBC 2. select - 전체 사원 조회하기 (0) | 2022.11.11 |
댓글