오늘보다 더 나은 내일의 나에게_

비전공자의 IoT 국비 교육 수강일지 Day_19 본문

비전공자의 코딩일지

비전공자의 IoT 국비 교육 수강일지 Day_19

chan_96 2022. 1. 13. 20:56
728x90

JDBC

 

예제 SMHRD 학생관리 프로그램


Oracle SQL Developer 설정 및 테이블 생성
더보기
ORACLE SQL Developer 계정 접속 설정 및 테스트

 

STUDENT 테이블 추가 및 조회

메뉴 1) 학생 추가
학생추가

메뉴 2) 전체 명단 조회
전체명단조회

메뉴 3) 특정 학생조회
특정학생조회

메뉴 4) 학생정보 수정 
전화번호 수정
이메일 수정

메뉴 5) 학생 삭제 
학생삭제 / 후 출력

더보기
StudentVO 클래스 => Model 부분
package Model;

public class StudentVO {
	//필드 : 학생번호, 이름, 나이, 전화번호, 이메일
	private int num;
	private String name;
	private int age;
	private String tel;
	private String email;
	
	//생성자
	public StudentVO() {}
	public StudentVO(int num, String name, int age, String tel, String email) {
		this.num = num;
		this.name = name;
		this.age = age;
		this.tel = tel;
		this.email = email;
	}
	
	//메서드
	public int getNum() {
		return num;
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public String getTel() {
		return tel;
	}

	public String getEmail() {
		return email;
	}
}​

StudentDAO 클래스 => View & Controller
package Model;

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

//DAO(Data Access Object) : 데이터베이스 관련 작업을 전담하는 클래스
//데이터베이스 연결, (입력, 수정, 삭제, 조회)등의 작업을 하는 클래스
//CRUD(Create(입력), Read(조회), Update(수정), Delete(삭제))
public class StudentDAO {
	Connection conn = null;
	PreparedStatement pst = null;
	ResultSet rs = null;
	
	//DB 연결 메서드
	public void connect() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "hr";
			
