[JDBC] 학생 관리 프로그램 (feat. Statment)

JoJo·2023년 7월 24일
0
post-custom-banner

💡 Statment 를 사용한 학생 관리 프로그램


✔️ model.vo

package com.kh.jdbc.day02.student.model.vo;                                                           
                                                                                                      
import java.sql.Date;                                                                                 
                                                                                                      
public class Student {                                                                                
	private String studentId;                                                                         
	private String studentPwd;                                                                        
	private String studentName;                                                                       
	private char gender;                                                                              
	private int age;                                                                                  
	private String email;                                                                             
	private String phone;                                                                             
	private String address;                                                                           
	private String hobby;                                                                             
	private Date enrollDate;	// sql.date import         

	// 기본 생성자
	public Student() {}
	
	// 매개변수 생성자
	
	
	
	public Student(String studentId, String studentPwd, String studentName, char gender, int age, String email,
			String phone, String address, String hobby) {
		super();
		this.studentId = studentId;
		this.studentPwd = studentPwd;
		this.studentName = studentName;
		this.gender = gender;
		this.age = age;
		this.email = email;
		this.phone = phone;
		this.address = address;
		this.hobby = hobby;
	}


	
	public Student(String studentId, String studentPwd, String email, String phone, String address, String hobby) {
		super();
		this.studentId = studentId;
		this.studentPwd = studentPwd;
		this.email = email;
		this.phone = phone;
		this.address = address;
		this.hobby = hobby;
	}

	// getter, setter 메소드
	public String getStudentId() {
		return studentId;
	}

	public void setStudentId(String studentId) {
		this.studentId = studentId;
	}

	public String getStudentPwd() {
		return studentPwd;
	}

	public void setStudentPwd(String studentPwd) {
		this.studentPwd = studentPwd;
	}

