일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- include액션태그
- ObjectInputStream
- MemoryStream
- 메모리스트림
- interrupt()
- Daemon()
- StringWriter
- 동기화
- 상관서브쿼리
- sleep()메소드
- 상관 서브 쿼리
- 스레드그룸
- Linux셋팅
- ThreadGroup()
- char[] String 형변환
- InputDialog
- isinterrupted()
- 리눅스셋팅
- interrupted()
- String char[] 형변환
- 리눅스세팅
- ID중복
- first-child
- first-of-child
- Linux세팅
- include 지시자
- 아이디중복
- 표현 언어
- StringReader
- include지시자
- Today
- Total
다연이네
[days03] 문제) 부서별 소속 사원수 정렬하여 출력 본문
아래와 같이 출력되도록 코딩하세요.
ㄱ. 각 부서별 정렬 및 부서 소속 사원수 출력
ㄴ. 각 부서별 소속된 사원 정보 출력
( 조건: sal 많이 받는 순으로 정렬해서 번호 붙여서 출력 )
[실행 결과]
10 ACCOUNTING NEW YORK(3명)
1 7839 KING 5000.0
2 7782 CLARK 2450.0
3 7934 MILLER 1300.0
20 RESEARCH DALLAS(3명)
1 7902 FORD 3000.0
2 7566 JONES 2975.0
3 7369 SMITH 800.0
30 SALES CHICAGO(6명)
1 7698 BLAKE 2850.0
2 7499 ALLEN 1600.0
3 7844 TURNER 1500.0
4 7521 WARD 1250.0
4 7654 MARTIN 1250.0
6 7900 JAMES 950.0
40 OPERATIONS BOSTON(0명)
사원이 존재하지 않습니다.
1.
package days03;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import com.util.DBConn;
import days02.DeptDTO;
import days02.EmpDTO;
public class Ex03 {
public static void main(String[] args) {
String sql =
"select d.*,(select count(*) from emp where deptno = d.deptno)cnt "
+" from dept d ";
Connection con = null;
Statement stmt = null, stmtEmp=null;
ResultSet rs = null, rsEmp=null;
ArrayList<DeptDTO> list = null;
ArrayList<EmpDTO> listEmp = null;
DeptDTO dto = null;
EmpDTO dtoEmp = null;
int deptno;
String dname, loc;
int cnt;
con = DBConn.getConnection(); //이렇게 한느거
//이 코딩이 오류나면 연결 안된거
try {
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
String sqlEmp = null;
if(rs.next()) {
list= new ArrayList<DeptDTO>();
do {
deptno =rs.getInt("deptno"); //"컬럼명"
dname= rs.getString("dname");
loc =rs.getString("loc");
cnt = rs.getInt("cnt"); //alias를 cnt로 줬으니까
dto = new DeptDTO(deptno, dname, loc);
dto.setCnt(cnt);
//list.add(dto);
System.out.printf("%s (%d명)\n",dto, dto.getCnt() );
//해당 부서에 해당하는 사원들 쿼리 날리기
sqlEmp = "select rank() over(Order by sal DESC) no ,empno, ename, sal "
+ " from emp "
+ " where deptno= "+deptno;
//위 쿼리를 수행할 stmt, rs, arraylist, dto필요 (위에 가서 추가해주자)
stmtEmp = con.createStatement();
rsEmp = stmtEmp.executeQuery(sqlEmp);
if(rsEmp.next()) {
//부서마다 liistEmp를 만들어야하잖아
//10번저장할 하나 20번저장할 하나 30번저장할 하나.. 하지말고
//list 안에 listEmp 넣기 (컬렉션 안에 컬렉션 넣기)
//밑에는 Array에 안담고 안에서 바로 출력한 방법 (컬렉션에 안담고)
//그러나 이럴 일은 절대 없다
listEmp = new ArrayList<EmpDTO>();
do {
int no = rsEmp.getInt("no");
int empno = rsEmp.getInt("empno");
String ename = rsEmp.getString("ename");
double sal = rsEmp.getDouble("sal");
dtoEmp = new EmpDTO();
dtoEmp.setNo(no);
dtoEmp.setEMPNO(empno);
dtoEmp.setENAME(ename);
dtoEmp.setSAL(sal);
//listEmp.add(dtoEmp)
System.out.printf("\t\t%d\t%d\t%s\t%.2f\n"
, no, empno, ename, sal);
}while(rsEmp.next());
}
stmtEmp.close();
rsEmp.close();
}while(rs.next());
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
rs.close();
stmt.close();
DBConn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
/*
if(list != null) {
Iterator<DeptDTO> ir = list.iterator();
while (ir.hasNext()) {
dto = ir.next();
System.out.printf("%s (%d명)\n",dto, dto.getCnt() );
//count(*)값이 출력이 안됨
//-> 방법1 : DeptDTO에 int로 cnt를 추가해주자
}
}
*/
}//main
}//class
2. 위 쿼리를 Map 계열 찾아와 저장 - Hashtable사용하기
package days03;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.util.DBConn;
import days02.DeptDTO;
import days02.EmpDTO;
public class Ex03_02 {
public static void main(String[] args) {
String sql =
"select d.*,(select count(*) from emp where deptno = d.deptno)cnt "
+" from dept d ";
Connection con = null;
Statement stmt = null, stmtEmp=null;
ResultSet rs = null, rsEmp=null;
//ArrayList 지우고
//Map 계열 찾아와 저장
//key DeptDTO
//value ArrayList<EmpDTO>
ArrayList<EmpDTO> listEmp = null; //얘는 필요
Hashtable<DeptDTO, ArrayList<EmpDTO>> ht = new Hashtable<>();
DeptDTO dto = null;
EmpDTO dtoEmp = null;
int deptno;
String dname, loc;
int cnt;
con = DBConn.getConnection();
try {
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
String sqlEmp = null;
if(rs.next()) {
do {
deptno =rs.getInt("deptno"); //"컬럼명"
dname= rs.getString("dname");
loc =rs.getString("loc");
cnt = rs.getInt("cnt"); //alias를 cnt로 줬으니까
dto = new DeptDTO(deptno, dname, loc);
dto.setCnt(cnt);
//list.add(dto);
//System.out.printf("%s (%d명)\n",dto, dto.getCnt() );
///해당 부서에 해당하는 사원들 쿼리 날리기
sqlEmp = "select rank() over(Order by sal DESC) no ,empno, ename, sal "
+ " from emp "
+ " where deptno= "+deptno +"ORDER BY DEPTNO ASC";
//위 쿼리를 수행할 stmt, rs, arraylist, dto필요 (위에 가서 추가해주자)
stmtEmp = con.createStatement();
rsEmp = stmtEmp.executeQuery(sqlEmp);
if(rsEmp.next()) {
listEmp = new ArrayList<EmpDTO>();
do {
int no = rsEmp.getInt("no");
int empno = rsEmp.getInt("empno");
String ename = rsEmp.getString("ename");
double sal = rsEmp.getDouble("sal");
dtoEmp = new EmpDTO();
dtoEmp.setNo(no);
dtoEmp.setEMPNO(empno);
dtoEmp.setENAME(ename);
dtoEmp.setSAL(sal);
listEmp.add(dtoEmp);
}while(rsEmp.next());
}
ht.put(dto, listEmp);
//부서정보(키값) - 어레이리스트(밸류값) 들어감
stmtEmp.close();
rsEmp.close();
}while(rs.next());
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
rs.close();
stmt.close();
DBConn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//출력
//hashtable
Set<Entry<DeptDTO, ArrayList<EmpDTO>>> es = ht.entrySet();
Iterator<Entry<DeptDTO, ArrayList<EmpDTO>>> ir = es.iterator();
while (ir.hasNext()) {
Entry<DeptDTO, ArrayList<EmpDTO>> entry = ir.next();
dto = entry.getKey();
System.out.printf("%s(%d명)\n", dto, dto.getCnt());
ArrayList<EmpDTO> list = entry.getValue();
Iterator<EmpDTO> ir2 = list.iterator();
while (ir2.hasNext()) {
EmpDTO eDto = ir2.next();
System.out.printf("\t\t%d\t%d\t%s\t%.2f\n", eDto.getNo(), eDto.getEMPNO(), eDto.getENAME(), eDto.getSAL());
}
//System.out.printf("%s\n%s\n", key, value);
}
}//main
}//class
부서 순서가 이상하고, 40번부서가 0명인데 30번 부서 사람들이 출력되었다.
=>해시테이블 : 순서를 유지하지 않는 컬렉션 클래스이기 때문이다
3. 순서를 유지하면서 Map 계열인 컬렉션 클래스를 사용하자 LinkedHashMap
package days03;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedSet;
import com.util.DBConn;
import days02.DeptDTO;
import days02.EmpDTO;
public class Ex03_03 {
public static void main(String[] args) {
String sql =
"select d.*,(select count(*) from emp where deptno = d.deptno)cnt "
+" from dept d ";
Connection con = null;
Statement stmt = null, stmtEmp=null;
ResultSet rs = null, rsEmp=null;
ArrayList<EmpDTO> listEmp = null; //얘는 필요
//Hashtable<DeptDTO, ArrayList<EmpDTO>> ht = new Hashtable<>();
//해시테이블 : 순서를 유지하지 않는 컬렉션 클래스
//-> 순서를 유지하면서 Map 계열인 컬렉션 클래스가 뭐가있는지 알고 있어야함
LinkedHashMap<DeptDTO, ArrayList<EmpDTO>> ht = new LinkedHashMap<>();
DeptDTO dto = null;
EmpDTO dtoEmp = null;
int deptno;
String dname, loc;
int cnt;
con = DBConn.getConnection();
try {
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
String sqlEmp = null;
if(rs.next()) {
do {
deptno =rs.getInt("deptno"); //"컬럼명"
dname= rs.getString("dname");
loc =rs.getString("loc");
cnt = rs.getInt("cnt"); //alias를 cnt로 줬으니까
dto = new DeptDTO(deptno, dname, loc);
dto.setCnt(cnt);
sqlEmp = "select rank() over(Order by sal DESC) no ,empno, ename, sal "
+ " from emp "
+ " where deptno= "+deptno +"ORDER BY DEPTNO ASC";
stmtEmp = con.createStatement();
rsEmp = stmtEmp.executeQuery(sqlEmp);
listEmp = new ArrayList<EmpDTO>(); //사원집어넣을때 사원 있든없든 무조건 객체생성
//이 코딩이 if문 밖에 있어야 40번팀에 30번 팀이 추가가 안되어 있음
//만약 얘를 if문 안에 넣어야겠다면 밑으로 가서
//145줄 if(list.size()>0) ~ else 넣기
if(rsEmp.next()) {
//listEmp = new ArrayList<EmpDTO>();
do {
int no = rsEmp.getInt("no");
int empno = rsEmp.getInt("empno");
String ename = rsEmp.getString("ename");
double sal = rsEmp.getDouble("sal");
dtoEmp = new EmpDTO();
dtoEmp.setNo(no);
dtoEmp.setEMPNO(empno);
dtoEmp.setENAME(ename);
dtoEmp.setSAL(sal);
listEmp.add(dtoEmp);
}while(rsEmp.next());
}
ht.put(dto, listEmp);
//부서정보(키값) - 어레이리스트(밸류값) 들어감
stmtEmp.close();
rsEmp.close();
}while(rs.next());
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
rs.close();
stmt.close();
DBConn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//출력
//hashtable
Set<Entry<DeptDTO, ArrayList<EmpDTO>>> es = ht.entrySet();
Iterator<Entry<DeptDTO, ArrayList<EmpDTO>>> ir = es.iterator();
while (ir.hasNext()) {
Entry<DeptDTO, ArrayList<EmpDTO>> entry = ir.next();
dto = entry.getKey();
System.out.printf("%s(%d명)\n", dto, dto.getCnt());
ArrayList<EmpDTO> list = entry.getValue();
if(list.size()>0) {
Iterator<EmpDTO> ir2 = list.iterator();
while (ir2.hasNext() ) {
EmpDTO eDto = ir2.next();
System.out.printf("\t\t%d\t%d\t%s\t%.2f\n"
, eDto.getNo(), eDto.getEMPNO(), eDto.getENAME(), eDto.getSAL()
);
}
}else {
System.out.println("\t\t사원없음");
}
}//main
}}//class
'JDBC' 카테고리의 다른 글
[days03] PreparedStatement 사원 조회 (0) | 2020.11.25 |
---|---|
[days03] PreparedStatement - 사원 추가, 수정, 삭제 (0) | 2020.11.25 |
[days03] 사원 조회, 추가, 삭제 (0) | 2020.11.25 |
[days02] DEPT 테이블 조회, 추가, 수정, 삭제, 검색 (0) | 2020.11.25 |
[days02] 싱글톤 클래스 SELECT(조회) 작업하기 (0) | 2020.11.25 |