개발자 미니민의 개발스터디

[JAVA] JDBC 성적문제 (1) (DTO/DAO 인터페이스+구현)

by mini_min

🔒 ScoreDTO

DTO : Data Transfer Object = 데이터 전송 객체

개터 세터를 만든다.

public class ScoreDTO {
	private String hak;
	private String name;
	private String birth;
	private int kor;
	private int eng;
	private int mat;
	private int tot;
	private int ave;
	private int rank;
	
	public String getHak() {
		return hak;
	}
	public void setHak(String hak) {
		this.hak = hak;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
        
        //이하생략

 

 

🔒 ScoreDAO

인터페이스다! 

DAO : Data Access Object : 데이터 접근 목적으로 하는 객체

(DB 작업하는 클래스이다.)

 

// CRUD : Create, Retrieve, Update, Delete 
// : INSERT, SELECT, UPDATE, DELETE 작업

public interface ScoreDAO {

	public int insertScore(ScoreDTO dto) throws SQLException;
    // 삽입 SQL을 위한 인터페이스
	public int updateScore(ScoreDTO dto) throws SQLException;
    // 수정 SQL을 위한 인터페이스
	public int deleteScore(String hak) throws SQLException;
    // 삭제 SQL을 위한 인터페이스
    
    public ScoreDTO readScore(String hak) ; //DTO 에서 학번을 통해 데이터를 읽어온다.
    public List<ScoreDTO> listScore() ; // 전체 데이터 리스트를 가져온다.
    public List<ScoreDTO> listScore(String name) ; // 이름을 검색한다.
    
}

 

 

🔒 ScoreDAOImpl

ScoreDAO 인터페이스를 구현한 클래스이다.

public class ScoreDAOImpl implements ScoreDAO{
		private Connection conn = DBConn.getConnection(); }
💡 DB 에 접근할 수 있는 커넥션 객체를 선언한다! (필수)

 

📓 insertScore(ScoreDTO dto) 

@Override
	public int insertScore(ScoreDTO dto) throws SQLException {
		int result =0;
		Statement stmt = null;
		String sql;
		
		try {
			sql = "INSERT INTO score(hak, name, birth, kor, eng, mat) VALUES ("
					+ " '" + dto.getHak() + "', "
					+ " '" + dto.getName() + "', "
					+ " '" + dto.getBirth() + "', "
					+ dto.getKor()+ ", "
					+ dto.getEng()+ ", "
					+ dto.getMat()+ ") ";
			
			stmt = conn.createStatement();
			
			//SELECT 제외한 INSERT, UPDATE, DELETE 실행
			result = stmt.executeUpdate(sql);
💡 INSERT / UPDATE / DELETE 실행을 위해서 Statement 인터페이스가 필요함. 

 

⭐ 예외처리

-- 기본키 위반 제약

-- 기타 에러 코드 설정하기

⚡ 각각의 catch 에서 예외를 던져야 ui 쪽에 예외로 넘어간다.

} catch (SQLIntegrityConstraintViolationException e) {
				//기본키 제약 위반, not null 등의 제약 위반 - 무결성 제약 위반시 발생
			if(e.getErrorCode() == 1) {
				System.out.println("학번 중복으로 등록이 불가능합니다.");	
			}else if (e.getErrorCode() == 1400) {
				System.out.println("필수 입력 사항을 입력 하지 않았습니다.");
			}else {
				System.out.println(e.toString());
			}
			throw e;
			//예외 던져야지 ui 쪽에 예외쪽으로 넘어간다. 
			
		} catch (SQLDataException e) {
			// 날짜등의 형식잘못으로 인한 예외
			if(e.getErrorCode() == 1840 || e.getErrorCode()==1861) {
				System.out.println("날짜 입력 형식 오류입니다.");
			}else {
				System.out.println(e.toString());
			}
			throw e;
			
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw e;
			
		} finally {
			//모든 리소스는 실행이 끝나면 닫아야함
			if(stmt != null) {
				try {
					stmt.close();
				} catch (Exception e2) {
				}
			}
		}
		
		return result;
	}

 

 

📓 updateScore(ScoreDTO dto)

@Override
	public int updateScore(ScoreDTO dto) throws SQLException {
		int result = 0;
		Statement stmt = null;
		String sql;
		
		try {
			
			sql ="UPDATE score SET name = '" + dto.getName() + "',"
					+ " birth = '" + dto.getBirth() + "', " 
					+ " kor = " + dto.getKor() + ", " 
					+ " eng = " + dto.getEng() + ", " 
					+ " mat = " + dto.getMat()
					+ " WHERE hak = '" + dto.getHak()+ "' ";
			
			stmt = conn.createStatement();
			result = stmt.executeUpdate(sql);
            
            
            } catch (SQLIntegrityConstraintViolationException e) {
			if(e.getErrorCode()==1400) {
				System.out.println("필수 입력 사항을 입력하세요");
			}else {
				System.out.println(e.toString());
			}
			
			throw e;
			
		} catch (SQLDataException e) {
			if(e.getErrorCode() ==1840||e.getErrorCode()==1861) {
				System.out.println("날짜 형식 오류입니다.");
			}else {
				System.out.println(e.toString());
			}
			
			throw e;
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw e;
			
		}finally {
			if(stmt != null) {
				try {
					stmt.close();
				} catch (Exception e2) {
				}
			}
			
		}
		
		
		return result;
	}
💡 INSERT 인터페이스 구현 클래스와 비슷하다. UPDATE 문법 잘 기억하기!

 

 

📓 readScore(String hak)

// LIST 가 아닌 점. 학번이 기본키라 많아야 한 명이라서 ScoreDTO.

ScoreDTO dto = null;
		Statement stmt = null;
		ResultSet rs = null;
		String sql;
		
		try {
			
			sql = "SELECT hak, name, birth, kor, eng, mat, (kor+eng+mat) tot, "
					+ " (kor+eng+mat)/3 ave "
					+ " FROM score "
					+ " WHERE hak = '" + hak + "' ";
			
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			
			if(rs.next()) {
				dto = new ScoreDTO();
				
				dto.setHak(rs.getString("hak"));
				dto.setName(rs.getString("name"));
				dto.setBirth(rs.getDate("birth").toString());
				//시분초 까지 다 출력하지 않으려고 위에 처럼 코드 짠다.
				dto.setKor(rs.getInt("kor"));
				dto.setEng(rs.getInt("eng"));
				dto.setMat(rs.getInt("mat"));
				dto.setTot(rs.getInt("tot"));
				dto.setAve(rs.getInt("ave"));
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(rs != null) {
				try {
					rs.close();
				} catch (Exception e2) {
				}
			}
			
			if(stmt != null) {
				try {
					stmt.close();
				} catch (Exception e2) {
				}
			}
		}
		return dto;
	}
💡 SELECT 문을 사용하기 위해서 Statement 인터페이스 뿐만 아니라 ResultSet 인터페이스도 사용
= while 문에서 돌리기 위해서 !

SQL 문에서 WHERE 조건이 되는 학번은, 입력받은 학번을 사용해야하므로, 'hak ' 으로 그대로 값을 준다. 

 

 

📓 List<ScoreDTO> listScore()

: 전체 데이터를 출력하기 위해서 arraylist 객체를 생성!

@Override
	public List<ScoreDTO> listScore() {
		List<ScoreDTO> list = new ArrayList<>();
		Statement stmt = null;
		ResultSet rs = null;
		String sql;

		try {
			// 전체 리스트
			// SELECT 컬럼, 컬럼 FROM 테이블
			sql = "SELECT hak, name, TO_CHAR(birth, 'YYYY-MM-DD')birth, "
					+ " kor, eng, mat, (kor+eng+mat) tot, (kor+eng+mat)/3 ave, "
					+ "RANK() OVER(ORDER BY (kor+eng+mat) DESC) rank " + " FROM score";

			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);

			// score 테이블의 모든 레코드를 읽어 list 객체에 저장
			while (rs.next()) {
				ScoreDTO dto = new ScoreDTO();

				dto.setHak(rs.getString("hak"));
				dto.setName(rs.getString("name"));
				dto.setBirth(rs.getString("birth"));
				dto.setKor(rs.getInt("kor"));
				dto.setEng(rs.getInt("eng"));
				dto.setMat(rs.getInt("mat"));
				dto.setTot(rs.getInt("tot"));
				dto.setAve(rs.getInt("ave"));
				dto.setRank(rs.getInt("rank"));

				list.add(dto);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (rs != null) {
				try {
					stmt.close();
				} catch (Exception e2) {
				}
			}

			if (stmt != null) {
				try {
					stmt.close();
				} catch (Exception e2) {
					// TODO: handle exception
				}
			}
		}

		return list;
	}
💡 sql 의 SELECT 문을 실행하여 나온 결과를 rs 에 저장
이후 while 문에 실행하는데 새로운 dto 객체를 만들어서 값을 반복해서 저장 -> list 객체에 add 한다.

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기