JDBC 예제(JOIN 데이터 불러오기)
부트캠프(END)/Oracle2022. 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 |
댓글()