ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 007. PreparedStatement / 성적 처리 프로그램 구현
    SsY/Class 2023. 5. 2. 10:10
    728x90
    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
Designed by planet-si