본문 바로가기
Servlet-Jsp

운동기록프로그램(servlet-jsp) #4

by 지민재 2022. 8. 9.
반응형
SMALL
ErpDao 클래스 추가 
추가 / 수정 / 삭제 / 목록조회 
package dao;

import java.util.List;
import service.ErpException;
import dto.ErpDto;

public class ErpDao {
	//추가
	public void register(ErpDto erpdto) {
		
	}
	
	//수정
	public void update(ErpDto erpdto) {
		
	}
	
	//삭제
	public void delete(ErpDto erpdto) {
		delete(erpdto.getId());
	}
	
	public void delete(int id) {
		
	}
	
	//목록 조회
	public List<ErpDto> gets(){
		
		return null;
	}
}
return null; 은 일단 테스트하면서 하기 위해서 에러 안뜨게하려고 반환값을 임의로 지정하였다.
삭제 부분은 id 값만 알면 되기 때문에 int id를 매개변수로 받은 메서드를 하나 더 정의하여 넘겨주었다.

 

WRService
package service;

import javax.servlet.http.HttpServletRequest;

import dao.ErpDao;
import dto.ErpDto;
import constants.Sports;

public class WRService {
	
	public void process(HttpServletRequest request) {
		/** 데이터 유효성 검사 S */
		
		String sports = request.getParameter("sports");
		String sportNm = request.getParameter("sportNm");
		int workoutSet = Integer.parseInt(request.getParameter("workoutSet"));
		int workoutNum = Integer.parseInt(request.getParameter("workoutNum"));
		
		if(sports == null || sports.trim().isEmpty()) {
			throw new ErpException("운동 한 부위를 선택하세요");
		}
		if(sportNm == null || sportNm.trim().isEmpty()){
			throw new ErpException("운동 종목을 입력 하세요");
		}
		
		if(workoutSet == 0){
			throw new ErpException("세트 수 를 입력하세요");
		}
		
		if(workoutNum == 0){
			throw new ErpException("횟수를 입력하세요");
		}
		
		/** 데이터 유효성 검사 E */
		
		/** 등록 처리 */
		ErpDto erpdto = new ErpDto();
		erpdto.setSports(Enum.valueOf(Sports.class, sports));
		erpdto.setSportNm(sportNm);
		erpdto.setWorkoutSet(workoutSet);
		erpdto.setWorkoutNum(workoutNum);
		
		ErpDao erpdao = new ErpDao();
		erpdao.register(erpdto);
	}
}
자바 문서를 보면 ENUM 클래스에 문자를 가지고 찾는 메서드가 있는데 valueOf() 이다.
 매개변수를 보면 Enum클래스에 이름값만 입력하면 되고 나머지 부분은  register 에 erpdto 데이터를 받아서 디비 처리하는 로직이다. 

 

이제 register 기능을 구현해보자 ErpDao 로 가서 Connection 객체를 생성하였다.
//Connection 객체
	public Connection getConnection() throws ClassNotFoundException, SQLException{
		Class.forName("com.mysql.cj.jdbc.Driver");
		
		String url = "jdbc:mysql://localhost:3306/erp?user=root&password=als@1655119";
		Connection conn = DriverManager.getConnection(url);
		
		return conn;
		
	}

 

register 
//추가
	public void register(ErpDto erpdto) {
		
		String sql = "INSERT INTO works (sports, sportNm, workoutSet, workoutNum) VALUES(?,?,?,?)";
		try(Connection conn = getConnection();
				PreparedStatement pstmt = conn.prepareStatement(sql)) {
				pstmt.setString(1, erpdto.getSports().toString());
				pstmt.setString(2, erpdto.getSportNm());
				pstmt.setInt(3, erpdto.getWorkoutSet());
				pstmt.setInt(4, erpdto.getWorkoutNum());
				
				pstmt.executeUpdate();
				
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
			throw new ErpException("등록에 실패하였습니다.");
		}
	}
