[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 한다.
'프로젝트 실습 > [Project] Score' 카테고리의 다른 글
[JAVA] JDBC 성적문제 (3) (이름검색/삭제) (0) | 2022.08.22 |
---|---|
[JAVA] JDBC 성적문제 (2) (UI 클래스 코드) (0) | 2022.08.21 |
[JAVA] 성적처리에서 자동으로 시스템 날짜 찍기 (0) | 2022.07.31 |
[JAVA] 성적처리에서 DateUtil (유효한 날짜 형식 찍기) (0) | 2022.07.31 |
[JAVA] 성적 처리 UI 작성 (만들기) 3차 (0) | 2022.07.31 |
블로그의 정보
개발자 미니민의 개발로그
mini_min