ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 & 오라클(Oracle) 쿼리 가져오기
    Database/컨셉 , 예제 2018. 8. 29. 13:34

     자바 이클립스, 오라클, Toad for Oracle, ojdbc 설치 및 환경설정을 하면 오라클 데이터베이스를 이용한 쿼리문을 자바에서 사용할 수 있는 환경이 구성된다.  해당 예제는 사전 환경설정 없이는 실행이 불가능하다. 직접 프로그램을 실행시켜 확인하고 싶다면 환경 설정을 정확히 하고 수행하도록 한다. 자세한 내용은 환경 설정 카테고리 포스팅들 참조.

    오라클 데이터베이스의 system 유저로 접속하면 학습용 테이블들이 제공되어 있다. Toad for Oracle 환경설정에서 HR 스키마에 대한 사용 잠금을 해제했기 때문에 그곳의 테이블들에 접근이 가능하다. 접근이 가능하다는 말은 쿼리를 사용할 수 있다는 말이다.

    오라클의 HR 스키마 중 Countries와 Regions 테이블의 칼럼들을 조인해 출력하는 예제를 포스팅한다.

    1. Table VO 생성.
    테이블의 row 정보를 담는 클래스를 생성한다. VO는 Value Object의 약자이다.

    클래스명 : 데이터베이스의 "테이블명VO"
    멤버 변수명 : 테이블의 칼럼명을 CamelCase로
    데이버 타입 : 테이블 데이터 타입을 보고 결정한다.
    Toad for Oracle의 스키마 브라우저 -> Columns의 Data Type 탭에서 확인

    REGION_ID 의 Data Type이 NUMBER이므로 자바에서는 int
    REGION_NAME은 VARCHAR이므로 String 으로 VO 생성

    package blog.naver.com.hr.vo;
    
    public class RegionsVO {
    	
    	private int regionId;
    	private String regionName;
    	
    	public int getRegionId() {
    		return regionId;
    	}
    	public void setRegionId(int regionId) {
    		this.regionId = regionId;
    	}
    	public String getRegionName() {
    		return regionName;
    	}
    	public void setRegionName(String regionName) {
    		this.regionName = regionName;
    	}	
    }
    

    RegionsVO 클래스. Region 칼럼의 row 정보를 제어

    이와 마찬가지로 CountriesVO를 생성한다. 이때 Regions 테이블과 JOIN 시키기 위해 RegionsVO 객체를 CountriesVO 객체의 멤버로 넣는다. CountriesVO 객체에 Countries 테이블의 정보와 Regions 테이블의 정보를 JOIN한 row의 결과를 담는 것과 같은 의미를 갖는다.

    package blog.naver.com.hr.vo;
    
    public class CountriesVO {
    	
    	private String countryId;
    	private String countryName;
    	private int regionId;
    	
    	private RegionsVO regionVO;
    
    	public String getCountryId() {
    		return countryId;
    	}
    
    	public void setCountryId(String countryId) {
    		this.countryId = countryId;
    	}
    
    	public String getCountryName() {
    		return countryName;
    	}
    
    	public void setCountryName(String countryName) {
    		this.countryName = countryName;
    	}
    
    	public int getRegionId() {
    		return regionId;
    	}
    
    	public void setRegionId(int regionId) {
    		this.regionId = regionId;
    	}
    
    	public RegionsVO getRegionVO() {
    		if(regionVO == null)
    			regionVO = new RegionsVO();
    		return regionVO;
    	}
    
    	public void setRegionVO(RegionsVO regionVO) {
    		this.regionVO = regionVO;
    	}
    }
    
    

    CountriesVO 클래스. setter와 getter를 생성한다.
    모든 getter, setter는 자동으로 생성된 것을 사용하면 되지만 조인하는 클래스 객체는 객체가 null인지 확인을 해주는 절차를 거쳐야 한다. 이는 dao 클래스에서 발생할 수 있는 NullPointerException을 예방하기 위함이다.
    예제에서는 RegionsVO 객체를 private 멤버로 갖고 있기 때문에
    getRegionVO 메소드에서 해당 객체가 null이라면 new 키워드를 통해 객체 할당을 하도록 한다.

    package blog.naver.com.hr.vo;
    
    public class RegionsVO {
    	
    	private int regionId;
    	private String regionName;
    	
    	public int getRegionId() {
    		return regionId;
    	}
    	public void setRegionId(int regionId) {
    		this.regionId = regionId;
    	}
    	public String getRegionName() {
    		return regionName;
    	}
    	public void setRegionName(String regionName) {
    		this.regionName = regionName;
    	}
    }
    

    RegionsVO 클래스

    2. DAO 생성 
    DAO는 Data Access Object의 약어이다. 데이터 접근 객체라는 의미로 실제 데이터 객체에 접근하는 역할을 하는 클래스이다. 

    package blog.naver.com.hr.dao;
    
    import java.util.List;
    
    import blog.naver.com.hr.vo.CountriesVO;
    import blog.naver.com.hr.vo.RegionVO;
    
    
    public interface HRDao {
    	
    	public List getCountriesWithRegions();
    
    }
    
    

    HRDao 인터페이스. CountryVO 리스트를 리턴하는 함수를 선언해 놓는다.

    package blog.naver.com.hr.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import blog.naver.com.hr.vo.CountriesVO;
    import blog.naver.com.hr.vo.RegionsVO;
    
    public class HRDaoImpl implements HRDao {
    
    @Override
    	public List getCountriesWithRegions() {
    		// 1. 오라클 드라이버 생성
    		try {
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    		} catch (ClassNotFoundException e) {
    			System.out.println("오라클 드라이버 생성 실패");
    		}
    		
    		// 2. 오라클 인스턴스 객체 생성
    		Connection conn = null;
    		PreparedStatement stmt = null;
    		ResultSet rs = null;
    		
    		// 3. 오라클 인스턴스 생성
    		String url = "jdbc:oracle:thin:@localhost:1521:XE";
    		
    		try {
    			conn = DriverManager.getConnection(url, "HR", "minwoohi1!");
    			
            // 4. 쿼리 실행
    			String query = "SELECT  C.COUNTRY_ID " + // string
    					"        , C.COUNTRY_NAME " + // string
    					"        , C.REGION_ID " + // int
    					"        , R.REGION_ID R_REGION_ID " + // int
    					"        , R.REGION_NAME " + // string
    					"FROM    COUNTRIES C " +
    					"        , REGIONS R " +
    					"WHERE   C.REGION_ID = R.REGION_ID "; 
    			
    			// 자바에서 쿼리 실행할 수 있는 stmt 객체 생성
    			stmt = conn.prepareStatement(query);
    			
    			// 5. 쿼리를 실행해 결과 rs에 담아 리턴
    			rs = stmt.executeQuery();
    			
    			List countriesList = new ArrayList();
    			
    			CountriesVO countryVO = null;
    			
    			while(rs.next()){
    				countryVO = new CountriesVO();
    				
    				countryVO.setCountryId(rs.getString("COUNTRY_ID"));
    				countryVO.setCountryName(rs.getString("COUNTRY_NAME"));
    				countryVO.setRegionId(rs.getInt("REGION_ID"));
    				countryVO.getRegionVO().setRegionId(rs.getInt("R_REGION_ID"));
    				countryVO.getRegionVO().setRegionName(rs.getString("REGION_NAME"));
    				
    				countriesList.add(countryVO);
    				
    			}
    			
    			return countriesList;
    			
    		} catch (SQLException e) {
    			return null;
    		} finally{
    			if(rs != null){
    				try{
    					rs.close();
    				} catch(SQLException e){}
    			}
    			if(stmt != null){
    				try{
    					stmt.close();
    				} catch(SQLException e){}
    			}
    			if(conn != null){
    				try{
    					conn.close();
    				} catch(SQLException e){}
    			}
    		}
    	}
    }
    

    HRDaoImpl 클래스. 인터페이스의 구현부를 정의해놓음. 데이터베이스로부터 쿼리문을 생성해 받아오는 가장 기본적 과정.

    3. Biz 인터페이스와 클래스를 생성해준다.
    Biz는 bisuness의 줄임말로 DAO에서 데이터를 받거나 처리하는 로직을 
    의미한다.

    package blog.naver.com.hr.biz;
    
    import java.util.List;
    
    import blog.naver.com.hr.vo.CountriesVO;
    import blog.naver.com.hr.vo.RegionsVO;
    
    public interface HRBiz {
    	public void printCountriesWithRegions();	
    }
    

    HRBiz 인터페이스. 

    package blog.naver.com.hr.biz;
    
    import java.util.List;
    
    import blog.naver.com.hr.dao.HRDao;
    import blog.naver.com.hr.dao.HRDaoImpl;
    import blog.naver.com.hr.vo.CountriesVO;
    import blog.naver.com.hr.vo.RegionsVO;
    
    
    public class HRBizImpl implements HRBiz {
    
    	HRDao hrDao;
    
    	public HRBizImpl() {
    		hrDao = new HRDaoImpl();
    	}
    
    @Override
    	public void printCountriesWithRegions() {
    		List countriesList = hrDao.getCountriesWithRegions();
    		
    		for(CountriesVO country : countriesList){
    			System.out.printf("%s\t%s\t%d\t%d\t%s\n", country.getCountryId(), country.getCountryName(), country.getRegionId()
    					, country.getRegionVO().getRegionId(), country.getRegionVO().getRegionName());
    		}
    	}
    }
    

    HRBizImpl 클래스. HRBiz 인터페이스 구현부. HRDaoImpl 클래스에서 CountriesVO 리스트를 받아와 하나하나 출력해줌

    4. Controller 작성. 메인 메소드 역할을 하며 Biz 객체 생성을 통해 원하는 메소드를 호출한다.

    package blog.naver.com.hr;
    
    import blog.naver.com.hr.biz.HRBiz;
    import blog.naver.com.hr.biz.HRBizImpl;
    
    public class Main {
    
    	public void start() {
    		HRBiz hrBiz = new HRBizImpl();
    		hrBiz.printCountriesWithRegions();
    	}
    
    	public static void main(String[] args) {
    
    		new Main().start();
    
    	}
    }

    Main 클래스

    실행시키면 결과가 잘 나온다.




    'Database > 컨셉 , 예제' 카테고리의 다른 글

    (jdbc) DaoImpl 코드 패턴  (0) 2018.08.29
Designed by Tistory.