열심히 끝까지

디바이스 융합 자바(Java) day21 - 학생부 with MVC, Oracle 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day21 - 학생부 with MVC, Oracle

노유림 2022. 7. 5. 17:13

>> StudentVO

package model;

public class StudentVO {
	private int sid;
	private String name;
	private int score;
	public int getSid() {
		return sid;
	}
	public void setSid(int sid) {
		this.sid = sid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScore() {
		return score;
	}
	public void setScore(int score) {
		this.score = score;
	}
	@Override
	public String toString() {
		return "StudentVO [sid=" + sid + ", name=" + name + ", score=" + score + "]";
	}
	
	
	
}

 

>> StudentDAO

 

pstmt.executeUpdate();
>> CUD insert() update() delete()
>> 이 세개를 테이블에 업데이트 할 때 사용 

pstmt.executeQuery();
>> R selectOne() selectAll()
>> R을 불러올 때 사용

package model;

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

public class StudentDAO {

	// int pk;
	// ArrayList<> datas 필요했지만 이제 필요없당!!
	Connection conn;
	// Statement stmt;
	PreparedStatement pstmt; 
	// statement의 자식 >> stmt의 향상된 버전이다!
	final String sql_insert ="INSERT INTO STUDENT VALUES((SELECT NVL(MAX(SID),0)+1 FROM STUDENT),?,?)";
	final String sql_delete ="DELETE FROM STUDENT WHERE SID=?";
	final String sql_update ="UPDATE STUDENT SET SCORE=? WHERE SID=?";
	final String sql_selectAll ="SELECT * FROM STUDENT WHERE NAME LIKE '%'||?||'%' ORDER BY SID ASC";
	// JDBC에서는 이름을 검색할 때에는 '%'||?||'%'로 해야한다.
	final String sql_selectOne ="SELECT * FROM STUDENT WHERE SID=?";

