JAVA개념&실습

JDBC : 04. ScoreDTO/ScoreDAO/Statement/성적처리 실습

u_SZero 2023. 5. 23. 23:33

! 현재 배워가고 있는 주인장이 쓴 글이니 정보의 정확성에 유의하시기바랍니다 !


 

ScoreDTO.java

String  sid(번호), name(이름)

int        kor(국어점수), eng(영어점수), mat(수학점수), tot(총점), rank(석차)

double avg(평균)

/*==================================
   ScoreDTO.java
   - 데이터 보관 및 전송 전용 객체
===================================*/

package com.test;

public class ScoreDTO
{
	// 주요 속성 구성
	private String sid, name;	//--번호, 이름
	private int kor, eng, mat;	//--국어점수, 영어점수, 수학점수
	private int tot, rank;		//--총점, 석차
	private double avg;			//--평균
	
	// getter / setter
	public String getSid()
	{
		return sid;
	}
	public void setSid(String sid)
	{
		this.sid = sid;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	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.java

Connection connection() :                                   데이터베이스 연결 담당 메소드

int add(ScoreDTO) :                                              데이터 입력 담당 메소드

ArrayList<ScoreDTO> lists() :                              전체 리스트 출력 담당 메소드

ArrayList(ScoreDTO) lists(String name) :             이름 검색 담당 메소드

ArrayList<ScoreDTO> lists(int sid) :                     번호 검색 담당 메소드

int count() :                                                            전체 인원수 확인 담당 메소드

int remove(int sid) :                                                데이터 삭제 담당 메소드

int countName(int sid) :                                         검색 인원수 확인 담당 메소드

/*=====================================
   ScoreDAO.java
   - 데이터베이스 액션 처리 전용 객체
======================================*/

package com.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import com.util.DBConn;

public class ScoreDAO
{
	// 주요 속성 구성
	private Connection conn;
	
	// 데이터베이스 연결 담당 메소드
	public Connection connection() throws ClassNotFoundException, SQLException
	{
		conn = DBConn.getConnection();
		return conn;
	}
	
	// 데이터 입력 담당 메소드
	public int add(ScoreDTO dto) throws SQLException
	{
		int result = 0;
		
		Statement stmt = conn.createStatement();
		
		String sql = String.format("INSERT INTO TBL_SCORE(SID, NAME, KOR, ENG, MAT)"
									+ " VALUES(SCORESEQ.NEXTVAL, '%s', %d, %d, %d)"
									, dto.getName(), dto.getKor(), dto.getEng(), dto.getMat());
		
		result = stmt.executeUpdate(sql);
		
		stmt.close();
		
		return result;
	}
	
	// 전체 리스트 출력 담당 메소드
	public ArrayList<ScoreDTO> lists() throws SQLException
	{
		ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>();
		
		Statement stmt = conn.createStatement();
		
		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 ASC";
		
		ResultSet rs = stmt.executeQuery(sql);
		
		while (rs.next())
		{
			ScoreDTO dto = new ScoreDTO();
			
			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"));
			
			result.add(dto);
		}
		
		rs.close();
		stmt.close();
		
		return result;
	}
	
	// 이름 검색 담당 메소드
	public ArrayList<ScoreDTO> lists(String name) throws SQLException 
	{
		ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>();
		
		Statement stmt = conn.createStatement();
		
		String sql = String.format("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 '%%%s%%'", name);					
									//JAVA에서 % 표현 -> '%%'	
		
		ResultSet rs = stmt.executeQuery(sql);
		
		while (rs.next())
		{
			ScoreDTO dto = new ScoreDTO();
			
			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"));
			
			result.add(dto);
		}
		
		rs.close();
		stmt.close();
		
		return result;
	}
	
	// 번호 검색 담당 메소드
	public ArrayList<ScoreDTO> lists(int sid) throws SQLException 
	{
		ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>(); 
		
		Statement stmt = conn.createStatement();
		
		String sql = String.format("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 = %d", sid);
		
		ResultSet rs = stmt.executeQuery(sql);
		
		while (rs.next())
		{
			ScoreDTO dto = new ScoreDTO();
			
			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"));
			
			result.add(dto);
		}
		
		rs.close();
		stmt.close();
		
		return result;	
	}
	
	
	// 전체 인원 수 확인 담당 메소드
	public int count() throws SQLException
	{
		int result = 0;
		
		Statement stmt = conn.createStatement();
		
		String sql = "SELECT COUNT(*) AS COUNT FROM TBL_SCORE";
		
		ResultSet rs = stmt.executeQuery(sql);
		
		while (rs.next())
		{
			result = rs.getInt("COUNT");
		}
		
		rs.close();
		stmt.close();
		
		return result;
	}
	
	
	// 데이터 수정 담당 메소드 → 매개변수 유형 check~!!!
	public int modify(ScoreDTO dto) throws SQLException
	{
		int result = 0;
		
		Statement stmt = conn.createStatement();
		
		String sql = String.format("UPDATE TBL_SCORE SET NAME = '%s', KOR = %d, ENG = %d, MAT = %d WHERE SID = %s"
									, dto.getName(), dto.getKor(), dto.getEng(), dto.getMat(), dto.getSid());
		
		result = stmt.executeUpdate(sql);
		
		stmt.close();
		
		return result;
	}
	
	// 데이터 삭제 담당 메소드
	public int remove(int sid) throws SQLException
	{
		int result = 0;
		
		Statement stmt = conn.createStatement();
		
		String sql = String.format("DELETE FROM TBL_SCORE WHERE SID = %d", sid);
		
		result = stmt.executeUpdate(sql);
		
		stmt.close();
		
		return result;
	}
	
	// 데이터메이스 연결 종료 담당 메소드
	public void close() throws SQLException
	{
		DBConn.close();
		
	}
	
	
	// 추가
	// 검색 인원수 확인 담당 메소드
	public int countName(String name) throws SQLException
	{
		int result = 0;
		
		Statement stmt = conn.createStatement();
		
		String sql = String.format("SELECT COUNT(*) AS COUNT FROM TBL_SCORE WHERE NAME = '%s'", name); 
		
		ResultSet rs = stmt.executeQuery(sql);
		
		while(rs.next())
		{
			result = rs.getInt("COUNT");
		}
		
		rs.close();
		stmt.close();
		
		return result;
	}

}

 

 

 

 

Process.java

: dao를 활용한 기능 구현

/*================
   Process.java
=================*/

/*
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
*/

package com.test;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Scanner;

public class Process
{
	// 주요 속성 구성 → 데이터베이스 액션 처리 전담 객체 → ScoreDAO
	private ScoreDAO dao;
	
	// 생성자 정의(사용자 정의 생성자)
	public Process()
	{
		dao = new ScoreDAO();
	}
	
	
	// 성적 입력 기능
	public void sungjukInsert() throws SQLException
	{
		try
		{
			// 데이터베이스 연결
			dao.connection();
			
			// 레코드 수 확인
			int count = dao.count();
			
			Scanner sc = new Scanner(System.in);
			
			do
			{
				System.out.println();
				System.out.printf("%d번 학생 성적 입력(이름 국어 영어 수학) : ", ++count);
				
				String name = sc.next();
				
				if (name.equals("."))
					break;
				
				int kor = sc.nextInt();
				int eng = sc.nextInt();
				int mat = sc.nextInt();
				
				// 입력받은 항목들을 토대로 ScoreDTO 객체 구성
				ScoreDTO dto = new ScoreDTO();
				
				dto.setName(name);
				dto.setKor(kor);
				dto.setEng(eng);
				dto.setMat(mat);
				
				// dao 의 add() 메소드 호출
				int result = dao.add(dto);
				
				if (result > 0)
					System.out.println("성적 입력이 완료되었습니다.");
				
			} while (true);
			
			// 데이터베이스 연결 종료
			dao.close();
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
	}
	
	// 성적 전체 출력 기능
	public void sungjukSelectAll()
	{
		try
		{
			// dao 의 connection() 메소드 호출 → 데이터베이스 연결~!!!
			dao.connection();

			Scanner sc = new Scanner(System.in);
			
			// dao 의 count() 메소드 호출 → 인원 수 확인~!!!
			int count = dao.count();
			
			// dao 의 lists() 메소드 호출 → 리스트 출력~!!!
			System.out.println();
			System.out.printf("전체인원 : %d명\n", count);
			System.out.println("번호  이름  국어  영어  수학  총점  평균  석차");
			
			// lists() 메소드의 호출 결과를 반복문을 활용하여 처리
			//dao.lists();
			for (ScoreDTO dto : dao.lists())
			{
				System.out.printf("%3s %4s %4d %4d %4d %5d %5.1f %5d\n"
								  , dto.getSid(), dto.getName()
								  , dto.getKor(), dto.getEng(), dto.getMat()
								  , dto.getTot(), dto.getAvg(), dto.getRank());
			}
			System.out.println();
			
			// dao 의 close() 메소드 호출 → 데이터베이스 연결 종료~!!!
			dao.close();
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
	}
	
	// 이름 검색 출력 기능
	public void sungjukSearchName()
	{
		try
		{	
			// 검색할 이름 입력받기
			Scanner sc = new Scanner(System.in);
			System.out.print("\n>> 검색할 이름 입력 :");
			String name = sc.next();
			
			//-- 필요한 경우 이 과정에서 프로그래밍적으로 검증(검사) 수행
			
			// 데이터베이스 연결
			dao.connection();
			
			// dao 의 lists() 메소드 호출 → 매개변수로 검색할 이름을 문자열 형태로 넘겨주기
			ArrayList<ScoreDTO> arrayList = dao.lists(name);
		
			if (arrayList.size() > 0)
			{
				// 수신된 내용 출력
				//int count = dao.countName(name);
				//System.out.printf("전체 인원 : %d명\n", count);
				System.out.printf("\n전체 인원 : %d명\n", dao.countName(name));
				System.out.println("\n번호  이름  국어  영어  수학  총점  평균  석차\n");
				for (ScoreDTO dto : arrayList)
				{
					System.out.printf("%3s %4s %4d %4d %4d %5d %5.1f %5d\n"
							  , dto.getSid(), dto.getName()
							  , dto.getKor(), dto.getEng(), dto.getMat()
							  , dto.getTot(), dto.getAvg(), dto.getRank());
				}
			}
			else
			{
				// 수신된 내용이 없는 상황이라는 안내
				System.out.println("\n>> 검색 결과가 존재하지 않습니다.\n");
			}

			// 데이터베이스 연결 종료
			dao.close();
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
	}
	
	// 성적 수정 기능
	public void sungjukUpdate()
	{
		try
		{
			/* 내가
			dao.connection();
			
			Scanner sc = new Scanner(System.in);
			
			System.out.print(">> 수정하고자 하는 번호를 입력해주세요. : ");
			String sid = sc.next();
			
			System.out.print(">> 수정하고자 하는 이름을 입력해주세요. : ");
			String name = sc.next();
			
			System.out.print(">> 변경하실 점수를 입력해주세요.(국어, 영어, 수학) : ");
			int kor = sc.nextInt();
			int eng = sc.nextInt();
			int mat = sc.nextInt();
			
			ScoreDTO dto = new ScoreDTO();
			dto.setSid(sid);
			dto.setName(name);
			dto.setKor(kor);
			dto.setEng(eng);
			dto.setMat(mat);
			
			dao.modify(dto);
			*/
			
			// 수정할 대상의 번호 입력받기
			Scanner sc = new Scanner(System.in);
			System.out.print("수정 대상의 번호를 입력하세요 : ");
			int sid = sc.nextInt();
			
			//-- 입력받은 번호로 점검해야 할 로직 적용 삽입 가능
			
			// 데이터베이스 연결
			dao.connection();
			
			// 수정할 대상 확인(수신)
			ArrayList<ScoreDTO> arrayList = dao.lists(sid);
			
			if (arrayList.size() > 0)
			{
				// 수신된 내용 출력
				System.out.println();
				System.out.println("번호  이름  국어  영어  수학  총점  평균  석차");
				for (ScoreDTO dto : arrayList)
				{
					System.out.printf("%3s %4s %4d %4d %4d %5d %5.1f %5d\n"
							  , dto.getSid(), dto.getName()
							  , dto.getKor(), dto.getEng(), dto.getMat()
							  , dto.getTot(), dto.getAvg(), dto.getRank());
				}
				
				// 대상에 대해 수정할 데이터 입력
				System.out.println();
                System.out.println("수정 데이터 입력(이름 국어 영어 수학) : ");
                String name = sc.next();
                int kor = sc.nextInt();
                int eng = sc.nextInt();
                int mat = sc.nextInt();
				
				// 입력된 데이터를 활용하여 ScoreDTO 객체 구성
                ScoreDTO dto = new ScoreDTO();
                dto.setName(name);
                dto.setKor(kor);
                dto.setEng(eng);
                dto.setMat(mat);
                dto.setSid(String.valueOf(sid));
				
				// 구성된 ScoreDTO 객체를 넘겨주며 dao 의 modify() 메소드 호출
                int result = dao.modify(dto);
                
                if (result > 0)
                {
                	System.out.println(">> 수정이 완료되었습니다.\n");
                }

			} 
			else
			{
				// 수신된 내용이 존재하지 않는 상황임을 전달(안내)
				System.out.println(">> 수정 대상이 존재하지 않습니다.\n");
			}
			
			// 데이터베이스 연결 종료
            dao.close();

		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
	}
	
	// 성적 삭제 기능
	public void sungjukDelete()
	{
		/*내가
		try
		{
			// 데이터베이스 연결
			dao.connection();
			
			Scanner sc = new Scanner(System.in);
			
			System.out.println(">> 삭제할 번호를 입력해주세요.");
			int sid = sc.nextInt();
			
			// 수정할 대상 확인(수신)
			ArrayList<ScoreDTO> arrayList = dao.lists(sid);
			
			if (arrayList.size() > 0)
			{
				int result = dao.remove(sid);
				
				if (result > 0)
				{
					System.out.println(">> 삭제가 완료되었습니다.");
				}
			}
			else
			{
				System.out.println(">> 삭제 대상이 존재하지 않습니다.");
			}
				
			// 데이터베이스 연결 종료
            dao.close();
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
		*/
		
		try
		{
			// 삭제할 번호 입력받기
			Scanner sc = new Scanner(System.in);
			System.out.print("삭제 대상의 번호를 입력하세요 : ");
			int sid = sc.nextInt();
			
			// 데이터베이스 연결
			dao.connection();
			
			// dao 의 lists() 메소드 호출 → sid 넘겨주며 삭제할 대상 검색
			ArrayList<ScoreDTO> arrayList = dao.lists(sid);
			
			// 삭제할 대상의 존재여부 확인
			if (arrayList.size() > 0)
			{
				// 수신된 내용 출력
				System.out.println();
				System.out.println("번호  이름  국어  영어  수학  총점  평균  석차");
				for (ScoreDTO dto : arrayList)
				{
					System.out.printf("%3s %4s %4d %4d %4d %5d %5.1f %5d\n"
							  , dto.getSid(), dto.getName()
							  , dto.getKor(), dto.getEng(), dto.getMat()
							  , dto.getTot(), dto.getAvg(), dto.getRank());
				}
				
				// 삭제 여부 확인
				System.out.println(">> 정말 삭제하시겠습니까?(Y/N) : ");
				String response = sc.next();
				if (response.equals("Y") || response.equals("y"))
				{
					// 삭제 처리
					int result = dao.remove(sid);
					
					if (result > 0)
					{
						System.out.println(">> 삭제가 완료되었습니다.\n");
					}
				}
				else
				{
					System.out.println(">> 취소되었습니다.\n");
				}
				
			} 
			else
			{
				// 삭제 대상으로 수신된 내용이 존재하지 않는 상황임을 전달(안내)
				System.out.println(">> 삭제할 대상이 존재하지 않습니다.\n");
			}
			
			// 데이터베이스 연결 종료
			dao.close();
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
	}
	
	
	
}

 

 

 

SocreMain.java

○ 성적 처리 → 데이터베이스 연동(데이터베이스 연결 및 액션 처리)
    - ScoreDTO 클래스 활용(속성만 존재하는 클래스 , getter / setter 구성)
    - ScoreDAO 클래스 활용(데이터베이스 액션 처리)
    - Process 클래스 활용(업무 단위 기능 구성)
    - DBConn 클래스(데이터베이스 연결 전담 전용 객체 처리)

여러 명의 이름, 국어점수, 영어점수, 수학점수를 입력받아
총점, 평균, 석차 등을 계산하여 출력하는 프로그램을 구현한다.
※ 이 과정에서 업무 단위로 기능을 묶어 사용할 수 있는 서브 메뉴를 구성한다. → Process 클래스 활용

실행 예)

=====[ 성적 처리 ]=====
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
=====[ 성적 처리 ]=====
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
=======================
>> 선택(1~5, -1종료) : -1

>> 프로그램이 종료되었습니다.

*/

/*=================
   ScoreMain.java
==================*/


package com.test;

import java.util.Scanner;

public class ScoreMain
{
	public static void main(String[] args)
	{
		Process prc = new Process();
		Scanner sc = new Scanner(System.in);
		
		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.print(">> 선택(1~5, -1종료) : ");

			String menus = sc.next();
			
			//-- 필요에 따라 입력값에 대한 유효성 검사 코드 삽입 가능
			
			try
			{
				int menu = Integer.parseInt(menus);
				
				if (menu == -1)
				{
					System.out.println();
					System.out.println(">> 프로그램이 종료되었습니다.");
					return;
				}
				
				switch (menu)
				{
					case 1:
						// 성적 입력 기능 수행
						prc.sungjukInsert();
						break;
					case 2:
						// 성적 전체 출력 기능 수행
						prc.sungjukSelectAll();
						break;
					case 3:
						// 이름 검색 출력 기능 수행
						prc.sungjukSearchName();
						break;
					case 4:
						// 성적 수정 기능 수행
						prc.sungjukUpdate();
						break;
					case 5:
						// 성적 삭제 기능 수행
						prc.sungjukDelete();
						break;
				}
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
		} while (true);
	}
}

 


! 현재 배워가고 있는 주인장이 쓴 글이니 정보의 정확성에 유의하시기바랍니다 !