JDBC API연습 : SQL SELECT문 WHERE절 LIKE 연산자

권원중·2023년 4월 27일

구디아카데미

목록 보기
4/23
post-thumbnail

[issue] view layer 코드 구현

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.sql.*" %>
<%@ page import = "vo.*" %>
<%@ page import = "java.util.*" %>

<%
	// Controller Layer : 요청처리
	// 파라미터값 : 현재페이지(String -> Integer -> int), 검색단어(Strig)
	
	// 파라미터값 확인
	System.out.println(request.getParameter("currentPage") 
			+ " <-- empListBySearch param currentPage");
	System.out.println(request.getParameter("searchWord"));
	System.out.println(request.getParameter("rowPerPage"));
	
	// 파라미터값 null 유효성 검사
	int currentPage = 1;
	if(request.getParameter("currentPage") != null) {
		currentPage = Integer.parseInt(request.getParameter("currentPage"));
	}
	
	String searchWord = "";
	if(request.getParameter("searchWord") != null) {
		searchWord = request.getParameter("searchWord");
	}
	
	int rowPerPage = 10;
	if(request.getParameter("rowPerPage") != null) {
		rowPerPage = Integer.parseInt(request.getParameter("rowPerPage"));
	}
	
	// 파라미터값 확인
	System.out.println(currentPage+ " <-- empListBySearch currentPage");
	System.out.println(searchWord+ " <-- empListBySearch searchWord");
	System.out.println(rowPerPage+ " <-- empListBySearch rowPerPage");
	
	// Model Layer : 모델값 생성하기 까지
	// controller layer의 결과 변수(currentPage, searchWord)외 모델을 생성하기 위해 필요한 변수추가
	// controller layer의 결과 변수 가공
	int startRow = (currentPage - 1) * rowPerPage;
	// rowPerPage 15 -> currentPage 1 -> startRow 0
	// rowPerPage 20 -> currentPage 2 -> startRow 20
	System.out.println(startRow+ " <-- empListBySearch startRow");
	// DB호출에 변수 생성
	String driver = "org.mariadb.jdbc.Driver";
	String dbUrl = "jdbc:mariadb://127.0.0.1:3306/employees";
	String dbUser = "root";
	String dbPw = "java1234";
	Class.forName(driver);
	Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPw);
	
	// 동적쿼리
	String sql = null;
	PreparedStatement stmt = null;
	if(searchWord.equals("") == true) { // if(searchWord.equals("")) {
		sql = "SELECT * FROM employees ORDER BY emp_no ASC LIMIT ?, ?";
		stmt = conn.prepareStatement(sql);
		stmt.setInt(1, startRow);
		stmt.setInt(2, rowPerPage);
	} else {
		/*
			SELECT * FROM employees 
			WHERE CONCAT(first_name, ' ', last_name) LIKE ?
			ORDER BY emp_no ASC 
			LIMIT ?, ?
		*/
		sql = "SELECT * FROM employees WHERE CONCAT(first_name, ' ', last_name) LIKE ? ORDER BY emp_no ASC LIMIT ?, ?";
		stmt = conn.prepareStatement(sql);
		stmt.setString(1, "%"+searchWord+"%");
		stmt.setInt(2, startRow);
		stmt.setInt(3, rowPerPage);
	}
	System.out.println(stmt + " <--empList stmt: 완성된 like 동적 쿼리문");
	
	ResultSet rs = stmt.executeQuery();
	
	// 일반적인 자료구조(모델)로 변경
	ArrayList<Employee> empList = new ArrayList<Employee>();
	while (rs.next()){ // rs.next()가 참이면, 즉 데이터가 존재하는 동안 반복
		Employee emp = new Employee(); // Employee클래스의 변수 emp선언하고 초기화
		emp.empNo = rs.getInt("emp_no"); // rs의 int 타입인 empNo컬럼을 읽어와서 emp의 empNo필드에 저장한다
		emp.birthDate = rs.getString("birth_date"); // rs의 String타입인 birthDate컬럼을 읽어와서 emp의 birthDate필드에 저장한다
		emp.firstName = rs.getString("first_name");
		emp.lastName = rs.getString("last_name");
		emp.gender = rs.getString("gender");
		emp.hireDate = rs.getString("hire_date");
		empList.add(emp); // rs의 필드값이 저장된 emp를 empList에 추가하고 이를 rs.next()가 참인동안(데이터가 존재하면) 반복한다
	}
	
	// 모델값 디버깅
	System.out.println(empList.size() + " <--empListBySearche empList.size()");
	for(Employee e : empList) {
		System.out.println(e.firstName +" "+e.lastName);
	}
	
	// 두번째 모델값
	int totalCount = 0;
	int lastPage = 0;
	
	
	// View Layer
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>empListBySearch</title>
</head>
<body>

</body>
</html>

0개의 댓글