다연이네

[days02] 싱글톤 클래스 SELECT(조회) 작업하기 본문

JDBC

[days02] 싱글톤 클래스 SELECT(조회) 작업하기

 다연  2020. 11. 25. 00:06
반응형

1.DEPT SELECT 하기

1) DeptDTO 클래스 생성 - dept테이블의 deptno, dname, loc 객체를 담고 있음

package days02;

/**
 * @author 82103
 *
 */
public class DeptDTO {
 //필드
	private int DEPTNO;
	private String DNAME;
	private String LOC;
 //getter, setter
	public int getDEPTNO() {
		return DEPTNO;
	}
	public void setDEPTNO(int dEPTNO) {
		DEPTNO = dEPTNO;
	}
	public String getDNAME() {
		return DNAME;
	}
	public void setDNAME(String dNAME) {
		DNAME = dNAME;
	}
	public String getLOC() {
		return LOC;
	}
	public void setLOC(String lOC) {
		LOC = lOC;
	}

	
 //생성자
	public DeptDTO() { //디폴트 생성자
		super();
	}
	
	//이부분 추가한 거 
 public DeptDTO(int dEPTNO, String dNAME, String lOC) {
	super();
	DEPTNO = dEPTNO;
	DNAME = dNAME;
	LOC = lOC;
}
//오버라이딩
    @Override
    public String toString() {
       return String.format("%d\t%s\t%s\n",DEPTNO,DNAME,LOC);
    }
	
	
}

2) 위의 클래스를 이용해 SELECT 작업이 이루어지는 클래스 작성

package days02;

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;

public class Ex02 {

   public static void main(String[] args) {
	   
      //나중에 자바아닌것으로 할때는 프로시저명으로 처리하는게 속도가 빠르다
      String sql = "SELECT deptno, dname, loc FROM DEPT";
      Connection con = DBConn.getConnection(); //connection객체 얻어옴
     
      ArrayList<DeptDTO> list = null; //캐치블록 밖에 빼주기
      
      //CRUD
      //1. 쿼리를 수행할 객체가 필요 -3가지                         : Statement    3가지 종류
      //2. select 한 결과물을 가지고 있는 저장하고 있는 객체  : ResultSet 
      try {
         Statement stmt = con.createStatement();
         ResultSet rs = stmt.executeQuery(sql);
         //select 쿼리를 실행할 때는executeQuery()메서드 사용 : 일꾼이 무슨일을 할지?
         
        /* 
         while(rs.next()) {//다음 레코드가 있으면 true, 없으면 false 값을 돌림
          int deptno = rs.getInt(1); //위의 "SELECT deptno, dname, loc FROM DEPT"; 에서 1번째거 (0이아닌 1부터 시작)
          String dname = rs.getString(2);
          String loc = rs.getString(3);
          
          System.out.printf("%d\t%s\t%s\n", deptno, dname, loc);
         }
         */
         
         list = new ArrayList<DeptDTO>();
         while(rs.next()) {
        	 DeptDTO dto = new DeptDTO();
        	 dto.setDEPTNO(rs.getInt(1));
        	 dto.setDNAME(rs.getString(2));
        	 dto.setLOC(rs.getString(3));
        	 
        	 list.add(dto); //굳이 왜 어레이리스트에 담나 ? 나중에 출력용에 담아서 넘겨줌
         }
         
         rs.close();    //닫는거 잊지말자!
         stmt.close();  //닫는거 잊지말자!
         
      } catch (SQLException e) {
         e.printStackTrace();
      }
      
      
      DBConn.close();
      
      // list 안에 부서정보 들어가 있을 것 => 출력해보자
      Iterator<DeptDTO> ir = list.iterator();
      while (ir.hasNext()) { //while 컨+스 
		DeptDTO dto = ir.next();
		System.out.println(dto);
		
	}
      
      System.out.println("=end=");

   }

}

-> dept 테이블의 모든 레코드의 deptno, dname, loc 컬럼을 출력한다.

 

2. EMP SELECT 하기

1) EmpDTO 클래스 생성 - emp 테이블의 모든 객체를 담고 있음

package days02;

import java.sql.Date;

/**
 * @author 82103
 *
 */
public class EmpDTO {
//실제 DB 칼럼명에 맞춰 만들기
	
	//필드
	private int EMPNO;
	private String ENAME;
	private String JOB;
	private int MGR;
	private  Date HIREDATE; //date는 java.sql로 잡음          
	private int SAL;
	private double COMM;
	private int DEPTNO;   
	
	//게터세터
	public int getEMPNO() {
		return EMPNO;
	}

	public void setEMPNO(int eMPNO) {
		EMPNO = eMPNO;
	}

	public String getENAME() {
		return ENAME;
	}

	public void setENAME(String eNAME) {
		ENAME = eNAME;
	}

	public String getJOB() {
		return JOB;
	}