			//2. 사용할 계정 선택, db 연결 객체(Connection) 생성
			conn = DriverManager.getConnection(url, user, password);			
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	//사용한 객체들 반환(종료)
	public void close() {
		try {
			if(rs != null) {
				rs.close(); //selectStds(), selectOneStd()에서만 사용하는 객체				
							//ResultSet 객체가 생성되었을때만 호출 가능한 메서드
			}
			if(pst != null) {
				pst.close();				
			}
			if(conn != null) {
				conn.close();				
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	//기능1. 사용자가 입력한 값을 STUDENT 테이블에 삽입 (학생추가)
	public boolean insertStd(String name, int age, String tel, String email) {
		//JAVA - Oracle DB : JDBC java api
		
		boolean check = false;
		
		try { //실행할 코드
			//1. Oracle JDBC driver 동적로딩(실행할때 가지고 오겠다!)
			//try ~ catch : 예외처리를 할 때 사용
			
			//오류1. 컴파일오류 : 코드자체가 틀림(오타, 변수이름, 구문오류)
			//오류2. 런타임오류 : 코드가 틀린것은 아님, 실행했을 때 오류가 나는 경우
			//-> 런타임오류는 실행전에는 오류가 발생할지 알 수 없음 -> 예외처리를 해줘야함
			
			//ClassNotFoundException 발생할 수 있음
			//1. 프로젝트에 ojdbc 라이브러리를 추가하였는지 확인
			//2. 오타확인
			connect();
			
			//3. 실행할 sql문(String) 정의
			//? : 바인드변수
			//java로 실행하는 sql문은 모두 auto commit : 모든 sql문 뒤에는 ; 적으면 안됨!
			String sql = "INSERT INTO STUDENT VALUES(STDSEQ.nextval, ?, ?, ?, ?)";
			
			//4. sql구문 준비 객체(PreparedStatement) 생성
			pst = conn.prepareStatement(sql);
			
			//5. 바인드 변수 채우기
			//set()메서드 ex) setString(), setInt()
			pst.setString(1, name);
			pst.setInt(2, age);
			pst.setString(3, tel);
			pst.setString(4, email);
			
			//6. sql문 실행하여 결과 처리
			//executeUpdate() : insert, delete, update -> table상에 변화가 일어남
			//반환타입 : int (-> table상에서 몇개의 행이 수정이 되었는지를 반환) 
			// 수정이 제대로 일어난 경우에는 항상 0보다 큰 값을 반환
			//excuteQuery() : select -> 검색 (table 상에 변화가 일어나지 않음)
			//반환타입 : ResultSet 객체
			
			int cnt = pst.executeUpdate();
			
			if(cnt>0) {//추가 성공
				check = true;
			}else { //추가 실패 
				check = false;
			}
			
		//catch : try내에서 예외상황이 발생한 경우 catch문으로 들어오게됨
		} catch (Exception e) { //ClassNotFoundException만 처리 가능
			//Exception e -> 모든 예외상황을 처리 가능s
			//발생한 예외상황을 발생 순서대로 출력(어디에서 예외상황이 발생했고
			//무엇때문에 발생했는지를 콘솔창에서 직접 확인)
			e.printStackTrace(); // 개발중에 사용
			System.out.println("지금은 준비중입니다");
		//finally : try문에서 예외상황이 발생하던지/발생하지 않던지 마지막에 무조건 실행
		//옵션(써도 되고 안써도 되고)
		}finally {
			//사용한 객체들(Connection, PreparedStatement) 마무리(반환)
			//닫을 때 순서! : 생성한 순서 반대로
			close();
		}
		return check;
	}//end of method
	
	public ArrayList<StudentVO> selectStds() {
		ArrayList<StudentVO> al = new ArrayList<StudentVO>();
		
		try {
			//1. jdbc 드라이버 동적로딩
			connect();
			
			//3. 실행할 sql문 정의
			String sql = "SELECT * FROM STUDENT";
			
			//4. sql 구문 준비 객체(PreparedStatement) 생성
			pst = conn.prepareStatement(sql);
			
			//5. sql문을 실행하고 결과 처리
			rs = pst.executeQuery();
			
			//STUDENT 테이블에 값을 읽어서 출력
			while(rs.next()) {
				
				int num = rs.getInt(1); //현재 커서가 가르키고 있는 행의 첫번째 컬럼값을 읽어오겠다!
				String name = rs.getString("NAME"); //컬럼이름과 일치하게 작성
				//String name = rs.getString(2);
				int age = rs.getInt("AGE");
				String phone = rs.getString("PHONE");
				String email = rs.getString("EMAIL");
				
				//위에서 읽어온 값들로 초기화시켜 생성한 StudentVO 객체의 참조값을
				//ArrayList에 추가
				al.add(new StudentVO(num, name, age, phone, email));
				
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally {
			//객체들(Connection, PreparedStatement, ResultSet) 마무리
			close();
		}
		
		return al;
	}//end of insertStd
	
	public StudentVO selectOneStd(int num) {
		//selectStd 수정 : ArrayList에 담을 필요없음!
		//sql문 수정 (조건이 필요! : 학생번호(사용자 입력)로 검색), insert참고
		//반환타입, 매개변수 결정
		
		StudentVO vo = null;
		
		try {
			connect();
			
			String sql = "SELECT * FROM STUDENT WHERE NUM = ?";
			
			pst = conn.prepareStatement(sql);
			pst.setInt(1, num);
			rs = pst.executeQuery();
			
			//sql문 실행시 where조건절으로 특정한 번호를 가진 학생만 검색
			//-> resultset 상에 해당 번호가 table상에 존재하면 최대 1명에 대한 데이터만 존재
			//존재하지 않으면 데이터 x
			if(rs.next()) {
				int get_num = rs.getInt("NUM"); //현재 커서가 가르키고 있는 행의 첫번째 컬럼값을 읽어오겠다!
				String name = rs.getString("NAME"); //컬럼이름과 일치하게 작성
				//String name = rs.getString(2);
				int age = rs.getInt("AGE");
				String phone = rs.getString("PHONE");
				String email = rs.getString("EMAIL");
				
				vo = new StudentVO(get_num, name, age, phone, email);	
			}else {
				vo = new StudentVO();
			}
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return vo;
	}// end of selectOneStd
	
	public boolean updatePhone(int num, String phone) {
		boolean check = false;
		
		try {
			//1. jdbc 드라이버 동적 로딩
			connect();
			
			String sql = "UPDATE STUDENT SET PHONE = ? WHERE NUM = ?";
			
			//4. sql구문 준비객체(PreparedStatement) 생성
			pst = conn.prepareStatement(sql);
			
			//5. 바인드 변수 채우기
			pst.setString(1, phone);
			pst.setInt(2, num);
			
			//6.sql문 실행, 결과처리
			//executeUpdate()반환 타입 int
			int cnt = pst.executeUpdate();
			
			if(cnt > 0) { // 수정이 된 경우에만 check를 true값으로 변경
				check = true;
			}
			
		}catch (Exception e){
			e.printStackTrace();
		}finally {
			close();
		}
		return check;
	} // end of update
	public boolean updateEmail(int num, String email) {
		boolean check = false;
		
		try {
			//1. jdbc 드라이버 동적 로딩
			connect();
			
			String sql = "UPDATE STUDENT SET EMAIL = ? WHERE NUM = ?";
			
			//4. sql구문 준비객체(PreparedStatement) 생성
			pst = conn.prepareStatement(sql);
			
			//5. 바인드 변수 채우기
			pst.setString(1, email);
			pst.setInt(2, num);
			
			//6.sql문 실행, 결과처리
			//executeUpdate()반환 타입 int
			int cnt = pst.executeUpdate();
			
			if(cnt > 0) { // 수정이 된 경우에만 check를 true값으로 변경
				check = true;
			}
			
		}catch (Exception e){
			e.printStackTrace();
		}finally {
			close();
		}
		return check;
	}
	
	public boolean deleteStd(int num) {
		boolean check = false;
		
		try {
			connect();
			
			String sql = "DELETE FROM STUDENT WHERE NUM = ?";
			
			//4.sql 구문 준비 객체(PreparedStatement) 생성
			pst = conn.prepareStatement(sql);
			
			//5.바인드 변수 채우기
			pst.setInt(1, num);
			
			//6. sql문 실행하고 결과처리
			int cnt = pst.executeUpdate();
			
			if(cnt > 0) {//제대로 삭제 되었을때
				check = true;
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			close();
		}
		return check;
	}// end of deleteStd
}// end of class​

 

출력할 Main 클래스
package View_Controller;

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

import Model.StudentDAO;
import Model.StudentVO;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		StudentDAO dao = new StudentDAO();
		
		System.out.println("=====================SMHRD학생관리프로그램=====================");
		
		while(true) {
			System.out.println("1.학생추가 2.전체명단조회 3.특정학생조회 4.학생정보수정 5.학생삭제 6.프로그램종료");
			System.out.print("메뉴 선택 >> ");
			int menu = sc.nextInt();
			
			if(menu == 1) {
				System.out.println("등록할 학생의 정보를 입력하시오");
				System.out.print("이름 : ");
				String name = sc.next();
				System.out.print("나이 : ");
				int age = sc.nextInt();
				System.out.print("전화번호 : ");
				String tel = sc.next();
				System.out.print("이메일 : ");
				String email = sc.next();
				
				
				boolean check = dao.insertStd(name, age, tel, email);
				
				if(check) {
					System.out.println("학생 정보 추가 성공했습니다");
				}else {
					System.out.println("학생 정보 추가 실패했습니다");					
				}
				
			}else if(menu == 2) {
				
				ArrayList<StudentVO> al = dao.selectStds();
				
				for(StudentVO vo:al) {
					System.out.println("===========================");
					System.out.println("학생번호 : " + vo.getNum());
					System.out.println("학생이름 : " + vo.getName());
					System.out.println("학생나이 : " + vo.getAge());
					System.out.println("학생전화번호 : " + vo.getTel());
					System.out.println("학생이메일 : " + vo.getEmail());
				}
				
				/*
				for(int i = 0;i < al.size();i++) {
					System.out.println("===========================");
					System.out.println("학생번호 : " + al.get(i).getNum());
					System.out.println("학생이름 : " + al.get(i).getName());
					System.out.println("학생나이 : " + al.get(i).getAge());
					System.out.println("학생전화번호 : " + al.get(i).getTel());
					System.out.println("학생이메일 : " + al.get(i).getEmail());
				}
				*/
				
			}else if(menu == 3) {
				//1. 학생번호 검색(입력)
				//2. DAO객체가 가지고 있는 selectOneStd 호출 -> StudentVO 반환
				System.out.print("학생번호 입력 : ");
				int num = sc.nextInt();
				
				StudentVO vo = dao.selectOneStd(num);
				//입력한 학생번호가 Student table의 num 컬럼값으로 존재하는 경우에는
				//StudentVO 객체가 생성이됨
				//존재하지 않는 경우에는 객체가 생성이 되지 않고 초기값이 null 이 반환 됨
				
				if(vo!= null) {
					System.out.println("학생 번호 : "+ vo.getNum());
					System.out.println("학생이름 : " + vo.getName());
					System.out.println("학생나이 : " + vo.getAge());
					System.out.println("학생전화번호 : " + vo.getTel());
					System.out.println("학생이메일 : " + vo.getEmail());
				}else {
					System.out.println("없는 학생입니다");
				}
			}else if(menu == 4) {
				System.out.print("수정할 학생의 번호 입력 : ");
				int num = sc.nextInt();
				
				StudentVO vo = dao.selectOneStd(num);
				//입력한 학생번호가 Student table의 num 컬럼값으로 존재하는 경우에는
				//StudentVO 객체가 생성이 됨
				//존재하지 않는 경우에는 객체가 생성이 되지 않고 초기값이 null 이 반환 됨
				
				if(vo!= null) {
					System.out.println("학생 번호 : "+ vo.getNum());
					System.out.println("학생이름 : " + vo.getName());
					System.out.println("학생나이 : " + vo.getAge());
					System.out.println("학생전화번호 : " + vo.getTel());
					System.out.println("학생이메일 : " + vo.getEmail());
					
					System.out.println();
					System.out.print("수정할 정보 선택(1.전화번호 2.이메일) : ");
					int select_num = sc.nextInt();
					
					if(select_num==1) {
						System.out.print("수정할 번호 : ");
						String update_phone = sc.next();
						
						boolean check = dao.updatePhone(num, update_phone);
						
						if(check == true) {
							System.out.println("학생 번호 수정 성공했습니다");
						}else {
							System.out.println("학생 번호 수정 실패했습니다");
						}
						
					}else if(select_num==2) {
						System.out.print("수정할 이메일 : ");
						String update_email = sc.next();
						
						boolean check = dao.updateEmail(num, update_email);
						
						if(check == true) {
							System.out.println("학생 이메일 수정 성공했습니다");
						}else {
							System.out.println("학생 이메일 수정 실패했습니다");
						}
						
					}else {
						System.out.println("잘못 입력하셨습니다");
					}
					
				}else {
					System.out.println("없는 학생입니다");
				}
			}else if(menu == 5) {

				System.out.print("삭제할 학생 번호 입력 : ");
				int num = sc.nextInt();
				
				boolean check = dao.deleteStd(num);
				
				if(check) {
					System.out.println("학생 삭제 성공했습니다");
				}else {
					System.out.println("학생 삭제 실패했습니다");					
				}
				
			}else if(menu == 6) {
				System.out.println("종료되었습니다");
				break;
			}
		} // end of while
	}
}​

 

 

학생관리 프로그램 추가 내용 정리

oracle driver 연결을 하려면 프로젝트 BuildPath에 ojdbc를 추가해줘야한다!

ojdbc6 추가




StudentDAO 6개의 메서드에 중복되는 내용들을 따로 메서드로 만들어 코드를 간략하게 해 줄 수 있다

DB연결 메서드

반드시 필요한 메서드이고 중복되기 때문에 따로 메서드를 만들어 필요한 곳에 호출!
conn 객체를 사용하기 위해 클래스 최상단에 Connection 객체를 선언해주고 예외처리를 해준다!



객체 반환 예외처리 메서드

객체 사용한 후  반드시 반환을 해야 하는데 반복되므로 따로 메서드로 만들어준다!

 

728x90
Comments