Everything has an expiration date
JDBC 20231127 [프로그래밍 소스] - (PrepareStatement 사용) ScoreDTO, ScoreDAO, ScoreProces 본문
[JDBC]/Program source (JDBC)
JDBC 20231127 [프로그래밍 소스] - (PrepareStatement 사용) ScoreDTO, ScoreDAO, ScoreProces
Jelly-fish 2023. 11. 27. 16:04JDBC07 - com.test
ScoreDTO.java
package com.test;
public class ScoreDTO
{
private String name, sid;
private int kor, eng, mat, tot, rank;
private double avg;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getSid()
{
return sid;
}
public void setSid(String 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;
}
// SID NAME KOR MAT ENG
}
ScoreDAO.java
package com.test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import com.util.DBConn;
public class ScoreDAO
{
/*
====[ 성적 처리 ]====
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
=====================
>> 선택(1~5, -1종료) : 1
4번 학생 성적 입력(이름 국어 영어 수학) : 박범구 50 60 70
성적 입력이 완료되었습니다.
전체 인원 : 5명
번호 이름 국어 영어 수학 총점 평균 석차
1
2
3 ...
4
5
*/
private Connection conn;
public Connection connection()
{
conn = DBConn.getConnection();
return conn;
}
// 인원수 반환 메소드
public int count() throws SQLException
{
int result = 0;
// 쿼리문 생성
String sql = "SELECT COUNT(*) AS COUNT"
+ " FROM TBL_SCORE";
// 작업객체 생성 PreparedStatement
PreparedStatement pstmt = conn.prepareStatement(sql);
// executeQuery()
ResultSet rs = pstmt.executeQuery();
// while(rs.next())
// result = rs.getInt("COUNT")
while(rs.next())
{
result = rs.getInt("COUNT");
}
return result;
}
// 성적 입력 메소드
public int scoreInsert(ScoreDTO dto) throws SQLException
{
int result = 0;
// 쿼리문 생성 (입력받을 곳에 퀘스쳔 마크) ?
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());
// execute 실행(매개변수 없음)
result = pstmt.executeUpdate();
pstmt.close();
return result;
}
// 성적 전체 출력 메소드
public ArrayList<ScoreDTO> scorePrint() throws SQLException
{
ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>();
// 쿼리문 구성
String sql = "SELECT SID, NAME, KOR, ENG, MAT"
+ ", (KOR + ENG + MAT) AS TOT"
+ ", ROUND(((KOR + ENG + MAT) / 3), 1) AS AVG"
+ ", RANK() OVER(ORDER BY (KOR + ENG + MAT) DESC) AS RANK"
+ " FROM TBL_SCORE"
+ " ORDER BY SID";
// 작업객체 생성 (매개변수로 쿼리문)
PreparedStatement pstmt = conn.prepareStatement(sql);
// execute 실행 (매개변수 없음)
ResultSet rs = pstmt.executeQuery();
// while(rs.next()) 로 구성
// ScoreDTO 객체 생성
// dto.setXXX()
// result.add(dto)
while(rs.next())
{
// DTO 객체 생성
ScoreDTO dto = new ScoreDTO();
// ResultSet에서 읽어들인 값을 dto에 set
dto.setSid(rs.getString("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"));
// dto를 result ArrayList<ScoreDTO> 에 add
result.add(dto);
}
rs.close();
pstmt.close();
return result;
}
// 이름 검색 출력 메소드
public ArrayList<ScoreDTO> scoreSearchName(String name) throws SQLException
{
ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>();
// 쿼리문 구성
String sql = "SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK"
+ " FROM"
+ "( "
+ "SELECT SID, NAME, KOR, ENG, MAT"
+ ", (KOR + ENG + MAT) AS TOT"
+ ", ROUND(((KOR + ENG + MAT) / 3), 1) AS AVG"
+ ", RANK() OVER(ORDER BY (KOR + ENG + MAT) DESC) AS RANK"
+ " FROM TBL_SCORE"
+ ")"
+ " WHERE NAME = ?";
// 작업객체 생성 (매개변수로 쿼리문)
PreparedStatement pstmt = conn.prepareStatement(sql);
// 빈 퀘스쳔 마크 속으로 값 넣어주기!!
pstmt.setString(1, name);
// execute 실행 (매개변수 없음)
ResultSet rs = pstmt.executeQuery();
// while(rs.next()) 로 구성
// ScoreDTO 객체 생성
// dto.setXXX()
// result.add(dto)
while(rs.next())
{
// DTO 객체 생성
ScoreDTO dto = new ScoreDTO();
// ResultSet에서 읽어들인 값을 dto에 set
dto.setSid(rs.getString("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"));
// dto를 result ArrayList<ScoreDTO> 에 add
result.add(dto);
}
rs.close();
pstmt.close();
return result;
}
// 번호 검색 출력 메소드
public ArrayList<ScoreDTO> scoreSearchSid(int sid) throws SQLException
{
ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>();
// 쿼리문 구성
String sql = "SELECT SID, NAME, KOR, ENG, MAT, TOT, AVG, RANK"
+ " FROM"
+ "( "
+ "SELECT SID, NAME, KOR, ENG, MAT"
+ ", (KOR + ENG + MAT) AS TOT"
+ ", ROUND(((KOR + ENG + MAT) / 3), 1) AS AVG"
+ ", RANK() OVER(ORDER BY (KOR + ENG + MAT) DESC) AS RANK"
+ " FROM TBL_SCORE"
+ ")"
+ " WHERE SID = ?";
// 작업객체 생성 (매개변수로 쿼리문)
PreparedStatement pstmt = conn.prepareStatement(sql);
// 빈 퀘스쳔 마크 속으로 값 넣어주기!!
pstmt.setInt(1, sid);
// execute 실행 (매개변수 없음)
ResultSet rs = pstmt.executeQuery();
// while(rs.next()) 로 구성
// ScoreDTO 객체 생성
// dto.setXXX()
// result.add(dto)
while(rs.next())
{
// DTO 객체 생성
ScoreDTO dto = new ScoreDTO();
// ResultSet에서 읽어들인 값을 dto에 set
dto.setSid(rs.getString("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"));
// dto를 result ArrayList<ScoreDTO> 에 add
result.add(dto);
}
pstmt.close();
return result;
}
// 성적 수정 메소드
public int scoreUpdate(ScoreDTO dto) throws SQLException
{
int result = 0;
// 쿼리문 구성 (업데이트문, 업데이트할 요소들 다 ?)
String sql = "UPDATE TBL_SCORE"
+ " SET NAME = ?, KOR = ?, ENG = ?, MAT = ?"
+ " WHERE SID = ?";
// 작업 객체 생성
PreparedStatement pstmt = conn.prepareStatement(sql);
// 빈 ? 채워주기!! pstmt.setXxx()!!!
pstmt.setString(1, dto.getName());
pstmt.setInt(2, dto.getKor());
pstmt.setInt(3, dto.getEng());
pstmt.setInt(4, dto.getMat());
pstmt.setInt(5, Integer.parseInt(dto.getSid()));
// 쿼리문 실행 executeQuery()
// result에 변경된 행의 개수 값 int 넣기
result = pstmt.executeUpdate();
pstmt.close();
return result;
}
// 성적 삭제 메소드
public int scoreRemove(int sid) throws SQLException
{
int result = 0;
// 쿼리문 생성 (sid 는 ?마크로)
String sql = "DELETE"
+ " FROM TBL_SCORE"
+ " WHERE SID = ?";
// 작업객체 생성
PreparedStatement pstmt = conn.prepareStatement(sql);
// ? 채워주기!! pstmt.setXxx()
pstmt.setInt(1, sid);
// executeUpdate()
result = pstmt.executeUpdate();
pstmt.close();
return result;
}
// 연결 닫기 메소드
public void close()
{
DBConn.close();
}
}
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. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
=====================
>> 선택(1~5, -1종료) : 1
4번 학생 성적 입력(이름 국어 영어 수학) : 박범구 50 60 70
성적 입력이 완료되었습니다.
*/
public void prScoreInsert()
{
Scanner sc = new Scanner(System.in);
try
{
dao.connection();
int count = dao.count();
do
{
ScoreDTO dto = new ScoreDTO();
System.out.printf("\n%d번 학생 성적 입력(이름 국어 영어 수학) : ", ++count);
String name = sc.next();
if (name.equals("."))
break;
int kor = sc.nextInt();
int eng = sc.nextInt();
int mat = sc.nextInt();
dto.setName(name);
dto.setKor(kor);
dto.setEng(eng);
dto.setMat(mat);
int result = dao.scoreInsert(dto);
if (result > 0)
System.out.println("성적 입력이 완료되었습니다.");
} while (true);
dao.close();
} catch (Exception e)
{
System.out.println(e.toString());
}
}
/*
전체 인원 : 5명
번호 이름 국어 영어 수학 총점 평균 석차
1
2
3 ...
4
5
*/
// 전체 출력 메소드
public void prScorePrint()
{
Scanner sc = new Scanner(System.in);
try
{
dao.connection();
System.out.println();
System.out.printf("전체 인원 : %d 명\n", dao.count());
ArrayList<ScoreDTO> arrayList = dao.scorePrint();
System.out.println("번호 이름 국어 영어 수학 총점 평균 석차");
for (ScoreDTO dto : arrayList)
{
// St St int int int int dou int
// 번호 이름 국어점수 영어점수 수학점수 총점 평균 석차
System.out.printf("%2s\t%4s\t\t%3d\t%3d\t%3d\t%3d\t%5.1f\t%3d\n"
, dto.getSid(), dto.getName()
, dto.getKor(), dto.getEng(), dto.getMat()
, dto.getTot(), dto.getAvg(), dto.getRank());
}
System.out.println();
dao.close();
} catch (Exception e)
{
System.out.println(e.toString());
}
}
public void prScoreSearchName()
{
Scanner sc = new Scanner(System.in);
try
{
System.out.println();
System.out.print("검색할 학생의 이름을 입력해 주십시오 : ");
String name = sc.next();
dao.connection();
ArrayList<ScoreDTO> arrayList = dao.scoreSearchName(name);
if (arrayList.size() > 0)
{
System.out.println();
System.out.println("번호 이름 국어 영어 수학 총점 평균 석차");
for (ScoreDTO dto : arrayList)
{
// St St int int int int dou int
// 번호 이름 국어점수 영어점수 수학점수 총점 평균 석차
System.out.printf("%2s\t%4s\t\t%3d\t%3d\t%3d\t%3d\t%5.1f\t%3d\n"
, dto.getSid(), dto.getName()
, dto.getKor(), dto.getEng(), dto.getMat()
, dto.getTot(), dto.getAvg(), dto.getRank());
}
System.out.println();
}
else
{
System.out.println("입력하신 이름의 학생 데이터가 존재하지 않습니다.");
}
dao.close();
} catch (Exception e)
{
System.out.println(e.toString());
}
}
public void prScoreUpdate()
{
Scanner sc = new Scanner(System.in);
try
{
System.out.println();
System.out.print("수정할 학생의 번호를 입력해 주십시오 : ");
int searchSid = sc.nextInt();
dao.connection();
ArrayList<ScoreDTO> arrayList = dao.scoreSearchSid(searchSid);
if (arrayList.size() > 0)
{
System.out.println("번호 이름 국어 영어 수학 총점 평균 석차");
for (ScoreDTO dto : arrayList)
{
// St St int int int int dou int
// 번호 이름 국어점수 영어점수 수학점수 총점 평균 석차
System.out.printf("%2s\t%4s\t\t%3d\t%3d\t%3d\t%3d\t%5.1f\t%3d\n"
, dto.getSid(), dto.getName()
, dto.getKor(), dto.getEng(), dto.getMat()
, dto.getTot(), dto.getAvg(), dto.getRank());
}
System.out.println();;
System.out.println("====[위 학생의 데이터를 수정합니다.]====");
System.out.println();
System.out.print("수정할 학생 성적 입력(이름 국어 영어 수학) : ");
String name = sc.next();
int kor = sc.nextInt();
int eng = sc.nextInt();
int mat = sc.nextInt();
ScoreDTO dto = new ScoreDTO();
dto.setSid(String.valueOf(searchSid));
dto.setName(name);
dto.setKor(kor);
dto.setEng(eng);
dto.setMat(mat);
int result = dao.scoreUpdate(dto);
if (result > 0)
System.out.println("\n성적 수정이 완료되었습니다.");
}
else
{
System.out.println("입력한 번호에 맞는 학생 데이터가 존재하지 않습니다.");
}
System.out.println();
} catch (Exception e)
{
System.out.println(e.toString());
}
}
public void prScoreRemove()
{
Scanner sc = new Scanner(System.in);
try
{
System.out.println();
System.out.print("삭제할 학생의 번호를 입력해 주세요 : ");
int delSid = sc.nextInt();
dao.connection();
ArrayList<ScoreDTO> arrayList = dao.scoreSearchSid(delSid);
if (arrayList.size() > 0)
{
System.out.println("번호 이름 국어 영어 수학 총점 평균 석차");
for (ScoreDTO dto : arrayList)
{
// St St int int int int dou int
// 번호 이름 국어점수 영어점수 수학점수 총점 평균 석차
System.out.printf("%2s\t%4s\t\t%3d\t%3d\t%3d\t%3d\t%5.1f\t%3d\n"
, dto.getSid(), dto.getName()
, dto.getKor(), dto.getEng(), dto.getMat()
, dto.getTot(), dto.getAvg(), dto.getRank());
}
}
System.out.println();
System.out.print("위 학생의 데이터를 삭제하시겠습니까? (Y/N) : ");
String yOrN = sc.next();
if (yOrN.equals("Y") || yOrN.equals("y"))
{
int result = dao.scoreRemove(delSid);
if (result > 0)
System.out.println("성적이 정상적으로 삭제되었습니다.");
}
else
{
System.out.println("작업을 취소했습니다.");
}
System.out.println();
} catch (Exception e)
{
System.out.println(e.toString());
}
}
public static void main(String[] args)
{
ScoreProcess spr = new ScoreProcess();
//spr.prScoreInsert();
//spr.prScorePrint();
//spr.prScoreSearchName();
//spr.prScoreUpdate();
//spr.prScoreRemove();
}
}
ScoreMain.java
/*======================
ScoreMain.java
========================*/
// 모든 작업 객체를 PreparedStatement 로 구성!
/*
○ 성적 처리
- 데이터베이스 연동(데이터베잇스 연결 및 액션 처리)
- ScoreDTO 클래스 활용(속성만 존재하는 클래스 getter / setter 구성)
- ScoreDAO 클래스 활용(데이터베이스 액션 처리)
- ScoreProcess 클래스 활용(업무 단위 기능 구성)
※ 단, 모~~~~~ 든 작업 객체는 PreparedStatement 를 활용한다.
여러 명의 이름, 국어점수, 영어점수, 수학점수를 입력받아
총점, 평균, 석차 등을 계산하여 출력하는 프로그램을 구현한다.
실행 예)
====[ 성적 처리 ]====
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
=====================
>> 선택(1~5, -1종료) : 1
4번 학생 성적 입력(이름 국어 영어 수학) : 박범구 50 60 70
성적 입력이 완료되었습니다.
5번 학생 성적 입력(이름 국어 영어 수학) : 김경태 80 80 80
성적 입력이 완료되었습니다.
6번 학생 성적 입력(이름 국어 영어 수학) : .
====[ 성적 처리 ]====
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
=====================
>> 선택(1~5, -1종료) : 2
전체 인원 : 5명
번호 이름 국어 영어 수학 총점 평균 석차
1
2
3 ...
4
5
====[ 성적 처리 ]====
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 pr = new ScoreProcess();
do
{
System.out.println("====[ 성적 처리 ]====");
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.printf(">> 선택(1~5, -1종료) : ");
int selectMenu = sc.nextInt();
if (selectMenu == -1)
return;
switch (selectMenu)
{
case 1:
pr.prScoreInsert();
break;
case 2:
pr.prScorePrint();
break;
case 3:
pr.prScoreSearchName();
break;
case 4:
pr.prScoreUpdate();
break;
case 5:
pr.prScoreRemove();
break;
}
} while (true);
}
}
JDBC07 - com.util
DBConn.java
package com.util;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBConn
{
private static Connection dbConn;
public static Connection getConnection()
{
if (dbConn == null)
{
try
{
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)
{
if (dbConn == null)
{
try
{
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()
{
if (dbConn != null)
{
try
{
if (!dbConn.isClosed())
{
dbConn.close();
}
} catch (Exception e)
{
System.out.println(e.toString());
}
}
dbConn = null;
}
}