다연이네

[days03] 문제) 부서별 소속 사원수 정렬하여 출력 본문

JDBC

[days03] 문제) 부서별 소속 사원수 정렬하여 출력

 다연  2020. 11. 25. 22:13
반응형

아래와 같이 출력되도록 코딩하세요.    
          ㄱ. 각 부서별 정렬 및 부서 소속 사원수 출력
          ㄴ. 각 부서별 소속된 사원 정보 출력
             ( 조건: 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

 

반응형
Comments