public void modifyLunch() { // 유효성 검증 : 도시락명, 가격, 특장점이 ""이 아닐 때, 가격은 숫자인지, // 이미지가 변경되지 않았는지(변경 안되었다면 다시 올릴 필요가 없음), // 변경되었다면 s_가 붙은 이미지가 존재하는 이미지인지 검증(검증 완료 후 업데이트 처리) JTextField tfName = ldv.getJtfLunchName(); JTextField tfPrice = ldv.getJtfLunchPrice(); JTextArea taSpec = ldv.getJtaLunchSpec(); if(tfName.getText().trim().equals("")) { tfName.setText(""); JOptionPane.showMessageDialog(ldv, "도시락명을 입력해주세요."); tfName.requestFocus(); return; } if(tfPrice.getText().trim().equals("")) { tfPrice.setText(""); JOptionPane.showMessageDialog(ldv, "도시락의 가격을 입력해주세요."); tfPrice.requestFocus(); return; } if(taSpec.getText().trim().equals("")) { taSpec.setText(""); JOptionPane.showMessageDialog(ldv, "도시락의 특장점을 입력해주세요."); taSpec.requestFocus(); return; } int price = 0; try { price = Integer.parseInt(tfPrice.getText().trim()); } catch (NumberFormatException nfe) { tfPrice.setText(""); JOptionPane.showMessageDialog(ldv, "도시락 가격은 숫자만 입력가능합니다."); tfPrice.requestFocus(); return; } // 선택한 이미지 파일과 접두사 s_를 가진 동일한 이미지파일이 없는 경우 // ->이미지 작업이 되어있지 않은 경우. uploadImage를 사용 if (!uploadImage.equals("")) { // 이미지 변경을 수행한 경우 File tempFile = new File(uploadImage); // 큰 이미지 File smallFile = new File(tempFile.getParent()+"/s_"+tempFile.getName()); // 작은 이미지 if (!smallFile.exists()) { JOptionPane.showMessageDialog(ldv, "선택하신 파일은 작은 이미지가 존재하지 않습니다."); uploadImage = ""; return; } } ...}
// 위 pstmt에 값을 넣는 코드는 이렇게 줄일 수 있다.int index = 4;if (!luvo.getImg().equals("")) { pstmt.setString(index++, luvo.getImg());}pstmt.setString(index, luvo.getLunchCode());
중복된 기능을 하는 method들은 utility 패키지를 새로 만들어서 같이 모아 관리하는게 좋음
예를 들어 AddController와 DetailController 둘 다 사용된 uploadImg 메소드
public void uploadImg(File file) throws IOException { FileInputStream fis = null; FileOutputStream fos = null; try { // 큰 이미지 업로드 fis = new FileInputStream(file); byte[] readData = new byte[512]; int len = 0; String uploadPath = "C:/Users/owner/youngRepositories/SSangYoung/dev/workspace/lunch_prj/src/kr/co/sist/lunch/admin/img/"; fos = new FileOutputStream(new File(uploadPath+file.getName())); while((len = fis.read(readData)) != -1) { fos.write(readData, 0, len); fos.flush(); } fis.close(); fos.close(); // 작은 이미지 업로드 fis = new FileInputStream(file.getParent()+"/s_"+file.getName()); len = 0; fos = new FileOutputStream(new File(uploadPath+"s_"+file.getName())); while((len = fis.read(readData)) != -1) { fos.write(readData, 0, len); fos.flush(); } } finally { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } }}
정산을 위한 쿼리작성
-- 다음과 같은 결과를 보여주는 쿼리를 작성하시오-- 포크칠리, L_00000001, 총 판매수량 4, 총액 18000-- 돈가스, L_00000002, 총 판매수량 1, 총액 3800-- 내가 짠 쿼리SELECT l.lunch_name, l.lunch_code, quan, o.quan*l.price totalFROM (SELECT lunch_code, sum(quan) quan FROM ordering GROUP BY lunch_code) o, lunch lWHERE o.lunch_code = l.lunch_code;-- 강사님이 짜신 쿼리SELECT l.lunch_name, l.lunch_code, sum(o.quan) total, sum(o.quan)*l.price priceFROM lunch l, ordering oWHERE o.lunch_code = l.lunch_code AND TO_CHAR(o.order_date, 'yyyy-mm-dd') = TO_CHAR(TO_DATE('2019-1-15', 'yyyy-mm-dd'), 'yyyy-mm-dd')GROUP BY l.lunch_code, l.lunch_name, l.priceORDER BY l.lunch_code;
자바에서 '2019-1-1'형태로 바인드변수가 들어가도 함수를 통해 '2019-01-01'형태로 바뀌어야 한다..
selectCalc.append(" SELECT l.lunch_name, l.lunch_code, sum(o.quan) total, sum(o.quan)*l.price price ").append(" FROM lunch l, ordering o ").append(" WHERE o.lunch_code = l.lunch_code ").append(" AND TO_CHAR(o.order_date, 'yyyy-mm-dd') = TO_CHAR(TO_DATE(?, 'yyyy-mm-dd'), 'yyyy-mm-dd') ").append(" GROUP BY l.lunch_code, l.lunch_name, l.price ").append(" ORDER BY l.lunch_code; ");
Swing 탭 클릭 이벤트 처리
@Overridepublic void mouseClicked(MouseEvent me) { if (me.getSource() == lmv.getJtb()) { // 탭에서 클릭이 발생했을 때만 if (lmv.getJtb().getSelectedIndex() == 1) { // 처음 탭에서 이벤트 발생 System.out.println("------"); // 수행할 내용 } }}