update
//수정
	public void update(ErpDto erpdto) {
		
		String sql = "UPDATE works" +
					 " SET " +
					 " 		sports = ? " +
					 " 		sportNm = ? " +
					 "  	workoutSet = ? " +
					 "   	workoutNum = ? " +
					 " WHERE id = ?";
		try(Connection conn = getConnection();
				PreparedStatement pstmt = conn.prepareStatement(sql)){
						
				pstmt.setString(1, erpdto.getSports().toString());
				pstmt.setString(2, erpdto.getSportNm());
				pstmt.setInt(3, erpdto.getWorkoutSet());
				pstmt.setInt(4, erpdto.getWorkoutNum());
				pstmt.setInt(5, erpdto.getId());
				
				pstmt.executeUpdate();
			
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
			throw new ErpException("수정에 실패하였습니다.");
		}
	}

 

delete
//삭제
public void delete(ErpDto erpdto) {
		delete(erpdto.getId());
	}
	
	public void delete(int id) {
		String sql ="DELETE FROM works WHERE id = ?";
		
		try(Connection conn = getConnection();
				
			PreparedStatement pstmt = conn.prepareStatement(sql)) {
			pstmt.setInt(1, id);
			pstmt.executeUpdate();
			
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
			throw new ErpException("삭제에 실패하였습니다.");
		}
	}
삭제 부분은 기본키가 id 이므로 id만 삭제하면 된다.
List
//목록 조회
	public List<ErpDto> gets(){
		
		String sql = "SELECT * FROM works ORDER BY id DESC";
		
		List<ErpDto> list = new ArrayList<>();
		try(Connection conn = getConnection();
				PreparedStatement pstmt = conn.prepareStatement(sql)) {
			
			ResultSet rs = pstmt.executeQuery();
			Timestamp _modDt = rs.getTimestamp("modDt");
			while(rs.next()) {
				LocalDateTime modDt = null;
				if(_modDt != null) {
					modDt = _modDt.toLocalDateTime(); 
				}
				
				
			list.add(new ErpDto(
					rs.getInt("id"),
					Enum.valueOf(Sports.class, rs.getString("sports")),
					rs.getString("sportNm"),
					rs.getInt("workoutSet"),
					rs.getInt("workoutNum"),
					rs.getTimestamp("regDt").toLocalDateTime(),
					modDt
					));
			}
			rs.close();
			
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();	
		}
		return list;
	}
최신 작업순으로 조회
ResultSet 은 레코드를 한번에 가져오는게 아니라 각 레코드마다 이동하기 때문에 next()라는 메서드를 이용하자

자바 문서에서 ResultSet 을 검색해서 보자 아래 그림 참고
가 있다. 날짜와 시간데이터를 가져올 수 있다. 반환값이 Timestamp 값인데 날짜와 시간을 다룰 수 있는 클래스이다.  지금 필요한건  LocalDateTime 인데 Timestamp클래스를 클릭 후 보자 아래 그림 참고 
데이터베이스로 getRimerstamp 가져 온 후 toLocalDateTime 하게 되면 기존 Dto 클래스에 있던 toLocalDateTime  가 바뀐다. 
작업 내용 수정하려면 작업 id 에 해당하는 데이터를 가져와야해서 메서드를 하나 추가해봤다.
public ErpDto get(int id) {
		ErpDto erpdto = null;
		String sql = "SELECT * FROM works WHERE id = ?";
		try(Connection conn = getConnection();
				PreparedStatement pstmt = conn.prepareStatement(sql)) {
				
				ResultSet rs = pstmt.executeQuery();
				if(rs.next()) {
					LocalDateTime modDt = null;
					Timestamp _modDt = rs.getTimestamp("modDt");
					if(_modDt != null) {
						modDt = _modDt.toLocalDateTime(); 
					}
					erpdto = new ErpDto(
							rs.getInt("id"),
							Enum.valueOf(Sports.class, rs.getString("sports")),
							rs.getString("sportNm"),
							rs.getInt("workoutSet"),
							rs.getInt("workoutNum"),
							rs.getTimestamp("regDt").toLocalDateTime(),
							modDt
							);
					
				}
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();	
		}
		
		return erpdto;
		
	}

댓글