JDBC 예제(JOIN 데이터 불러오기)

부트캠프(END)/Oracle|2022. 6. 30. 17:04

테이블끼리 JOIN한 결과를 Java에서 불러오려면 어떻게 해야 할까?

3개의 테이블이 있다.

 

1) 직원의 정보를 저장하는 Employee(이하 emp)

2) 회사의 부서 정보를 저장하는 Department(이하 dept)

3) 월급의 등급 정보를 저장하는 SalGrade

 

위 테이블들을 JOIN 해서...

각 직원의 정보를 불러올 때 직원 정보와 부서의 이름, 월급의 등급 정보까지 한 번에 불러오려고 한다.

 

Dept.java

package dao;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Dept {
	private int deptno;
	private String dname;
	private String loc;
}

Salgrade.java

package dao;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class SalGrade {
	private int grade;
	private int losal;
	private int hisal;
}

Emp.java

package dao;

import java.util.Date;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
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;
	private String dbday;//날짜변환값을 받아줄 값
	private Dept dvo = new Dept();//java JOIN-> 포함 클래스
	private SalGrade svo = new SalGrade();//java JOIN-> 포함 클래스
}

JOIN요소를 함께 불러오기 위해서 Dept와 SalGrade 클래스 객체를 포함 클래스로 정의한다.

 

 

EmpJoinDAO.java(JDBC 연결)

package dao;
import java.util.*;
import java.sql.*;
public class EmpJoinDAO {
	private Connection conn;
	private PreparedStatement ps;
	
	private final String URL = "jdbc:oracle:thin:@localhost:0000:xe";
	private static EmpJoinDAO dao;
	
	public EmpJoinDAO() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		}catch(Exception ex) {
			ex.printStackTrace();
		}
	}
	
	//Single-Tone 데이터베이스의 객체는 딱 하나만 생성한다. 메모리 공간을 하나만 사용한다!
	public static EmpJoinDAO newInstance() {
		if(dao==null)
			dao = new EmpJoinDAO();
		return dao;
	}
	
	//DAO 에서 에러가 떠서 null이 발생한 경우 -> 코드를 보는게 아니라...
	//연결
	public void getConnection() {
		try {
			conn = DriverManager.getConnection(URL,"user","0000");
		}catch(Exception ex) {
			ex.printStackTrace();
		}
	}
	//연결 해제
	public void disConnection() {
		try {
			if(ps!=null) ps.close();
			if(conn!=null) conn.close();
		}catch(Exception ex) {
			ex.printStackTrace();
		}
	}
}

 

EmpJoinDAO.java(EQUI-JOIN 메서드)

public List < Emp > empJoinData() {
    List < Emp > list = new ArrayList < Emp > ();
    try {
        getConnection();
        String sql = "SELECT empno, ename, job," +
            "TO_CHAR(hiredate,'yyyy-mm-dd') as dbday," +
            "sal, dname, loc " +
            "FROM emp JOIN dept " +
            "ON emp.deptno = dept.deptno";
        ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();

        while (rs.next()) {
            Emp emp = new Emp();
            emp.setEmpno(rs.getInt(1));
            emp.setEname(rs.getString(2));
            emp.setJob(rs.getString(3));
            emp.setDbday(rs.getString(4));
            emp.setSal(rs.getInt(5));
            emp.getDvo().setDname(rs.getString(6)); //JOIN요소
            emp.getDvo().setLoc(rs.getString(7)); //JOIN요소

            list.add(emp);
        }
        rs.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        disConnection();
    }
    return list;
}

EmpJoinDAO.java(NON-EQUI JOIN 메서드)

public List < Emp > empNonEquiJoinData() {
    List < Emp > list = new ArrayList < Emp > ();
    try {
        getConnection();
        String sql = "SELECT empno, ename, job, TO_CHAR(hiredate,'yyyy/mm/dd') as dbday," +
            "sal, dname, loc, grade " +
            "FROM emp, dept, salgrade " +
            "WHERE emp.deptno=dept.deptno AND " +
            "emp.sal BETWEEN salgrade.losal AND salgrade.hisal";
        ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            Emp emp = new Emp();
            emp.setEmpno(rs.getInt("empno")); //INDEX번호가 아니라 컬럼명으로도 불러올 수 있다.
            emp.setEname(rs.getString("ename"));
            emp.setJob(rs.getString("job"));
            emp.setDbday(rs.getString("dbday"));
            emp.setSal(rs.getInt("sal"));
            emp.getDvo().setDname(rs.getString("dname")); //JOIN요소
            emp.getDvo().setLoc(rs.getString("loc")); //JOIN요소
            emp.getSvo().setGrade(rs.getInt("grade"));

            list.add(emp);

        }
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        disConnection();
    }
    return list;
}

EmpJoinDAO.java(OUTER JOIN 메서드)

public List < Emp > empOuterJoinData() {
    List < Emp > list = new ArrayList < Emp > ();
    try {
        getConnection();
        String sql = "SELECT empno, ename, job, dname, loc " +
            "FROM emp, dept " +
            "WHERE emp.deptno(+)=dept.deptno";
        ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
            Emp emp = new Emp();
            emp.setEmpno(rs.getInt(1));
            emp.setEname(rs.getString(2));
            emp.setJob(rs.getString(3));
            emp.getDvo().setDname(rs.getString(4)); //JOIN요소
            emp.getDvo().setLoc(rs.getString(5)); //JOIN요소

            list.add(emp);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    } finally {
        disConnection();
    }
    return list;
}

 

'부트캠프(END) > Oracle' 카테고리의 다른 글

VIEW, Sequence  (0) 2022.07.01
JDBC 예제(CURD 게시판)  (0) 2022.06.29
DML, TCL  (0) 2022.06.28

댓글()