AWS CLOUD FRAMEWORK/Java
[Day21] product
JWJ_Hub
2023. 4. 12. 00:01
Main
package product;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
// 전체목록 (고유번호 순으로 출력이 기본값, 정렬되면 다른 순서로 출력)
// 검색 (이름으로 검색, 포함된다면 모두 출력)
// 추가 (상품등록)
// 수정 (상품수량 및 가격 수정)
// 삭제 (등록된 상품 코드 제거)
// 정렬 (날짜순 정렬, 고유번호 순 정렬, 수량 기준 정렬)
// 종료
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ProductDAO dao = new ProductDAO();
ProductDTO tmp = null;
ArrayList<ProductDTO> list;
int menu, row, idx;
String keyword, key, value;
HashMap<String, String> map = new HashMap<String, String>();
map.put("상품번호", "idx");
map.put("상품이름", "name");
map.put("상품가격", "price");
map.put("유통기한", "expiryDate");
map.put("상품설명", "memo");
String order = map.get("상품번호");
boolean desc = false;
while(true) {
System.out.println("1. 전체목록");
System.out.println("2. 검색");
System.out.println("3. 추가");
System.out.println("4. 수정");
System.out.println("5. 삭제");
System.out.println("6. 정렬");
System.out.println("0. 종료");
System.out.print("선택 >>> ");
menu = Integer.parseInt(sc.nextLine());
switch(menu) {
case 1:
list = dao.selectAll(order, desc);
list.forEach(dto -> System.out.println(dto));
break;
case 2:
System.out.print("검색어를 입력 : ");
keyword = sc.nextLine();
// select * from product where name like '%keyword%'
list = dao.select(keyword);
list.forEach(dto -> System.out.println(dto));
break;
case 3:
// dao.insert(idx, name, price, expiryDate, memo);
System.out.println("신규 상품을 생성합니다");
tmp = useBean(sc);
row = dao.insert(tmp);
System.out.println(row != 0 ? "추가 성공" : "추가 실패");
break;
case 4:
System.out.println("기존 상품을 수정합니다");
tmp = useBean(sc);
row = dao.update(tmp);
System.out.println(row != 0 ? "수정 성공" : "수정 실패");
break;
case 5: // 상품의 번호를 입력받아서 해당 상품을 삭제하기
System.out.print("삭제할 상품의 번호 입력 : ");
idx = Integer.parseInt(sc.nextLine());
row = dao.delete(idx);
System.out.println(row != 0 ? "삭제 성공" : "삭제 실패");
break;
case 6:
System.out.println(new ArrayList<>(map.keySet()));
System.out.print("정렬 기준 선택 : ");
key = sc.nextLine();
value = map.get(key);
if(value != null) {
order = value;
}
System.out.print("내림차순? ");
desc = Boolean.parseBoolean(sc.nextLine());
break;
case 0:
sc.close();
return;
}
} // end of while
} // end of main
// 추가에서도 활용하고, 수정에서도 활용한다 (코드의 재활용, 함수)
static ProductDTO useBean(Scanner sc) {
ProductDTO dto = new ProductDTO();
System.out.print("상품 번호 : ");
dto.setIdx(Integer.parseInt(sc.nextLine()));
System.out.print("상품 이름 : ");
dto.setName(sc.nextLine());
System.out.print("상품 가격 : ");
dto.setPrice(Integer.parseInt(sc.nextLine()));
try {
// <input type="date" value="2023-04-11">
System.out.print("유통기한 (yyyy-MM-dd) : ");
// java.util.Date <-> java.lang.String
// String result = sdf.format(date);
// Date result = sdf.parse(string);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String inputDate = sc.nextLine(); // 문자열로 입력받는다
java.util.Date date = sdf.parse(inputDate); // 문자열에서 서식에 맞는 java.util.Date로 변환
dto.setExpiryDate(new Date(date.getTime()));// java.util.Date의 long을 추출하여 sql.Date로 변환
} catch (ParseException e) {
e.printStackTrace();
}
System.out.print("상품 설명 : ");
dto.setMemo(sc.nextLine());
return dto;
}
} // end of class
ProductDAO
package product;
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 oracle.jdbc.driver.OracleDriver;
public class ProductDAO { // Database Access Object
private Connection conn;
private PreparedStatement pstmt; // Statement의 subclass
private ResultSet rs;
private String url = "jdbc:oracle:thin:@192.168.1.100:1521:xe";
private String user = "c##itbank";
private String password = "it";
private String className = OracleDriver.class.getName();
public ProductDAO() {
try {
Class.forName(className);
} catch(ClassNotFoundException e) {
System.err.println("DAO 생성자 예외 발생 : " + e);
}
}
public ArrayList<ProductDTO> selectAll(String order, boolean desc) {
ArrayList<ProductDTO> list = new ArrayList<ProductDTO>();
String sql = "select * from product order by " + order;
if(desc) {
sql += " desc";
}
System.out.println("SQL > " + sql);
// conn -> pstmt -> rs -> while -> list.add(ob) -> close -> return
try {
conn = DriverManager.getConnection(url, user, password);
pstmt = conn.prepareStatement(sql); // sql을 미리 넣어둔다
rs = pstmt.executeQuery(); // 미리 넣었으니 여기서는 sql을 지정하지 않는다
while(rs.next()) {
ProductDTO dto = new ProductDTO();
dto.setIdx(rs.getInt("idx"));
dto.setName(rs.getString("name"));
dto.setPrice(rs.getInt("price"));
dto.setExpiryDate(rs.getDate("expiryDate"));
dto.setMemo(rs.getString("memo"));
list.add(dto);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try { if(rs != null) rs.close(); } catch(Exception e) {}
try { if(pstmt != null) pstmt.close(); } catch(Exception e) {}
try { if(conn != null) conn.close(); } catch(Exception e) {}
}
return list;
}
public ArrayList<ProductDTO> select(String keyword) {
ArrayList<ProductDTO> list = new ArrayList<ProductDTO>();
// String sql = "select * from product where name like '%" + keyword + "%'";
String sql = "select * from product where name like '%%%s%%'";
sql = String.format(sql, keyword); // printf에서 %를 출력하고 싶으면 %%를 사용한다
try {
conn = DriverManager.getConnection(url, user, password);
pstmt = conn.prepareStatement(sql); // sql을 미리 넣어둔다
rs = pstmt.executeQuery(); // 미리 넣었으니 여기서는 sql을 지정하지 않는다
while(rs.next()) {
ProductDTO dto = new ProductDTO();
dto.setIdx(rs.getInt("idx"));
dto.setName(rs.getString("name"));
dto.setPrice(rs.getInt("price"));
dto.setExpiryDate(rs.getDate("expiryDate"));
dto.setMemo(rs.getString("memo"));
list.add(dto);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try { if(rs != null) rs.close(); } catch(Exception e) {}
try { if(pstmt != null) pstmt.close(); } catch(Exception e) {}
try { if(conn != null) conn.close(); } catch(Exception e) {}
}
return list;
}
public int insert(ProductDTO dto) {
int row = 0;
String sql = "insert into product values (?, ?, ?, ?, ?)";
try {
conn = DriverManager.getConnection(url, user, password);
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, dto.getIdx()); // 1번째 물음표에 idx를 설정한다. 숫자이므로 따옴표가 없다
pstmt.setString(2, dto.getName()); // 2번째 물음표에 name을 설정한다. 문자열이므로 따옴표를 작성해준다
pstmt.setInt(3, dto.getPrice());
pstmt.setDate(4, dto.getExpiryDate());
pstmt.setString(5, dto.getMemo());
row = pstmt.executeUpdate(); // executeQuery()는 ResultSet을 반환한다 (select)
// executeUpdate()는 int를 반환한다 (insert, update, delete)
} catch (SQLException e) {
e.printStackTrace();
} finally {
try { if(rs != null) rs.close(); } catch(Exception e) {}
try { if(pstmt != null) pstmt.close(); } catch(Exception e) {}
try { if(conn != null) conn.close(); } catch(Exception e) {}
}
return row;
}
public int update(ProductDTO tmp) {
int row = 0;
String sql = "update product set name=?, price=?, expiryDate=?, memo=? where idx=?";
try {
conn = DriverManager.getConnection(url, user, password);
pstmt = conn.prepareStatement(sql);
// pstmt.set???(1, tmp.get???);
pstmt.setString(1, tmp.getName());
pstmt.setInt(2, tmp.getPrice());
pstmt.setDate(3, tmp.getExpiryDate());
pstmt.setString(4, tmp.getMemo());
pstmt.setInt(5, tmp.getIdx());
row = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try { if(rs != null) rs.close(); } catch(Exception e) {}
try { if(pstmt != null) pstmt.close(); } catch(Exception e) {}
try { if(conn != null) conn.close(); } catch(Exception e) {}
}
return row;
}
public int delete(int idx) {
int row = 0;
String sql = "delete product where idx=?";
try {
conn = DriverManager.getConnection(url, user, password);
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, idx);
// conn.setAutoCommit(false); // 해당 연결의 자동 커밋을 수행하지 않게 한다
// jdbc의 오토 커밋 기본값은 true이다
row = pstmt.executeUpdate();
// conn.commit(); // conn에서 커밋을 수행하거나 롤백을 수행할 수도 있다
// conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try { if(rs != null) rs.close(); } catch(Exception e) {}
try { if(pstmt != null) pstmt.close(); } catch(Exception e) {}
try { if(conn != null) conn.close(); } catch(Exception e) {}
}
return row;
}
}
ProductDTO
package product;
import java.sql.Date;
/*
create table product (
idx number,
name varchar2(100),
price number,
expiryDate date,
memo varchar2(2000)
);
*/
public class ProductDTO {
// java.util.Date : 자바에서 사용하는 기본 날짜 타입 (super)
// java.sql.Date : 오라클 및 다른 DB에서 불러오는 날짜 타입 (sub)
// java.sql.Date extends java.util.Date
private int idx;
private String name;
private int price;
private Date expiryDate;
private String memo;
@Override
public String toString() {
return String.format("%s) %s, %,d, %s, %s",
idx, name, price, expiryDate, memo);
}
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public Date getExpiryDate() {
return expiryDate;
}
public void setExpiryDate(Date expiryDate) {
this.expiryDate = expiryDate;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
}