다연이네

[days02] DEPT 테이블 조회, 추가, 수정, 삭제, 검색 본문

JDBC

[days02] DEPT 테이블 조회, 추가, 수정, 삭제, 검색

 다연  2020. 11. 25. 00:39
반응형

 

package days02;

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

import com.util.DBConn;

public class Ex03 {

	static Connection con = null;
	static int selectedNumber ; //선택된 메뉴 저장하는 변수
	static Scanner scanner = new Scanner(System.in);
	static char _continue;

	public static void main(String[] args) {
		// Dept 테이블 CRUD 처리

		/*	
		10	ACCOUNTING	NEW YORK
		20	RESEARCH	DALLAS
		30	SALES	CHICAGO
		40	OPERATIONS	BOSTON
		 */

		con = DBConn.getConnection();	

		while(true) {
			메뉴출력();
			메뉴선택();
			메뉴처리();
		}//while


	}//main

	private static void 메뉴처리() {
		switch (selectedNumber) {
		case 1: //부서정보
			//System.out.println("부서 정보 출력");
			getAllDeptInfo(); //함수 호출
			break;
		case 2: //부서추가
			//System.out.println("부서 추가");
			addDept();
			break;
		case 3: //부서수정
			//System.out.println("부서 수정");
			editDept();
			break;
		case 4: //부서삭제
			//System.out.println("부서 삭제");
			removeDept();
			break;
		case 5: //부서검색
			//System.out.println("부서 검색");
			searchDept();
			break;
		case 6: //종료
			exit();
			break;
		default: //입력잘못
			break;
		}

	}//메뉴처리

