이전 글에서 해준 것과 동일하게 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 |