카테고리 없음

개인프로젝트(4) - 키워드로 직원 검색하기

최종군 2024. 8. 31. 16:56

이번에 추가한 기능은 

직원 이름으로 검색하는 것이다 

 

LIKE 기능을 넣을까 말까 하다가 

이름을 잘 못 검색하더라도

LIKE %키워드%를 통하면 좀 더 

실수를 방지를 할 수 있어 키워드로 검색하는 기능을 추가했다

 

public void empListMenu(){

    while (true){

    System.out.println("목록 조회 - 요양원 직원");
    System.out.println("1.직원 목록 조회");
    System.out.println("2.직원 추가하기");
    System.out.println("3.직원 정보 수정[이름/나이/성별]");
    System.out.println("3.직원 정보 수정[이름/나이/성별]");
    System.out.println("4. 직원 정보 삭제하기");
    System.out.println("5. 직원 이름으로 조회하기[키워드 검색]");
    System.out.println("9. 종료");
    System.out.print("메뉴 선택 : ");
    int menu = sc.nextInt();
    sc.nextLine();

 

System.out.println("5. 직원 이름으로 조회하기[키워드 검색]");

 

실행 순서 : 

 

1. Run 클래스

new EmployeeMenu().empListMenu();

 

2. EmployeeMenu 클래스 

 EmployeeMenu

 

EmployeeMenu 클래스의 

serachEmp() 메소드

public void searchEmp(){
    System.out.println("직원 검색[키워드] 목록입니다");
    System.out.println("검색할 직원 이름을 입력해주세요 : ");

    String name = sc.nextLine();

    nc.searchEmp(name);
}

 

컨트롤러 searchEmp 메소드에 name 조회할 직원 이름의 키워드 혹은 이름을 매개변수를 전달 

 

 

3.

public void searchEmp(String name){
    ArrayList<Employee>list = new EmployeeService().searchEmp(name);

    if(list.isEmpty()){
        new EmployeeMenu().displayNoData("전체 조회 결과가 없습니다");
    }else {
        new EmployeeMenu().displayEmpList(list);
    }

 

 

ArrayList<Employee>list = new EmployeeService().searchEmp(name);

 

매개변수를 전달 받은 EmployeeServide 클래스의 searchEmp()메소드 

결과를 Arraylist의 참조변수 list에 담는다. 

 

searchEmp()  메소드 수행 결과에 따라서 

해당 직원의 키워드가 없다면 키워드 검색 결과가 없다는 메세지를 출력

 

 검색 결과가 있다면 

searchEmp()의 결과를 담은 list를 출력 

public void displayEmpList(ArrayList<Employee> list){
    System.out.println(list);
}

 

ArrayList는 toString이 오버라이딩이 되어있다

 

 

public ArrayList<Employee>searchEmp(String name){
    
    Connection conn = JDBCTemplate.getConnection();
    
    ArrayList<Employee>list = new EmployeeDao().searchEmp(conn, name);
    
    JDBCTemplate.close(conn);
    
    return list;
}

 

 

JDBCTemplate 클래스의 

getConnection 메소드 

public static Connection getConnection(){
    Properties prop = new Properties();
    Connection conn = null;

    try {
        prop.load(new FileInputStream("resources/driver.properties"));
        Class.forName(prop.getProperty("driver"));
        conn = DriverManager.getConnection(prop.getProperty("url")
            , prop.getProperty("username")
                ,prop.getProperty("password")
        );
        conn.setAutoCommit(false);

    }catch (ClassNotFoundException e){
        e.printStackTrace();
    }catch (SQLException e){
        e.printStackTrace();
    }catch (IOException e){
        e.printStackTrace();
    }
    return conn;
}

 

prop.load(new FileInputStream("resources/driver.properties"));

파일에서 데이터베이스 연결에 필요한 설정 정보를 불러온다. 

 

class.forName() : 

드라이버 클래스를 불러오서 JDBC 드라이버를 메모리에 로드한다. 

 

DriverManager.getConnection(prop.getProperty("url"),

prop.getProperty("username"),

prop.getProperty("password"))

url, username, password 정보를 사용하여 데이터베이스와 연결을 설정한다

 

conn.setAutoCommit(false) : 

자동 커밋을 비활성 시킨다

 


DAO 클래스 : 

public ArrayList<Employee>searchEmp(Connection conn, String name){

ArrayList<Employee> list = new ArrayList<>();

PreparedStatement pstmt = null;
ResultSet rset = null;

String sql = prop.getProperty("searchEmpName");

    try{
        pstmt = conn.prepareStatement(sql);
        pstmt.setString(1, name);

        rset = pstmt.executeQuery();

        while (rset.next()){
            Employee e = new Employee(
                    rset.getInt("NHE_NO"),
                    rset.getString("NHE_NAME"),
                    rset.getInt("NHE_AGE"),
                    rset.getString("NHE_GENDER"),
                    rset.getString("NHE_PHONE"),
                    rset.getString("NHE_ADDRESS"),
                    rset.getString("NHE_SSN"),
                    rset.getString("DEPT_CODE"),
                    rset.getString("JOB_CODE"),
                    rset.getInt("NHE_SALARY"),
                    rset.getDate("HIRE_DATE"),
                    rset.getDate("ENT_DATE"),
                    rset.getString("ENT_YN")
            );
            list.add(e);
        }
    }catch (SQLException e){
        e.printStackTrace();
    }finally {
        JDBCTemplate.close(rset);
        JDBCTemplate.close(pstmt);
    }
    return list;
}

 

 

 

ArrayList<Employee> list : 

검색된 직원 정보를 저장할 리스트를 초기화한다 

PreparedStatement pstmt = null;
ResultSet rset = null;

 

PreparedStatement : SQL 쿼리를 실행하기 위한 

객체를 try : 구문 밖에다가 null로 초기화 한다 

try 구문에 먼저 선언한 이유는 

스코프로 인하여 try 구문 외부에 먼저 선언을 시킨다 

 

ResultSet rset: 쿼리 실행 결과를 담을 ResultSet 객체를 선언합니다.

마찬가지로 쿼리 실행 결과를 담을 ResultSet 객체를 선언한다 

 

String sql = prop.getProperty("searchEmpName");

prop 파일로부터 SQL 쿼리 문자열을 불러온다. 

 

 pstmt = conn.prepareStatement(sql):

데이터베이스 연결 객체 conn을 사용하여,

SQL 쿼리를 실행할 준비된 명령문(PreparedStatement)을 생성한다.

 

rset = pstmt.executeQuery();

 

준비된 SQL 쿼리를 실행하고,

그 결과를 ResultSet 객체로 반환

ResultSet은 SQL 쿼리의 결과 집합을 포함하는 객체이다 

 

 

while (rset.next()): ResultSet 객체 rset을 순회하면서 각 행의 데이터를 읽어옵니다

. rset.next()는 ResultSet의 다음 행이 존재하는 동안 계속 반복.