-
007. PreparedStatement / 성적 처리 프로그램 구현SsY/Class 2023. 5. 2. 10:10728x90
JDBC
- PreparedStatement 설명- PreparedStatement
■■■ PreparedStatement ■■■ 1. Statement 의 execute 메소드는 // 실무에서는 Statement 는 사용하지X(보안성 때문) 문자열로 구성된 SQL 구문을 DBMS 로 전달하는 역할을 수행하며, // 쿼리문을 중간에서 채갈 수 있기 때문 - 가장 러프한 작업객체 내부적으로 SQL 구문을 JDBC 드라이버가 읽을 수 있는 형식으로 전처리(precompile) 하게 된다. // 런타임 시에 실행 (작업객체 생성시 sql 전달) - 넘길때마다 precompile 이후 드라이버는 DBMS 에 전처리된 요구사항을 전송하게 되는데, SQL 구문을 매번 전처리 과정을 거쳐서 전송하게 되기 때문에 반복적인 작업에서 속도가 느려질 수 있는 한계를 갖고 있다. // 3 개면 3개 다 precompile 해야한다 -> 속도 늦음 -> 그러나 보안성 뛰어남! 이에 반하여, PreparedStatement 는 전처리 된 Statement 로 주어진 SQL 구문을 미리 전처리 과정을 거친 상태로 보관해 두기 때문에 반복적인 작업을 수행하는 데 있어 매우 유리하다. Statement 의 서브 클래스인 PreparedStatement 는 Statement 의 모든 기능을 상속받으며 IN 매개변수의 위치에 데이터베이스로 전송될 값을 지정하기 위해 필요한 전체 모든 메소드들의 집합을 포함시킨다. 또한, 세 개의 메소드 『execute(), executeUpdate(), executeQuery()』는 아무런 파라미터도 가지지 않는다. 이러한 메소드들의 Statement 형태(즉, SQL 매개변수를 가지는 형태)는 PreparedStatement 객체에서 사용되지 않는다. --------------------------------------------------------------------------------- 2. IN 매개변수 넘겨주기 PreparedStatement 객체를 실행하기 전에 각 『?』 매개변수의 값이 설정되어 있어야 한다. 이것은 『setXxx()』 메소드를 호출하여 이루어지게 되며 이 때, 『Xxx』는 매개변수에 대한 적당한 형(Type)이다. 『setXxx()』메소드의 첫번째 인자는 설정된 매개변수의 순번이고, 두 번째 인자는 매개변수가 설정될 값이다. --------------------------------------------------------------------------------- ※ Connection 의 대표적 메소드 - createStatement() : SQL 구문을 Database 에 전달하기 위해 Statement 객체를 생성한다. - preparedStatement(String sql) : 파라미터가 포함된 SQL 문을 Database 에 전달하기 위해 PreparedStatement 객체를 생성한다. - prepareCall(String sql) : 데이터베이스의 Stored Procedure 를 호출하기 위해 CallableStatement 객체를 생성한다. - close() : 현재의 Connection 객체에 할당 된 System Resource 를 즉시 반환한다.
project close JDBC06
- PreparedStatement 관찰
SQL DEVELOPER
더보기SELECT USER FROM DUAL; --==>> SCOTT SELECT * FROM TBL_MEMBER; --==>> /* 1 별희강 010-1111-1111 2 수인주 010-2222-2222 3 기배리 010-3333-3333 4 하경최 010-4444-4444 */ --○ 데이터 입력 쿼리문 구성 INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES (MEMBERSEQ.NEXTVAL, '희정권', '010-5555-5555'); --> INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES (MEMBERSEQ.NEXTVAL, '희정권', '010-5555-5555') ; --==>> 1 행 이(가) 삽입되었습니다. --○ 확인 SELECT * FROM TBL_MEMBER; --==>> /* 1 별희강 010-1111-1111 2 수인주 010-2222-2222 3 기배리 010-3333-3333 4 하경최 010-4444-4444 5 희정권 010-5555-5555 */ COMMIT; --==>> 커밋 완료. --○ 데이터 전체 조회 쿼리문 구성 SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID; --> SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID ; --==>> /* 1 별희강 010-1111-1111 2 수인주 010-2222-2222 3 기배리 010-3333-3333 4 하경최 010-4444-4444 5 희정권 010-5555-5555 */
패키지를 생성하지 않고 src 경로에서 클래스 생성하면서 패키지 생성도 가능 - DBConn
더보기/*========================= DBConn.java - 예외처리 try~catch ==========================*/ package com.util; import java.sql.Connection; import java.sql.DriverManager; public class DBConn { private static Connection dbConn; public static Connection getConnection() { try { if (dbConn == null) { String url = "jdbc:oracle:thin:@localhost:1521:xe"; String user = "scott"; String pwd = "tiger"; Class.forName("oracle.jdbc.driver.OracleDriver"); dbConn = DriverManager.getConnection(url, user, pwd); } } catch (Exception e) { System.out.println(e.toString()); } return dbConn; } public static Connection getConnection(String url, String user, String pwd) { try { if (dbConn == null) { Class.forName("oracle.jdbc.driver.OracleDriver"); dbConn = DriverManager.getConnection(url, user, pwd); } } catch (Exception e) { System.out.println(e.toString()); } return dbConn; } public static void close() { try { if (dbConn != null) { if (!dbConn.isClosed()) { dbConn.close(); } } } catch (Exception e) { System.out.println(e.toString()); } dbConn = null; } }
- Test001
- 정적 데이터 입력받아와서 쿼리문 전송
/*========================= Test001.java - 쿼리문 전송 실습 ==========================*/ package com.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Statement; import com.util.DBConn; public class Test001 { public static void main(String[] args) { try { Connection conn = DBConn.getConnection(); if (conn != null) { System.out.println("데이터베이스 연결 성공"); try { /*-- 기존 Statement 작성 시 Statement stmt = conn.createStatement(); String sql = "INSERT INTO TBL_MEMBER(SID, NAME, TEL)" + " VALUES (MEMBERSEQ.NEXTVAL, '이서최', '010-6666-6666')"; int result = stmt.executeUpdate(sql); if (result>0) System.out.println("데이터 입력 성공~!!!"); stmt.close(); DBConn.close(); */ // PrepareStatement // 쿼리문 준비 String sql = "INSERT INTO TBL_MEMBER(SID, NAME, TEL)" // + " VALUES (MEMBERSEQ.NEXTVAL, '이서최', '010-6666-6666')"; // 넘겨 받게 되는 데이터 부분을 '?' 으로 처리 // + " VALUES (MEMBERSEQ.NEXTVAL, '?', '?')"; // PreparedStatemet 의 경우는 문자타입이건 숫자타입이건 '' << 없어야 함 + " VALUES (MEMBERSEQ.NEXTVAL, ?, ?)"; // PreparedStatement 작업 객체 생성 → 쿼리문 전달 PreparedStatement pstmt = conn.prepareStatement(sql); // IN 매개변수 넘겨주기 // 홑따옴표 처리 안해도 되는 이유 -> setXxx 으로 타입 지정을 해주면서 넘기기 때문 // 자바에서 작성하는 내용이지만 0번이 아닌 1번 부터 시작 pstmt.setString(1,"이서최"); pstmt.setString(2, "010-6666-6666"); // 쿼리문 실행 → 작업 객체 실행 // 별도의 쿼리문을 넘겨주지 않는다! (미리 넘겨 줌) // statement 사용시 메소드의 반환자료와 동일하다 int result = pstmt.executeUpdate(); // 결과 확인 안내 if (result>0) System.out.println("데이터 입력 성공~"); // 리소스 반납 pstmt.close(); DBConn.close(); } catch (Exception e) { System.out.println(e.toString()); } } } catch (Exception e) { System.out.println(e.toString()); } }// end main() }
- Test002
- 사용자로부터 입력 받아와 쿼리문 전송 관찰
/*========================= Test002.java - 쿼리문 전송 실습 ==========================*/ package com.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.Scanner; import com.util.DBConn; public class Test002 { public static void main(String[] args) { try { Scanner sc = new Scanner(System.in); Connection conn = DBConn.getConnection(); do { System.out.print("\n번호 입력(-1 종료) : "); String sid = sc.next(); if (sid.equals("-1")) break; System.out.print("이름 입력 : "); String name = sc.next(); System.out.print("전화번호 입력 : "); String tel = sc.next(); if (conn != null) { System.out.println("데이터베이스 연결 성공 ~ !!!"); try { String sql = "INSERT INTO TBL_MEMBER(SID,NAME,TEL)" + " VALUES(?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, Integer.parseInt(sid)); pstmt.setString(2, name); pstmt.setString(3, tel); int result = pstmt.executeUpdate(); if (result > 0) System.out.println("회원 데이터 입력 완료~!!!"); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } } } while (true); DBConn.close(); System.out.println(); System.out.println("데이터베이스 연결 닫힘!"); System.out.println("프로그램 종료됨!"); } catch (Exception e) { System.out.println(e.toString()); } }// end main() }
- Test003
- executeQuery()
/*========================= Test003.java - 쿼리문 전송 실습 ==========================*/ package com.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import com.util.DBConn; public class Test003 { public static void main(String[] args) { try { Connection conn = DBConn.getConnection(); if (conn != null) { System.out.println("데이터베이스 연결 성공!"); try { // 쿼리문 준비 String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID"; // 작업 객체 생성(쿼리문 전달) PreparedStatement pstmt = conn.prepareStatement(sql); // 작업 객체 실행(쿼리문 수행) → select 쿼리문 → executeQuery() → ResultSet 반환 ResultSet rs = pstmt.executeQuery(); //-- 쿼리문 매개변수 전달하지 않음 // ResultSet 처리 → 반복문 수행 while (rs.next()) { int sid = rs.getInt("SID"); String name = rs.getString("NAME"); String tel = rs.getString("TEL"); String str = String.format("%3d %7s %10s", sid, name, tel); System.out.println(str); } // 사용 리소스 반납 rs.close(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } } } catch (Exception e) { System.out.println(e.toString()); } DBConn.close(); System.out.println("\n데이터베이스 연결 닫힘!"); System.out.println("프로그램 종료됨!"); } }
JDBC07
- PreparedStatement 사용하여 성적처리 시스템 구현/* ○ 성적 처리 → 데이터베이스 연동(데이터베이스 연결 및 액션 처리) JDBC04_scott.sql 활용 - ScoreDTO 클래스 활용(속성만 존재하는 클래스, getter / setter 구성) - ScoreDAO 클래스 활용(데이터베이스 액션 처리) - Process 클래스 활용(업무 단위 기능 구성) - DBConn 클래스 활용(데이터베이스 연결 전담 전용 객체 처리) ※ 단, 모~~~~~~~~~~~든 작업 객체는 PreparedStatement 를 활용한다. 여러 명의 이름, 국어점수, 영어점수, 수학점수를 입력받아 총점, 평균, 석차 등을 계산하여 출력하는 프로그램을 구현한다. */
실행 예)
더보기/* 실행 예) =====[ 성적 처리 ]===== 1. 성적 입력 2. 성적 전체 출력 3. 이름 검색 출력 4. 성적 수정 5. 성적 삭제 ======================= >> 선택(1~5, -1종료) : 1 7번 학생 성적 입력(이름 국어 영어 수학) : 상훈문 50 60 70 >> 성적 입력이 완료되었습니다. 8번 학생 성적 입력(이름 국어 영어 수학) : 준복이 80 80 80 >> 성적 입력이 완료되었습니다. 9번 학생 성적 입력(이름 국어 영어 수학) : . =====[ 성적 처리 ]===== 1. 성적 입력 2. 성적 전체 출력 3. 이름 검색 출력 4. 성적 수정 5. 성적 삭제 ======================= >> 선택(1~5, -1종료) : 2 전체 인원 : 8 명 번호 이름 국어 영어 수학 총점 평균 석차 1 2 3 4 5 ... 6 7 8 =====[ 성적 처리 ]===== 1. 성적 입력 2. 성적 전체 출력 3. 이름 검색 출력 4. 성적 수정 5. 성적 삭제 ======================= >> 선택(1~5, -1종료) : 3 >> 검색할 이름 입력 : 홍길동 전체 인원 : 1명 번호 이름 국어 영어 수학 총점 평균 석차 1 // 이름이 없을 경우 다시 물어보기 or 없다고 얘기하고 메인메뉴로 보내기 -- 업무 성격에 따라서 이동 =====[ 성적 처리 ]===== 1. 성적 입력 2. 성적 전체 출력 3. 이름 검색 출력 4. 성적 수정 5. 성적 삭제 ======================= >> 선택(1~5, -1종료) : -1 >> 프로그램이 종료 됩니다. */
- DBConn
더보기/*================ DBConn.java =================*/ package com.util; import java.sql.Connection; import java.sql.DriverManager; public class DBConn { private static Connection dbConn; public static Connection getConnection() { try { if (dbConn==null) { String url = "jdbc:oracle:thin:@localhost:1521:xe"; String user = "scott"; String pwd = "tiger"; Class.forName("oracle.jdbc.driver.OracleDriver"); dbConn = DriverManager.getConnection(url, user, pwd); } } catch (Exception e) { System.out.println(e.toString()); } return dbConn; } public static Connection getConnection(String url, String user, String pwd) { try { if (dbConn==null) { Class.forName("oracle.jdbc.driver.OracleDriver"); dbConn = DriverManager.getConnection(url, user, pwd); } } catch (Exception e) { System.out.println(e.toString()); } return dbConn; } public static void close() { try { if (dbConn!=null) { if (!dbConn.isClosed()) { dbConn.close(); } } dbConn = null; } catch (Exception e) { System.out.println(e.toString()); } } }
- ScoreDTO
더보기/*================== ScoreDTO.java ===================*/ package com.test; public class ScoreDTO { private String name; private int sid, kor, eng, mat, tot, rank; private double avg; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public int getKor() { return kor; } public void setKor(int kor) { this.kor = kor; } public int getEng() { return eng; } public void setEng(int eng) { this.eng = eng; } public int getMat() { return mat; } public void setMat(int mat) { this.mat = mat; } public int getTot() { return tot; } public void setTot(int tot) { this.tot = tot; } public int getRank() { return rank; } public void setRank(int rank) { this.rank = rank; } public double getAvg() { return avg; } public void setAvg(double avg) { this.avg = avg; } }
- ScoreDAO
- 검색하여 리스트 출력하는 메소드(이름, 번호)를 합친 메소드를 구성하려고 하였으나
Statement와는 다르게 '' << 문자열의 형태를 씌워주어 전달하지 않기 때문에 동일한 방식으로는 구성 불가
SQL 구문을 생성할 때 " " + key + " " ; 형태로 넘겨야 함
다만, 해당 경우와 같이 구성할 경우 if 문 안에 SQL 구문부터 출력문까지 들어가게 되기 때문에
2개를 만드는 것과 큰 차이가 없어 별도로 구성하였다.
/*================== ScoreDAO.java ===================*/ package com.test; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import com.util.DBConn; public class ScoreDAO { private Connection conn; // 데이터베이스 연결 메소드 public Connection connection() { conn = DBConn.getConnection(); return conn; } // 데이터베이스 연결 종료 메소드 public void close() { DBConn.close(); } // 데이터 입력 메소드 public int add(ScoreDTO dto) { int result = 0; try { String sql = "INSERT INTO TBL_SCORE(SID,NAME,KOR,ENG,MAT)" + " VALUES(SCORESEQ.NEXTVAL, ?,?,?,?)"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, dto.getName()); pstmt.setInt(2, dto.getKor()); pstmt.setInt(3, dto.getEng()); pstmt.setInt(4, dto.getMat()); result = pstmt.executeUpdate(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; }// end add // 전체 인원수 조회 메소드 public int count() { int result = 0; try { String sql ="SELECT COUNT(*) AS COUNT FROM TBL_SCORE"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); if (rs.next()) result = rs.getInt("COUNT"); rs.close(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; }// end count() // 이름 검색 인원수 조회 메소드 public int searchCount(String name) { int result = 0; try { String sql = "SELECT COUNT(*) AS COUNT FROM TBL_SCORE WHERE NAME LIKE ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "%%"+name+"%%"); ResultSet rs = pstmt.executeQuery(); if (rs.next()) result = rs.getInt("COUNT"); rs.close(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; }// end searchCount() // 리스트 출력 메소드 public ArrayList<ScoreDTO> list() { ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>(); try { String sql = "SELECT SID, NAME, KOR, ENG, MAT" + ", (KOR + ENG + MAT) AS TOT" + " , (KOR + ENG + MAT)/3 AS AVG" + ", RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK" + " FROM TBL_SCORE" + " ORDER BY SID"; PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { ScoreDTO dto = new ScoreDTO(); dto.setSid(rs.getInt("SID")); dto.setName(rs.getString("NAME")); dto.setKor(rs.getInt("KOR")); dto.setEng(rs.getInt("ENG")); dto.setMat(rs.getInt("MAT")); dto.setTot(rs.getInt("TOT")); dto.setAvg(rs.getDouble("AVG")); dto.setRank(rs.getInt("RANK")); result.add(dto); } rs.close(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; }// end list() // 이름 검색 리스트 메소드 public ArrayList<ScoreDTO> nameList(String name) { ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>(); try { String sql = "SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK" + " FROM" + " (SELECT SID, NAME, KOR, ENG, MAT" + ", (KOR + ENG + MAT) AS TOT" + ", (KOR + ENG + MAT)/3 AS AVG" + ", RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK" + " FROM TBL_SCORE)" + " WHERE NAME LIKE ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, "%%"+name+"%%"); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { ScoreDTO dto = new ScoreDTO(); dto.setSid(rs.getInt("SID")); dto.setName(rs.getString("NAME")); dto.setKor(rs.getInt("KOR")); dto.setEng(rs.getInt("ENG")); dto.setMat(rs.getInt("MAT")); dto.setTot(rs.getInt("TOT")); dto.setAvg(rs.getDouble("AVG")); dto.setRank(rs.getInt("RANK")); result.add(dto); } rs.close(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; } // 번호 검색 리스트 메소드 public ArrayList<ScoreDTO> sidList(int sid) { ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>(); try { String sql = "SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK" + " FROM" + " (SELECT SID, NAME, KOR, ENG, MAT" + ", (KOR + ENG + MAT) AS TOT" + ", (KOR + ENG + MAT)/3 AS AVG" + ", RANK() OVER(ORDER BY (KOR+ENG+MAT) DESC) AS RANK" + " FROM TBL_SCORE)" + " WHERE SID LIKE ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, sid); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { ScoreDTO dto = new ScoreDTO(); dto.setSid(rs.getInt("SID")); dto.setName(rs.getString("NAME")); dto.setKor(rs.getInt("KOR")); dto.setEng(rs.getInt("ENG")); dto.setMat(rs.getInt("MAT")); dto.setTot(rs.getInt("TOT")); dto.setAvg(rs.getDouble("AVG")); dto.setRank(rs.getInt("RANK")); result.add(dto); } rs.close(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; } // 데이터 수정 메소드 public int modify(ScoreDTO dto) { int result = 0; try { String sql = "UPDATE TBL_SCORE" + " SET NAME=?, KOR =? , ENG=? , MAT=?" + " WHERE SID = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, dto.getName()); pstmt.setInt(2, dto.getKor()); pstmt.setInt(3, dto.getEng()); pstmt.setInt(4, dto.getMat()); pstmt.setInt(5, dto.getSid()); result = pstmt.executeUpdate(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; }// end modify() // 데이터 삭제 메소드 public int remove(int sid) { int result = 0; try { String sql = "DELETE FROM TBL_SCORE WHERE SID = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, sid); result = pstmt.executeUpdate(); pstmt.close(); } catch (Exception e) { System.out.println(e.toString()); } return result; }//end remove() }
- ScoreProcess
/*====================== ScoreProcess.java =======================*/ package com.test; import java.util.ArrayList; import java.util.Scanner; public class ScoreProcess { // 주요 속성 구성 private ScoreDAO dao; public ScoreProcess() { dao = new ScoreDAO(); } // 1. 성적 입력 public void scoreInsert() { Scanner sc = new Scanner(System.in); dao.connection(); try { int count = dao.count(); do { System.out.printf("\n%d번 학생 성적 입력(이름 국어 영어 수학) : ", ++count); String name = sc.next(); if (name.equals(".")) return; int kor = sc.nextInt(); int eng = sc.nextInt(); int mat = sc.nextInt(); ScoreDTO dto = new ScoreDTO(); dto.setName(name); dto.setKor(kor); dto.setEng(eng); dto.setMat(mat); int result = dao.add(dto); if (result>0) System.out.println("\n>> 성적 입력이 완료되었습니다."); } while (true); } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } }// end scoreInsert() // 2. 성적 전체 출력 public void scoreList() { dao.connection(); try { int count = dao.count(); System.out.printf("\n전체 인원 : %d 명", count); System.out.println("\n번호 이름 국어 영어 수학 총점 평균 석차\n"); ArrayList<ScoreDTO> mlist = dao.list(); for (ScoreDTO dto : mlist) { System.out.printf("%5d %5s %5d %5d %5d %6d %6.1f %5d\n" , dto.getSid(), dto.getName() , dto.getKor(), dto.getEng(), dto.getMat() , dto.getTot(), dto.getAvg(), dto.getRank() ); } } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } }// end scoreList() // 3. 이름 검색 출력 public void searchName() { dao.connection(); try { Scanner sc = new Scanner(System.in); System.out.print("\n>> 검색할 이름 입력 : "); String name = sc.next(); int count = dao.searchCount(name); ArrayList<ScoreDTO> slist = dao.nameList(name); System.out.printf("\n검색 인원 : %d 명\n", count); System.out.println("\n번호 이름 국어 영어 수학 총점 평균 석차\n"); if (count != 0) { if (slist.size()>0) { ScoreDTO dto = slist.get(0); System.out.printf("%5d %5s %5d %5d %5d %6d %6.1f %5d\n" , dto.getSid(), dto.getName() , dto.getKor(), dto.getEng(), dto.getMat() , dto.getTot(), dto.getAvg(), dto.getRank() ); } } else { System.out.println("\n>>검색 대상이 존재하지 않습니다."); } } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } }// end searchName() // 4. 성적 수정 public void scoreModify() { dao.connection(); try { Scanner sc = new Scanner(System.in); System.out.print("\n>>수정할 학생 번호 입력 : "); int num = sc.nextInt(); ArrayList<ScoreDTO> slist = dao.sidList(num); System.out.println("\n번호 이름 국어 영어 수학 총점 평균 석차\n"); if (slist.size() > 0) { ScoreDTO mdto = slist.get(0); int mSid = mdto.getSid(); String mName = mdto.getName(); int mKor = mdto.getKor(); int mEng = mdto.getEng(); int mMat = mdto.getMat(); System.out.printf("%5d %5s %5d %5d %5d %6d %6.1f %5d\n" , mSid, mName, mKor, mEng, mMat, mdto.getTot(), mdto.getAvg(), mdto.getRank() ); System.out.print("\n>> 수정할 성적 입력 (국어 영어 수학) : "); int kor = sc.nextInt(); int eng = sc.nextInt(); int mat = sc.nextInt(); mdto.setKor(kor); mdto.setEng(eng); mdto.setMat(mat); int result = dao.modify(mdto); if (result > 0) System.out.println("\n>> 수정이 완료되었습니다."); } else { System.out.println("\n>>수정 대상이 존재하지 않습니다."); } } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } }// end scoreModify // 5. 성적 삭제 public void scoreDelete() { dao.connection(); try { Scanner sc = new Scanner(System.in); System.out.print("\n>>성적을 삭제할 학생 번호 입력 : "); int num = sc.nextInt(); ArrayList<ScoreDTO> slist = dao.sidList(num); System.out.println("\n번호 이름 국어 영어 수학 총점 평균 석차\n"); if (slist.size() > 0) { ScoreDTO mdto = slist.get(0); int mSid = mdto.getSid(); String mName = mdto.getName(); int mKor = mdto.getKor(); int mEng = mdto.getEng(); int mMat = mdto.getMat(); System.out.printf("%5d %5s %5d %5d %5d %6d %6.1f %5d\n" , mSid, mName, mKor, mEng, mMat, mdto.getTot(), mdto.getAvg(), mdto.getRank() ); System.out.println(); System.out.print("\n>> 정말 삭제하시겠습니까? (Y/N) : "); String ans = sc.next(); if (ans.equals("Y") || ans.equals("y")) { int result = dao.remove(mSid); if (result > 0) System.out.println("\n>> 정상적으로 삭제되었습니다."); } else System.out.println("\n>> 취소 되었습니다."); } else { System.out.println("\n>>삭제할 대상이 존재하지 않습니다."); } } catch (Exception e) { System.out.println(e.toString()); } finally { try { dao.close(); } catch (Exception e) { System.out.println(e.toString()); } } }// end scoreDelte() }
- ScoreMain
/*===================== ScoreMain.java =====================*/ /* ○ 성적 처리 → 데이터베이스 연동(데이터베이스 연결 및 액션 처리) JDBC04_scott.sql 활용 - ScoreDTO 클래스 활용(속성만 존재하는 클래스, getter / setter 구성) - ScoreDAO 클래스 활용(데이터베이스 액션 처리) - Process 클래스 활용(업무 단위 기능 구성) - DBConn 클래스 활용(데이터베이스 연결 전담 전용 객체 처리) ※ 단, 모~~~~~~~~~~~든 작업 객체는 PreparedStatement 를 활용한다. 여러 명의 이름, 국어점수, 영어점수, 수학점수를 입력받아 총점, 평균, 석차 등을 계산하여 출력하는 프로그램을 구현한다. 실행 예) =====[ 성적 처리 ]===== 1. 성적 입력 2. 성적 전체 출력 3. 이름 검색 출력 4. 성적 수정 5. 성적 삭제 ======================= >> 선택(1~5, -1종료) : 1 7번 학생 성적 입력(이름 국어 영어 수학) : 상훈문 50 60 70 >> 성적 입력이 완료되었습니다. 8번 학생 성적 입력(이름 국어 영어 수학) : 준복이 80 80 80 >> 성적 입력이 완료되었습니다. 9번 학생 성적 입력(이름 국어 영어 수학) : . =====[ 성적 처리 ]===== 1. 성적 입력 2. 성적 전체 출력 3. 이름 검색 출력 4. 성적 수정 5. 성적 삭제 ======================= >> 선택(1~5, -1종료) : 2 전체 인원 : 8 명 번호 이름 국어 영어 수학 총점 평균 석차 1 2 3 4 5 ... 6 7 8 =====[ 성적 처리 ]===== 1. 성적 입력 2. 성적 전체 출력 3. 이름 검색 출력 4. 성적 수정 5. 성적 삭제 ======================= >> 선택(1~5, -1종료) : 3 >> 검색할 이름 입력 : 홍길동 전체 인원 : 1명 번호 이름 국어 영어 수학 총점 평균 석차 1 // 이름이 없을 경우 다시 물어보기 or 없다고 얘기하고 메인메뉴로 보내기 -- 업무 성격에 따라서 이동 =====[ 성적 처리 ]===== 1. 성적 입력 2. 성적 전체 출력 3. 이름 검색 출력 4. 성적 수정 5. 성적 삭제 ======================= >> 선택(1~5, -1종료) : -1 >> 프로그램이 종료 됩니다. */ package com.test; import java.util.Scanner; public class ScoreMain { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ScoreProcess prc = new ScoreProcess(); do { System.out.println("\n=====[ 성적 처리 ]====="); System.out.println("1. 성적 입력"); System.out.println("2. 성적 전체 출력"); System.out.println("3. 이름 검색 출력"); System.out.println("4. 성적 수정"); System.out.println("5. 성적 삭제"); System.out.println("======================="); System.out.print(">> 선택(1~5, -1종료) : "); String choice = sc.next(); try { int num = Integer.parseInt(choice); if (num == -1) { System.out.println("\n프로그램을 종료합니다."); return; } switch (num) { case 1: prc.scoreInsert(); break; case 2: prc.scoreList(); break; case 3: prc.searchName(); break; case 4: prc.scoreModify(); break; case 5: prc.scoreDelete(); break; } } catch (Exception e) { System.out.println(e.toString()); } } while (true); } }
728x90'SsY > Class' 카테고리의 다른 글
[HTML] 001. HTML 의 개요 , Eclipse 설정 Export-Import 로 기존 설정 가져오기 (0) 2023.05.02 008. CallableStatement (0) 2023.05.02 006. DB 연동 직원 관리 프로그램 구현 (해설) (0) 2023.04.28 005. DB 연동 직원 관리 프로그램 구현 (DTO, DAO, PROCESS, MAIN) (0) 2023.04.27 004. DAO/DTO/VO 개념, 성적 처리 → 데이터베이스 연동(데이터베이스 연결 및 액션 처리) (0) 2023.04.25