본문 바로가기

TIL/JDBC

[JDBC] DAO

이전 글에서 해준 것과 동일하게 config, lib, mapper 폴더 모두 복사하고

buil path에서 Jar들 추가해준 후, source탭에서 config폴더 선택 후 적용까지 한 상태.

 

이후 JDBCTemplate도 기존 패키지 생성 후 복사해준다. (JDBCTemplate 코드를 이해까지 하고 갖다 쓰기!! )

 

menu-query에서 마지막 메뉴코드 조회, 모든 카테고리 조회, 메뉴insert를 수행해주기 때문에 세가지의 키를 만들어준다.

 

1. selectLastMenuCode 조회

	public static void main(String[] args) {

		Connection con = getConnection();
		
		PreparedStatement pstmt1 = null;
		PreparedStatement pstmt2 = null;
		PreparedStatement pstmt3 = null;
		
		ResultSet rset1 = null;
		ResultSet rset2 = null;
		int result = 0;
		
		Properties prop = new Properties();
		
		int maxMenuCode = 0;
		
		try {
			prop.loadFromXML(new FileInputStream("mapper/menu-query.xml"));
			String query1 = prop.getProperty("selectLastMenuCode");
			String query2 = prop.getProperty("selectAllCategoryList");
			String query3 = prop.getProperty("insertMenu");
			
			pstmt1 = con.prepareStatement(query1);
			pstmt2 = con.prepareStatement(query2);
			pstmt3 = con.prepareStatement(query3);
			
			rset1 = pstmt1.executeQuery();
			
			if(rset1.next()) {
				maxMenuCode = rset1.getInt("MAX(A.MENU_CODE)");
			} 
			
			System.out.println("maxMenuCode : " + maxMenuCode);
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rset1);
			close(rset2);
			close(pstmt1);
			close(pstmt2);
			close(pstmt3);
			close(con);
		}
		
		
	}

}

 

2. selectAllCategoryList조회 (try-cath 바깥 구문에서 List변수 선언)

rset2 = pstmt2.executeQuery();
			
			categoryList = new ArrayList<>();
			while(rset2.next()) {
				Map<Integer, String> category = new HashMap<>();
				
				category.put(rset2.getInt("CATEGORY_CODE"), rset2.getString("CATEGORY_NAME"));
				
				categoryList.add(category);
			}
			
			System.out.println("categoryList : " + categoryList);

 

3. insertMenu

			Scanner sc = new Scanner(System.in);
			System.out.print("등록할 메뉴의 이름을 입력하세요 : ");
			String menuName = sc.nextLine();
			System.out.print("신규 메뉴의 가격을 입력하세요 : ");
			int menuPrice = sc.nextInt();
			System.out.print("카테고리를 선택해주세요(식사, 음료, 디저트, 한식, 퓨전) : ");
			String categoryName = sc.next();
			System.out.print("바로 판매 메뉴에 적용하시겠습니까? (예/아니오) : ");
			String answer = sc.nextLine();
			
			int categoryCode = 0;
			switch(categoryName) {
			case "식사" : categoryCode = 1; break;
			case "음료" : categoryCode = 2; break;
			case "디저트" : categoryCode = 3; break;
			case "한식" : categoryCode = 4; break;
			case "퓨전" : categoryCode = 5; break;
			}
			
			String orderableStatus = "";
			switch(answer) {
			case "예" : orderableStatus = "Y"; break;
			case "아니오" : orderableStatus = "N"; break;
			}
            		pstmt3.setInt(1, maxMenuCode + 1); 
			pstmt3.setString(2, menuName);
			pstmt3.setInt(3, menuPrice);
			pstmt3.setInt(4, categoryCode);
			pstmt3.setString(5, orderableStatus);
			
			result = pstmt3.executeUpdate();

 

근데 Scanner로 입력 할 때 switch문으로 넣지 말고 바로 값을 입력할 수는 없나? 이렇게 저렇게 해봤는데 자바 기초가 부족해서인지 잘 되지 않는다.. 일단 강사님께 질문 남김

 

하나의 클래스에 코드를 순차적으로 적어버리면 오류를 확인하거나, 재활용 하기도 어렵다.

DAO클래스를 통해서 분리를 해 주자.

 

DAO(Database Access Object)

- 데이터베이스 접근용 객체
=> CRUD 연산을 담당하는 메소드들의 집합으로 이루어진 클래스이다.
 

1. selectLastMenuCode

 

실행 클래스에서 selectLastMenuCode메소드 불러와 출력함

	public static void main(String[] args) {
		
		MenuDAO menuDAO = new MenuDAO();
		
		Connection con = getConnection();
		
		/* 1. 메뉴의 마지막 번호 조회 */
		int maxMenuCode = menuDAO.selectLastMenuCode(con);
		System.out.println("maxMenuCode : " + maxMenuCode);
	}

}

 