	public String getStudentName() {
		return studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

	public char getGender() {
		return gender;
	}

	public void setGender(char gender) {
		this.gender = gender;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getHobby() {
		return hobby;
	}

	public void setHobby(String hobby) {
		this.hobby = hobby;
	}

	public Date getEnrollDate() {
		return enrollDate;
	}

	public void setEnrollDate(Date enrollDate) {
		this.enrollDate = enrollDate;
	}
	
	// toString 오버라이드 - 정보 확인용
	@Override
	public String toString() {
		return "학생 [아이디 =" + studentId + ", 비밀번호 =" + studentPwd + ", 이름 =" + studentName
				+ ", 성별 =" + gender + ", 나이 =" + age + ", 이메일 =" + email + ", 전화번호=" + phone + ", 주소 ="
				+ address + ", 취미 =" + hobby + ", 가입날짜 =" + enrollDate + "]";
	}
	
}                                                                                             
                                                                                                      

✔️ run

package com.kh.jdbc.day02.student.run;

import com.kh.jdbc.day02.student.view.StudentView;

public class StudentRun {

	public static void main(String[] args) {
		
		StudentView view = new StudentView();
		view.startProgram();
		
	}

}

✔️ view

package com.kh.jdbc.day02.student.view;

import java.util.*;

import com.kh.jdbc.day02.student.controller.StudentController;
import com.kh.jdbc.day02.student.model.vo.Student;

public class StudentView {
	
	private StudentController controller;
	
	public StudentView() {
		controller = new StudentController();
	}
	
	public void startProgram() {
		Student student = null;
		List<Student> sList = null;
		finish:
		while(true) {
			int choice = printMenu();
			switch(choice) {
				case 1 : 
					// SELECT * FROM STUDENT_TBL
					// 쿼리문을 보고 전달값과 리턴값을 예상해 볼 수 없음.
					// 쿼리문이 전체 정보이기 때문에 리턴 타입이 List 여야 함.
					sList = controller.printStudentList();
					if(!sList.isEmpty()) {	// 데이터가 비어있는지 여부 체크!, 데이터가 없을 때 출력하지 않음
						showAllStudents(sList);
					} else {
						displayError("학생 정보가 조회되지 않습니다.");
					}
					break;
				case 2 : 
					// 학생 아이디로 조회
					// 아이디로 조회하는 쿼리문 생각해보기(리턴형은 무엇으로? 매개변수는 무엇으로?)
					// SELECT * FROM STUDENT_TBL WHERE STUDENT_ID = 'khuser01'
					// printStudentById() 메소드가 학생 정보를 조회, dao의 메소드는 selectOneById()로 명명
					// showStudent() 메소드로 학생 정보를 출력
					String studentId = inputStudentId();
					// studentId 는 PRIMARY KEY 이기 때문에 1개의 값만 존재해서 List로 리턴을 받지 않는다.
					student = controller.printStudentById(studentId);
					if(student != null) {
						showStudent(student);
					}else {
						displayError("학생 정보가 존재하지 않습니다.");
					}
					break;
				case 3 : 
					// 학생 이름으로 조회
					// 쿼리문 생각해보기 (매개변수 유무, 리턴형은?)
					// SELECT * FROM STUDENT_TBL WHERE STUDENT_NAME = 'admin'
					// printStudentByName, printStudentsByName (?)
					// selectOneByName, selectAllByName (?)
					// showStudent, showAllStudents (?)
					String studentName = inputStudentName();
					sList = controller.printStudentsByName(studentName);
					if(!sList.isEmpty()) {
						showAllStudents(sList);
					} else {
						displayError("학생 정보가 조회되지 않습니다.");
					}
					break;
				case 4 : 
					// ***** 실행해서 학생 정보를 추가하면 sql 에도 추가됨! *****
					// INSERT INTO STUDENT_TBL VALUES('admin', 'admin', '관리자', 'M', 30, 'admin@iei.or.kr'
					// , '01012345678', '서울시 강남구 역삼동 테헤란로 7', '기타,독서,운동', '16/03/15');
					// 담을 데이터가 많아서 Student 객체에 담아서 관리
					// 추가할 학생 정보 입력
					student = inputStudent();
					// 값을 받기만 하면 되는거라 후처리가 필요 없다.
					// sql 에서 추가할 때 ex. 1행 이가 추가되었습니다. 라고 뜸.
					// 행이 추가되는거라 int 타입으로 리턴받아야 함.
					int result = controller.insertStudent(student);	
					// result 값이 0 보다 커야 성공
					if(result > 0) {
						// 성공 메세지 출력
						displaySuccess("학생 정보 등록 성공!");
					} else {
						// 실패 메세지 출력
						displayError("학생 정보 등록 실패");
					}
					break;
				case 5 : 
					// UPDATE STUDENT_TBL SET STUDENT_PWD = 'pass11', EMAIL = 'khuser11@iei.or.kr'
					// , PHONE = '01022222222', HOBBY = '코딩, 수영' WHERE STUDENT_ID = 'khsuer03';
					student = mondifyStudent();
					result = controller.modifyStudent(student);
					if(result > 0) {
						// 성공 메세지 출력
						displaySuccess("학생 정보 수정 성공!");
					} else {
						// 실패 메세지 출력
						displayError("학생 정보 수정 실패");
					}
					break;
				case 6 : 
					// 쿼리문 생각해보기(매개변수 필요 유무, 반환형?)
					// DELETE FROM STUDENT_TBL WHERE STUDENT_ID = 'khuser06';
					studentId = inputStudentId();
					// 1 행 이(가) 삭제되었습니다.
					// sql 에서 실행할 때 뜨는 메세지로, 1행 즉, 숫자가 반환된다.
					// 쿼리문을 보고 해당 매개변수의 존재여부, 갯수, 반환형을 미리 예측해서 설계해야한다.
					// 항시 설계 먼저 하고 코딩하기.
					result = controller.deleteStudent(studentId);
					if(result > 0) {
						displaySuccess("학생 정보 삭제 성공!");
					} else {
						// 실패 메세지 출력
						displayError("학생 정보 삭제 실패");
					}
					break;
				case 0 : 
					break finish;
			}
		}
		
	}


	// 메뉴 
	public int printMenu() {
		Scanner sc = new Scanner(System.in);
		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("6. 학생 정보 삭제");
		System.out.println("0. 프로그램 종료");
		System.out.print("메뉴 선택 : ");
		int input = sc.nextInt();
		return input;
	}

	// 학생 아이디 검색
	private String inputStudentId() {
		Scanner sc = new Scanner(System.in);
		System.out.println("===== 학생 아이디로 조회 =====");
		System.out.print("학생 아이디 입력 : ");
		String studentId = sc.next();
		return studentId;
	}

	// 학생 이름으로 검색
	private String inputStudentName() {
		Scanner sc = new Scanner(System.in);
		System.out.println("===== 학생 이름으로 조회");
		System.out.print("학생 이름 입력 : ");
		String studentName = sc.next();
		return studentName;
	}

	// 학생 정보 등록
	private Student inputStudent() {
		Scanner sc = new Scanner(System.in);
		System.out.print("아이디 : ");
		String studentId = sc.next();
		System.out.print("비밀번호 : ");
		String studentPw = sc.next();
		System.out.print("이름 : ");
		String studentName = sc.next();
		System.out.print("성별 : ");
		char gender = sc.next().charAt(0);
		System.out.print("나이 : ");
		int age = sc.nextInt();
		System.out.print("이메일 : ");
		String email = sc.next();
		System.out.print("전화번호 : ");
		String phone = sc.next();
		System.out.print("주소 : ");
		sc.nextLine();	// 공백 제거, 엔터 제거
		String address = sc.nextLine();
		System.out.print("취미(,로 구분) : ");
		String hobby = sc.nextLine();
		Student student = new Student(studentId, studentPw, studentName, gender, age, email, phone, address, hobby);
		return student;
	}

	private Student mondifyStudent() {
		Scanner sc = new Scanner(System.in);
		System.out.println("===== 학생 정보 수정 =====");
		System.out.print("아이디 : ");
		String studentId = sc.next();
		System.out.print("비밀번호 : ");
		String studentPw = sc.next();
		System.out.print("이메일 : ");
		String email = sc.next();
		System.out.print("전화번호 : ");
		String phone = sc.next();
		System.out.print("주소 : ");
		sc.nextLine();	// 공백 제거, 엔터 제거
		String address = sc.nextLine();
		System.out.print("취미(,로 구분) : ");
		String hobby = sc.next();
		Student student = new Student(studentId, studentPw, email, phone, address, hobby);
		return student;
	}

	// 성공 메세지 출력
	private void displaySuccess(String message) {
		System.out.println("[서비스 성공] "+message);
	}
	// 실패 메세지 출력
	private void displayError(String message) {
		System.out.println("[서비스 실패] "+message);
	}

	// 학생 정보 전체 출력
	private void showAllStudents(List<Student> sList) {
		System.out.println("===== 학생 전체 정보 출력 =====");
		for(Student student : sList) {
			System.out.printf("이름 : %s, 나이 : %d, 아이디: %s, 성별  %s, 이메일 : %s, 전화번호 : %s, 주소 : %s, 취미 : %s, 가입날짜 : %s\n"
					, student.getStudentName()
					, student.getAge()
					, student.getStudentId()
					, student.getGender()
					, student.getEmail()
					, student.getPhone()
					, student.getAddress()
					, student.getHobby()
					, student.getEnrollDate());
		}
	}

	// 학생 아이디로 정보 출력
	private void showStudent(Student student) {
		System.out.println("===== 학생 정보 출력(아이디로 조회) ======");
		System.out.printf("이름 : %s, 나이 : %d, 아이디: %s, 성별  %s, 이메일 : %s, 전화번호 : %s, 주소 : %s, 가입날짜 : %s\n"
				, student.getStudentName()
				, student.getAge()
				, student.getStudentId()
				, student.getGender()
				, student.getEmail()
				, student.getPhone()
				, student.getAddress()
				, student.getEnrollDate());
	}
}

✔️ controller

package com.kh.jdbc.day02.student.controller;

import java.util.List;

import com.kh.jdbc.day02.student.model.dao.StudentDAO;
import com.kh.jdbc.day02.student.model.vo.Student;

public class StudentController {
	
	StudentDAO studentDao;
	
	public StudentController() {
		studentDao = new StudentDAO();
	}
	
	/**
	 * 학생 정보 전체 불러오기
	 * @return
	 */
	public List<Student> printStudentList() {
		List<Student> sList = studentDao.selectAll();
		return sList;
	}
	/**
	 * 학생 아이디로 데이터 조회
	 * @param studentId
	 * @return
	 */
	public Student printStudentById(String studentId) {
		Student student = studentDao.selectOneById(studentId);
		return student;
	}

	public List<Student> printStudentsByName(String studentName) {
		List<Student> sList = studentDao.selectAllByName(studentName);
		return sList;
	}

	/**
	 * 학생 정보 등록
	 * @param student
	 * @return
	 */
	public int insertStudent(Student student) {
		int result = studentDao.insertStudent(student);
		return result;
	}
	/**
	 * 데이터 업데이트
	 * @param student
	 * @return
	 */
	public int modifyStudent(Student student) {
		int result = studentDao.updateStudent(student);
		return result;
	}

	/**
	 * 아이디로 조회해서 데이터 삭제
	 * @param studentId
	 * @return
	 */
	public int deleteStudent(String studentId) {
		int result = studentDao.deleteStudent(studentId);
		return result;
	}

}

✔️ model.dao

package com.kh.jdbc.day02.student.model.dao;

// sql 패키지 전부 import
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

import com.kh.jdbc.day02.student.model.vo.Student;

public class StudentDAO {
	
	// JDBC URL, 계정명, 비밀번호 전역변수 선언 -> 멤버변수, 어떤 메소드든 가져다 사용 가능
	// url -> jdbc:oracle:thin: + 주소 + 1521 + xe
	// 상수이고, 보안문제로 private final -> 변하지 않을 상수로 선언
	// private final 의 변수는 대문자여야함.
	private final String DRIVER_NAME = "oracle.jdbc.driver.OracleDriver";
	private final String URL = "jdbc:oracle:thin:@localhost:1521:xe";
	private final String USER = "STUDENT";		// oracle 계정 id
	private final String PASSWORD = "STUDENT";	// oracle 계정 pw
	
	// sql 전체 정보를 가지고 오는 메소드 만들었음.
	public List<Student> selectAll() {
		/*
		 * 1. 드라이버 등록
		 * 2. DB 연결 생성
		 * 3. 쿼리문 실행 준비
		 * 4. 쿼리문 실행 및 5. 결과 받기
		 * 6. 자원해제(close())
		 */
		
		String query = "SELECT * FROM STUDENT_TBL";
		List<Student> sList = null;
		Student student = null;
		

		
		try {
			// 1. 드라이버 등록
			Class.forName(DRIVER_NAME);
			
			// 2. DB 연결 생성(DriverManager)
			Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
			
			// 3. 쿼리문 실행 준비
			Statement stmt = conn.createStatement();
			
			// 4. 쿼리문 실행 및 5. 결과 받기
			ResultSet rset = stmt.executeQuery(query);	// 쿼리문이 SELET이기 때문에 ResultSet
														// INSERT 일 경우 int
			// 후처리
			sList = new ArrayList<Student>();
			while(rset.next()) {
				student = rsetToStudent(rset);
				sList.add(student);
				
				// Student 객체를 만들고어서 rset 변수에 저장한 데이터를 담아서 객체화 시키고,
				// student 객체를 setter 메소드로 List 에 담아 저장한다. 
				// 저장한 데이터를 getter 메소드를 사용해 가져올 수 있다.
			}
			
			// 6. 자원해제(close())
			rset.close();
			stmt.close();
			conn.close();
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return sList;
	}
	// 이름으로 데이터 찾기
	public List<Student> selectAllByName(String studentName) {
		// SELECT * FROM STUDENT_TBL WHERE STUDENT_NAME = 'admin'
		String query = "SELECT * FROM STUDENT_TBL WHERE STUDENT_NAME ='" +studentName+"'";
		Student student = null;
		// 리턴용 리스트 선언
		List<Student> sList = new ArrayList<Student>();
		try {
			Class.forName(DRIVER_NAME);
			Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
			Statement stmt = conn.createStatement();
			ResultSet rset = stmt.executeQuery(query);
			// 후처리
			while(rset.next()) {
				student = rsetToStudent(rset);
				sList.add(student);
			}
			rset.close();
			stmt.close();
			conn.close();
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return sList;
	}
	// 아이디로 데이터 찾기
	public Student selectOneById(String studentId) {
					 // SELECT * FROM STUDENT_TBL WHERE STUDENT_ID = 'khuser01'
		// 따옴표 잘 기억하기
		String query = "SELECT * FROM STUDENT_TBL WHERE STUDENT_ID ='" + studentId + "'";
		Student student = null;
		try {
			Class.forName(DRIVER_NAME);
			Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
			Statement stmt = conn.createStatement();
			ResultSet rset = stmt.executeQuery(query);
			// 후처리
			// 결과값이 1개만 나올때는 while(rset.next()) 가 아니라 if 문 사용해야 한다.
			if(rset.next()) {
				student = rsetToStudent(rset);
			}
			rset.close();
			stmt.close();
			conn.close();
		} catch (Exception e) {
		}
		return student;
	}
	
	// 학생 정보 등록하기 (INSERT)
	public int insertStudent(Student student) {
		/*
		 * 1. 드라이버 등록
		 * 2. DB 연결 생성
		 * 3. 쿼리문 실행 준비
		 * 4. 쿼리문 실행 및 5.결과 받기
		 * 6. 자원해제
		 */
		// INSERT INTO STUDENT_TBL VALUES('admin', 'admin', '관리자', 'M', 30, 'admin@iei.or.kr', 
		// '01012345678', '서울시 강남구 역삼동 테헤란로 7', '기타,독서,운동', '16/03/15');
		String query = "INSERT INTO STUDENT_TBL VALUES("
				+ "'"+student.getStudentId()+"', "
						+ "'"+student.getStudentPwd()+"', "
								+ "'"+student.getStudentName()+"', "
										+ "'"+student.getGender()+"', "
												+ student.getAge()+", "	// 정수이기때문에 "" 지워도 상관없음!
														+ "'"+student.getEmail()+"', "
																+ "'"+student.getPhone()+"', "
																		+ "'"+student.getAddress()+"', "
																				+ "'"+student.getHobby()+"', "
																						+ "SYSDATE)";
		int result = -1;	// 동작하지 않으면 -1
		
		try {
			// 1. 드라이버 등록
			Class.forName(DRIVER_NAME);
			// 2. DB 연결 생성
			Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
			// 3. 쿼리문 실행 준비
			Statement stmt = conn.createStatement();
			// 4. 쿼리문 실행 및 결과받기
			result = stmt.executeUpdate(query);	// DML(INSERT, UPDATE, DELETE)용
			// ResultSet rset = stmt.executeQuery();	// executeQuery() -> SELECT용
			// 6. 연결 닫기
			stmt.close();
			conn.close();
			
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}
	
	// 데이터 업데이트
	public int updateStudent(Student student) {
		// UPDATE STUDENT_TBL SET STUDENT_PWD = 'pass11', EMAIL = 'khuser11@iei.or.kr', PHONE = '01022222222', HOBBY = '코딩, 수영' WHERE STUDENT_ID = 'khsuer03';
		String query = "UPDATE STUDENT_TBL SET "
					+ "STUDENT_PWD = '"+ student.getStudentPwd()+"', "
						+ "EMAIL = '"+ student.getEmail()+"', "
							+ "PHONE = '"+ student.getPhone()+"', "
								+ "ADDRESS = '"+ student.getAddress()+"', "
									+ "HOBBY = '"+ student.getHobby()+"' "
										+ "WHERE STUDENT_ID ='" + student.getStudentId()+"'";
		int result = -1;
		try {
			Class.forName(DRIVER_NAME);
			Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
			Statement stmt = conn.createStatement();
			result = stmt.executeUpdate(query);
			stmt.close();
			conn.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}
	// 데이터 삭제
	public int deleteStudent(String studentId) {
		String query = "DELETE FROM STUDENT_TBL WHERE STUDENT_ID ='"+ studentId+"'" ;
		int result = 0;
		try {
			Class.forName(DRIVER_NAME);
			Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
			Statement stmt = conn.createStatement();
			result = stmt.executeUpdate(query);
			stmt.close();
			conn.close();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return result;
	}
	// 후처리 메소드화
	private Student rsetToStudent(ResultSet rset) throws SQLException {
		Student student = new Student();
		student.setStudentId(rset.getString("STUDENT_ID"));	// rset.getString("STUDENT_ID") -> checked Exception
		student.setStudentPwd(rset.getString("STUDENT_PWD"));
		student.setStudentName(rset.getString("STUDENT_NAME"));
		// 문자는 문자열에서 문자로 잘라서 사용, chatAt() 메소드 사용
		student.setGender(rset.getString("GENDER").charAt(0));
		student.setAge(rset.getInt("AGE"));
		student.setEmail(rset.getString("EMAIL"));
		student.setPhone(rset.getString("PHONE"));
		student.setAddress(rset.getString("ADDRESS"));
		student.setHobby(rset.getString("HOBBY"));
		student.setEnrollDate(rset.getDate("ENROLL_DATE"));
		return student;
	}

}
profile
꾸준히
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 24일

정보 감사합니다.

답글 달기