Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

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:04

JDBC07 - 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;
	}
}