	public boolean insertStudent(StudentVO vo) {
		conn = JDBCUtil.connect();
		try {

			// stmt = conn.createStatement();
			pstmt = conn.prepareStatement(sql_insert);
			// stmt -> 일단 만들고, 직접 코드를 메서드의 인자로 전달
			// pstmt -> 만들 당시에 쿼리문(SQL문)을 전달하고, 이후의 값을 메서드의 인자로 전달

			// stmt.executeQuery(driverName);
			// ?위치에 내가 원하는 값을 전달하는 방법 >> pstmt 사용
			/*
			pstmt.executeQuery(); // R selectOne() selectAll()
			pstmt.executeUpdate(); // CUD insert() update() delete()
			 */

			pstmt.setString(1, vo.getName());
			// 1은 ?의 몇번째 자리 
			// ? 카운팅은 1부터 센다!
			pstmt.setInt(2, vo.getScore());
			int res = pstmt.executeUpdate();
			if(res == 0) {
				return false;
			}
			System.out.println("     로그 : insertStudent() 완료");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		finally {
			JDBCUtil.disconnect(pstmt, conn);
		}

		return true;
	}
	public boolean updateStudent(StudentVO vo) {
		conn=JDBCUtil.connect();

		try {
			pstmt = conn.prepareStatement(sql_update);
			pstmt.setInt(1, vo.getScore());
			pstmt.setInt(2, vo.getSid());
			int res = pstmt.executeUpdate();
			if(res == 0) {
				return false;
			}
		}catch(SQLException e) {
			e.printStackTrace();
			return false;
		}finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
	public boolean deleteStudent(StudentVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt = conn.prepareStatement(sql_delete);
			pstmt.setInt(1, vo.getSid());
			int res = pstmt.executeUpdate();
			if(res == 0) {
				return false;
			}
		}catch(SQLException e) {
			e.printStackTrace();
			return false;
		}finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return true;
	}
	public StudentVO selectOne(StudentVO vo) {
		conn=JDBCUtil.connect();
		ResultSet rs = null; // scope 공부
		try {
			pstmt = conn.prepareStatement(sql_selectOne);
			pstmt.setInt(1, vo.getSid());
			rs = pstmt.executeQuery();

			if(rs.next()) {
				StudentVO data = new StudentVO();
				data.setName(rs.getString("NAME"));
				data.setScore(rs.getInt("SCORE"));
				data.setSid(rs.getInt("SID"));
				return data;
			}
			else {
				return null;
			}
		}catch(SQLException e) {
			e.printStackTrace();
			return null;
		}finally {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			JDBCUtil.disconnect(pstmt, conn);
		}
	}
	public ArrayList<StudentVO> selectAll(StudentVO vo){
		ArrayList<StudentVO> datas= new ArrayList<StudentVO>();
		conn=JDBCUtil.connect();
		try {
			pstmt = conn.prepareStatement(sql_selectAll);
			pstmt.setString(1, vo.getName());
			ResultSet rs = pstmt.executeQuery();

			while(rs.next()) {
				StudentVO data = new StudentVO();// vo 만들어서
				// vo에 setter
				data.setName(rs.getString("NAME"));
				data.setSid(rs.getInt("SID"));
				data.setScore(rs.getInt("SCORE"));
				// vo를 
				datas.add(data);
			}
			
			rs.close();
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return datas;
	}

}

 

 

>> Test

- JDBCUtil
   1) C R R U D 에서 많이 쓰인다
   2) DAO가 증가하면 또 CRUD도 증가됨 -> ...
         >> 커넥션 연결하고 해제하는 것이 계속 되자..
         >> CTRL + C / CTRL + V 
             : 코드 재사용 중복 코드 최소화 -> 모듈화 Util 클래스 생성!
- Util류 클래스
   : static 로직을 담아놓는 클래스라서..

package main;

import java.util.ArrayList;
import java.util.Scanner;

import model.StudentDAO;
import model.StudentVO;

// C
// V
// Client
public class Test {
	public static void main(String[] args) {
		
		StudentDAO sDAO = new StudentDAO();
		
		Scanner sc = new Scanner(System.in);
		
		while(true) {
			System.out.println();
			System.out.println("1.추가 2.목록 3.검색 4.변경 5.삭제 6.종료 7.이름검색");
			System.out.print("입력) ");
			int act = sc.nextInt();
			if(act==1) {
				System.out.print("학생이름입력) ");
				String name = sc.next();
				System.out.print("학생성적입력) ");
				int score = sc.nextInt();
				// [V]
				
				StudentVO vo = new StudentVO();
				vo.setName(name);
				vo.setScore(score);
				// [C] - 1
				
				if(sDAO.insertStudent(vo)) {
					System.out.println("학생추가 완료되었습니다.");
				}
				else {
					System.out.println("학생추가 실패했습니다...");
				}
				// [C] - 2 vo값 sDAO에게 보내주기
				
			}
			else if(act==2) {
				StudentVO vo = new StudentVO();
				ArrayList<StudentVO> datas = sDAO.selectAll(vo);
				if(datas.size()==0) {
					System.out.println("출력할 학생데이터가 없습니다...");
					continue;
				}
				System.out.println("===학생 목록===");
				for(StudentVO data : datas) {
					System.out.println(data);
				}
			}
			else if(act==3) {
				// selectOne() 써볼까?
				// -> 2개 이상이면 절대 안된다!
				// 검색할 때 pk로만 검색 가능!
				System.out.print("검색할 학생 번호 입력 : ");
				int sid = sc.nextInt();
				// [V]
				
				StudentVO vo = new StudentVO();
				vo.setSid(sid);
				vo = sDAO.selectOne(vo);
				if(vo==null) {
					System.out.println("검색 실패..");
					continue;
				}
				System.out.println(vo);	
			}
			else if(act==4) {
				StudentVO vo = new StudentVO();
				System.out.print("점수를 바꿀 학생번호 입력 : ");
				int sid = sc.nextInt();
				System.out.print("바뀐 점수 : ");
				int score = sc.nextInt();
				
				vo.setSid(sid);
				vo.setScore(score);
				
				if(sDAO.updateStudent(vo)) {
					System.out.println("성적이 업데이트 되었습니다");
				}
				else {
					System.out.println("성적 업데이트를 실패하였습니다...");
				}
			}
			else if(act==5) {
				System.out.print("삭제할 학생번호 입력 :  ");
				int sid = sc.nextInt();
				// [V]
				
				StudentVO vo = new StudentVO();
				vo.setSid(sid);
				// [C] - 1
				
				if(sDAO.deleteStudent(vo)) {
					System.out.println("학생삭제 완료되었습니다.");
				}
				else {
					System.out.println("학생삭제 실패했습니다...");
				}
			}
			else if(act==6) {
				break;
			}
			else if(act==7) {
				// selectAll()
				System.out.print("검색어 입력 : ");
				String str = sc.next();
				//[V]
				
				StudentVO vo = new StudentVO();
				vo.setName(str);
				ArrayList<StudentVO> datas = sDAO.selectAll(vo);
				//[C]
				if(datas.size()==0) {
					System.out.println("검색결과없음...");
					continue;
				}
				System.out.println("===학생목록===");
				for(StudentVO data : datas) {
					System.out.println(data);
				}
				
			}
		}
	}
}

 

>> JDBCUtil

package model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCUtil {
	// JDBCUtil
	//   1) C R R U D 에서 많이 쓰인다
	//   2) DAO가 증가하면 또 CRUD도 증가됨 -> ...
	//         >> 커넥션 연결하고 해제하는 것이 계속 되자..
	//         >> CTRL + C / CTRL + V 
	//             : 코드 재사용 중복 코드 최소화 -> 모듈화 Util 클래스 생성!
	// Util류 클래스
	//   : static 로직을 담아놓는 클래스라서..
	
	static final String driverName = "oracle.jdbc.driver.OracleDriver";
	static final String url = "jdbc:oracle:thin:@localhost:1521:xe";
	static final String user = "ryo";
	static final String passwd = "1234";
	
	// conn 객체 반환
	public static Connection connect() { // Connection 확보 로직
		Connection conn = null;
		try {
			Class.forName(driverName);
			
			conn = DriverManager.getConnection(url, user, passwd);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return conn;
	}
	// conn 객체 받아서 연결해제
	public static void disconnect(PreparedStatement pstmt, Connection conn) {
		try {
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}