	public void setJOB(String jOB) {
		JOB = jOB;
	}

	public int getMGR() {
		return MGR;
	}

	public void setMGR(int mGR) {
		MGR = mGR;
	}

	public Date getHIREDATE() {
		return HIREDATE;
	}

	public void setHIREDATE(Date hIREDATE) {
		HIREDATE = hIREDATE;
	}

	public int getSAL() {
		return SAL;
	}

	public void setSAL(int sAL) {
		SAL = sAL;
	}

	public double getCOMM() {
		return COMM;
	}

	public void setCOMM(double cOMM) {
		COMM = cOMM;
	}

	public int getDEPTNO() {
		return DEPTNO;
	}

	public void setDEPTNO(int dEPTNO) {
		DEPTNO = dEPTNO;
	}

	//생성자
	//1. 디폴트 생성자
	public EmpDTO() {
		super();
	}
	//2. 필드를 모두 가지는 생성자
	public EmpDTO(int eMPNO, String eNAME, String jOB, int mGR, Date hIREDATE, int sAL, double cOMM, int dEPTNO) {
		super();
		EMPNO = eMPNO;
		ENAME = eNAME;
		JOB = jOB;
		MGR = mGR;
		HIREDATE = hIREDATE;
		SAL = sAL;
		COMM = cOMM;
		DEPTNO = dEPTNO;
	}

	
	
	//오버라이딩
	@Override
	public String toString() {
		return String.format("%d\t%s\t%s\t%d\t%s\t%.2f\t,%.2f\t%d\n"
				, EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO);
	}
	
	
	
}

2) 텍스트파일에 환경정보 작성해서 저장

텍스트파일명 : ConnectionString.properties

3) SELECT할 클래스 생성

package days02;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
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 java.util.Properties;

import com.util.DBConn;

public class Ex02_02{
	public static void main(String[] args) {
		//문제) emp 테이블 모든 컬럼 select
		//EmpDTO 클래스 선언 -> ArrayList<EmpDTO> list 저장

		//ipAddress, SID, user, password 정보들이 ConnectionString.properties 파일에 있다고 가정
		//해당 파일 추가 comm.util -> 뉴 -> 언타이틀드 텍스트 파일
		//파일만들어서 정보 넣음
		String fileName = ".\\src\\com\\util\\ConnectionString.properties";
		Properties prop = new Properties();
		String hostname = null, sid=null, user=null, password=null;

		try {
			prop.load(new FileReader(fileName));

			hostname = prop.getProperty("hostname");
			sid = prop.getProperty("sid");
			user = prop.getProperty("user");
			password = prop.getProperty("password");

			System.out.println(hostname);


		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		String url = String.format("jdbc:oracle:thin:@%s:1521:%s", hostname, sid);
		Connection con = DBConn.getConnection(url, user, password); //겟컨넥션 f3

		//CRUD
		ArrayList<EmpDTO> list = null;

		Statement stmt = null;//일꾼객체
		ResultSet rs = null;//저장객체
		EmpDTO dto = null;

		String sql = "SELECT DEPTNO, EMPNO, ENAME, SAL+NVL(COMM,0) pay, HIREDATE"
				+"	FROM EMP";

		try {
			stmt = con.createStatement();
			rs = stmt.executeQuery(sql);

			//list = new ArrayList<EmpDTO>(); //왜 처음부터 이렇게 안주고
			//null준다음에 이렇게 해 ?
			// => 만약에 select 한 결과가 하나도 존재하지 않으면 new ArrayList()할 필요 없잖아
			//사원이 존재하지 않을 수도 있으니까 
			if(rs.next()) { //최소 사원한명이라도 존재하면 
				list = new ArrayList<EmpDTO>(); 

				do {
					dto = new EmpDTO();
					dto.setDEPTNO(rs.getInt("DEPTNO"));
					dto.setEMPNO(rs.getInt("EMPNO"));
					dto.setENAME(rs.getString("ENAME"));
					// pay 값은 저장 아직 안함
					dto.setHIREDATE(rs.getDate("HIREDATE"));

					list.add(dto);
				}while (rs.next());
			} //사원 없으면 if문 자체가 거짓이니 list도 null이고 new로 생성하지 않을 것


		} catch (SQLException e1) {
			e1.printStackTrace();
		}


		try {
			rs.close();
			stmt.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}



		DBConn.close();

		//출력
		if(list != null) {
			Iterator<EmpDTO> ir = list.iterator();
			while (ir.hasNext()) {
				dto =  ir.next();
				System.out.printf("%d\t%d\t%s\t%s\n"
						, dto.getDEPTNO(), dto.getEMPNO(), dto.getENAME(), dto.getHIREDATE());
			}
		}else {
			System.out.println("사원이 존재하지 않습니다");
		}
		System.out.println("END");
	}
}

 

반응형
Comments