MenuDAO 클래스

public class MenuDAO {

	private Properties prop = new Properties();
	
	public MenuDAO() {
		try {
			prop.loadFromXML(new FileInputStream("mapper/menu-query.xml"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public int selectLastMenuCode(Connection con) {
		
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		int maxMenuCode = 0;
		
		String query = prop.getProperty("selectLastMenuCode");
		
		try {
			pstmt = con.prepareStatement(query);
			rset = pstmt.executeQuery();
			
			if(rset.next()) {
				maxMenuCode = rset.getInt("MAX(A.MENU_CODE)");
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
			close(rset);
		}
		
		return maxMenuCode;
	}

}

 

2. 

MenuDAO 클래스 메소드 작성

	public List<Map<Integer, String>> selectAllCategory(Connection con) {
		
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		List<Map<Integer, String>> categoryList = null;
		
		String query = prop.getProperty("selectAllCategoryList");
		
		try {
			pstmt = con.prepareStatement(query);
			rset = pstmt.executeQuery();
			
			categoryList = new ArrayList<>();
			
			while(rset.next()) {
				Map<Integer, String> category = new HashMap<>();
				category.put(rset.getInt("CATEGORY_CODE"), rset.getString("CATEGORY_NAME"));
				
				categoryList.add(category);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
			close(rset);
		}
		
		return categoryList;
	}

실행 클래스에서 for문으로 하나씩 출력

		/* 2. 카데고리 조회 */
		List<Map<Integer,String>> categoryList = menuDAO.selectAllCategory(con);
		for(Map<Integer,String> category : categoryList) {
			System.out.println(category);
		}
	}

 

3. isnertMenu

DAO클래스

	public int insertNewMenu(Connection con, MenuDTO newMenu) {
		PreparedStatement pstmt = null;
		int result = 0;
		
		String query = prop.getProperty("insertMenu");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, newMenu.getCode());
			pstmt.setString(2, newMenu.getName());
			pstmt.setInt(3, newMenu.getPrice());
			pstmt.setInt(4, newMenu.getCategoryCode());
			pstmt.setString(5, newMenu.getOrderableStatus());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
		}
		
		return result;
	}

 

실행클래스

		/* 3. 신규 메뉴 등록
		 * 3-1. 신규 메뉴 등록을 위한 정보 입력 */
		Scanner sc = new Scanner(System.in);
		System.out.print("등록할 메뉴의 이름을 입력하세요 : ");
		String menuName = sc.nextLine();
		System.out.print("신규 메뉴의 가격을 입력하세요 : ");
		int menuPrice = sc.nextInt();
		System.out.print("카테고리를 선택해주세요(식사, 음료, 디저트, 한식, 퓨전) : ");
		sc.nextLine();
		String categoryName = sc.nextLine();
		System.out.print("바로 판매 메뉴에 적용하시겠습니까? (예/아니오) : ");
		String answer = sc.nextLine();
		
		/* 3-2. 신규 메뉴 등록을 위한 값 가공 */
		int menuCode = maxMenuCode + 1;
		
		int categoryCode = 0;
		switch(categoryName) {
		case "식사" : categoryCode = 1; break;
		case "음료" : categoryCode = 2; break;
		case "디저트" : categoryCode = 3; break;
		case "한식" : categoryCode = 4; break;
		case "퓨전" : categoryCode = 5; break;
		}
		
		String orderableStatus = "";
		switch(answer) {
		case "예" : orderableStatus = "Y"; break;
		case "아니오" : orderableStatus = "N"; break;
		}
		
		MenuDTO newMenu = new MenuDTO(menuCode, menuName, menuPrice, categoryCode, orderableStatus);
		
		/* 3-3. 신규 메뉴 등록을 위한 메소드 호출하여 등록 */
		int result = menuDAO.insertNewMenu(con, newMenu);
		
		if(result > 0) {
			System.out.println("신규 메뉴 등록에 성공하였습니다.");
		} else {
			System.out.println("신규 메뉴 등록에 실패하였습니다.");
		}
	}

 

출력문, 오라클 값 확인

'TIL > JDBC' 카테고리의 다른 글

[JDBC] DB모델링, ERD  (0) 2022.02.11
[JDBC] Controller, JUnit  (0) 2022.02.08
[JDBC] Transaction, Auto Commit, Service, View  (0) 2022.02.05
[JDBC] xml, injection, insert, update  (0) 2022.02.03
[JDBC] JDBC 개요(이클립스-오라클 연결)  (0) 2022.01.30