	  private static void removeDept() {
	         System.out.print(">삭제할 부서번호(deptno)를 입력하세요?");
	         
	         //nextLine() 13,10제거...
	         //의미가 없다 버퍼에 있는거 지우면 System.in.skip(System.in.available())
	         
	         scanner.nextLine();//enter(13,10) 50, 60
	         
	         String deptno = scanner.nextLine();
	         
	         String sql = String.format(
	            "DELETE FROM dept"
	            + " WHERE deptno in( %s )", deptno);
	         
	         Statement stmt = null;
	         try {
	            stmt = con.createStatement(); //Statement 가져오기
	            int rowcount = stmt.executeUpdate(sql); //DML
	            if(rowcount >0) {
	               System.out.println(" 부서들 삭제 완료");
	            }
	         } catch (SQLException e) {
	            e.printStackTrace();
	         }finally {
	            try {
	               stmt.close();
	            } catch (SQLException e) {
	               e.printStackTrace();
	            }
	         }//finally
	         
	         일시정지();
	   }//removeDept
	
	
	
	
	private static void editDept() {
		System.out.println("> 수정할 부서번호(deptno)를 입력하세요 ? ");
		int deptno = scanner.nextInt(); //50 		부서명, 지역명 확인했다치고

		System.out.print("> 수정할 부서명(dname), 지역명(loc)을 입력하세요 ? ");
		String dname = scanner.next(); //입력할때 홑따옴표 붙어야하니까
		String loc = scanner.next();
		String sql = String.format(
				"UPDATE dept " //하나만 바꿀수도 있고 두개를 바꿀수도 있고
				+" SET dname ='%s', loc = '%s' " //홑따옴표 필수...
				+" WHERE deptno= %d", dname, loc, deptno);

		//*****쿼리 반드시 확인
		//System.out.println(sql);

		Statement stmt = null;
		try {
			stmt = con.createStatement();
			int rowCount = stmt.executeUpdate(sql);

			if(rowCount ==1 ) {
				System.out.println("> 1개 부서 수정 완료...");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		일시정지();
	}//editDept

	private static void searchDept() {
		// 검색조건 ㄱ.부서명 ㄴ.지역명
		System.out.println("> 검색 조건 선택<");
		System.out.println(" 1. 부서명 검색 ");
		System.out.println(" 2. 지역명 검색 ");
		메뉴선택(); //selectedNumber 변수에 1,2 저장

		//동적 SQL 사용하자 (PL/SQL) 지금은 아니고
		System.out.print("> 검색어 입력 ? ");
		String searchWord = scanner.next();
		String sql = "SELECT * FROM DEPT ";
		switch (selectedNumber) {
		case 1: //부서명
			sql+= "WHERE dname LIKE '%"+searchWord+"%'";
			break;
		case 2: //지역명
			sql+= String.format("WHERE loc LIKE '%%%s%%'", searchWord);
			//와일드카드의%이기 때문에 %% (%는 2개 써야 출력됨)
			break;
		}

		//*****꼭 and 반드시 작성된 쿼리 확인한다 ******
		//System.out.println(sql);


		//나중에는 두개만들 필요 없음 (밑에쿼리 전부 getAllDeptInfo에서 복붙한거)
		Statement stmt = null;//일꾼객체
		ResultSet rs = null;
		ArrayList<DeptDTO> list = null;
		DeptDTO dto = null;

		int deptno;
		String dname, loc; //하나의 정보를 저장할 변수들

		try {
			stmt = con.createStatement();
			rs = stmt.executeQuery(sql);
			if(rs.next()) { //한명도 없다면 어레이리스트 생성하지 않도록 
				list = new ArrayList<DeptDTO>();
				do { 
					deptno = rs.getInt("DEPTNO");
					dname = rs.getString("dname");
					loc = rs.getNString("loc");

					//dto = new DeptDTO(); //컨트롤누르고 deptdto 가서 생성자 수정 (매개변수 3개짜리 생성자 만들기)
					//					dto.setDEPTNO(dEPTNO);
					//					dto.setDNAME(dNAME);
					//					dto.setLOC(lOC); -> 이렇게 안하려고 생성자 추가한 것
					dto = new DeptDTO(deptno, dname, loc);

					list.add(dto);

				}while(rs.next());
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally { //잘 처리되든 말든
			try {
				rs.close();
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}//finally

		//list 출력
		System.out.println("> 모든 부서 정보 출력 <");
		if (list ==null) {
			System.out.println("> 검색 결과 없습니다.");
		}else {
			Iterator<DeptDTO> ir = list.iterator();
			while (ir.hasNext()) {
				dto=  ir.next();
				System.out.println(dto);
			}
		}


		일시정지();

		//여까지 복붙한거 ㅎ + if(list==null) else 만 추가함



	}//searchDept

	private static void addDept() {
		do {
			System.out.println("[부서 정보 입력]");
			//deptno는 seq_dept 시퀀스 사용
			System.out.println("1. 부서명 입력 ? ");
			String dname = scanner.next();
			System.out.println("2. 지역명 입력 ? ");
			String loc = scanner.next();

			//	String sql = "INSERT INTO dept(deptno, dname, loc) "
			//			+ "VALUES (seq_dept.nextval, "+dname+", '"+loc+"')";
			String sql = String.format("INSERT INTO  dept(deptno, dname, loc) "
					+"values (seq_dept.nextval, '%s', '%s')", dname, loc);

			Statement stmt = null;
			try {
				stmt = con.createStatement();
				//insert, update, delete : executeUpdate() 사용
				//select 						   : executeQuery() 사용
				int rowCount = stmt.executeUpdate(sql); //insert된 개수

				if(rowCount==1) { //1개가 추가되면 잘 된 것
					System.out.println(">1개 부서 추가 완료...");
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}finally {
				try {
					stmt.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}

			계속여부확인();

		}while(Character.toUpperCase(_continue)=='Y');

		일시정지(); //입력 완료된 후에도 잠시 멈춰서 돌도록

	}//addDept

	private static void 계속여부확인() {
		System.out.print("> 계속 할거야 ? ");
		try {
			_continue = (char)System.in.read();
			System.in.skip(System.in.available()); //13,10번 값 삭제
		} catch (IOException e) {
			e.printStackTrace();
		}
	}//계속여부확인

	private static void getAllDeptInfo() {
		String sql = "SELECT * FROM DEPT ORDER BY deptno ASC";
		//프로그램 시작하자마자 con객체는 얻어왔고 DB는 나중에 프로그램 종료할 때 종료 메소드 호출하면 닫음
		//그 동안은 안닫음  => 커넥션 객체는 더이상 처리할 필요가 없음
		Statement stmt = null;//일꾼객체
		ResultSet rs = null;
		ArrayList<DeptDTO> list = null;
		DeptDTO dto = null;

		int deptno;
		String dname, loc; //하나의 정보를 저장할 변수들

		try {
			stmt = con.createStatement();
			rs = stmt.executeQuery(sql);
			if(rs.next()) { //한명도 없다면 어레이리스트 생성하지 않도록 
				list = new ArrayList<DeptDTO>();
				do { 
					deptno = rs.getInt("DEPTNO");
					dname = rs.getString("dname");
					loc = rs.getNString("loc");

					//dto = new DeptDTO(); //컨트롤누르고 deptdto 가서 생성자 수정 (매개변수 3개짜리 생성자 만들기)
					//					dto.setDEPTNO(dEPTNO);
					//					dto.setDNAME(dNAME);
					//					dto.setLOC(lOC); -> 이렇게 안하려고 생성자 추가한 것
					dto = new DeptDTO(deptno, dname, loc);

					list.add(dto);

				}while(rs.next());
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally { //잘 처리되든 말든
			try {
				rs.close();
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}//finally

		//list 출력
		System.out.println("> 모든 부서 정보 출력 <");
		Iterator<DeptDTO> ir = list.iterator();
		while (ir.hasNext()) {
			dto=  ir.next();
			System.out.println(dto);
		}

		일시정지();

	}//getAllDeptInfo

	private static void 일시정지() {
		System.out.println("\t\t 엔터치면 계속합니다");
		try {
			System.in.read();
			System.in.skip(System.in.available());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	//마무리작업 + 프로그램 종료
	private static void exit() {
		System.out.println("\t\t 프로그램 종료합니다.");
		DBConn.close(); //DB커넥션 종료  
		con = null; //con에 null값 주고
		System.exit(-1); //실제프로그램 종료
	}//exit

	private static void 메뉴선택() {
		System.out.print("> 메뉴 선택하세요 ? ");
		selectedNumber = scanner.nextInt();

	}//메뉴선택

	private static void 메뉴출력() {
		String [] menus = {
				"부서 정보", 
				"부서 추가",
				"부서 수정",
				"부서 삭제",
				"부서 검색",
				"종료"
		};
		System.out.println(">메뉴 출력<");
		for (int i = 0; i < menus.length; i++) {
			System.out.printf("%d. %s\n", (i+1), menus[i]);
		}

	}//메뉴출력

}//class

반응형
Comments