상세 조회
데이터베이스(SQL&Docker) 활용
작업 순서: model -> dao -> mappers(xml) -> service -> Controller -> views(jsp)

.xml 공통 SQL 문 생성 INSERT_TIME, UPDATE_TIME ==> <include refid="common.selectCol"></include>


[Spring Boot] - [SpringBoot] 데이터베이스(SQL&Docker) 활용한 전체 조회 : like 기능 있음

 

[SpringBoot] 데이터베이스(SQL&Docker) 활용한 전체 조회 : like 기능 있음

전체 조회 : 부서명 like 기능 있음 데이터베이스(SQL&Docker) 활용 페이징 처리 : 시작 페이지부터 끝 페이지까지 반복하며 각 페이지 번호를 생성 페이지 조회 : 현재 페이지 페이지 0, 크기 3 Dept 클

soaked.tistory.com


CRUD Db 접속 함수들이(CRUD) 있는 클래스(mybatis mapper(=dao) 클래스)
더보기
package com.example.mybatisexam.dao;

import com.example.mybatisexam.model.common.PageReq;
import com.example.mybatisexam.model.vo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Optional;


/**
 * packageName : com.example.mybatisexam.dao
 * fileName : DeptDao
 * author : L.DH
 * date : 2023-10-12
 * description : CRUD Db 접속 함수들이(CRUD) 있는 클래스(mybatis mapper(=dao) 클래스)
 * 1. 전체 조회 : like 기능
 * 요약 :
 * TODO : interface 함수만 정의
 * @Mapper : 인터페이스 위에 달고, mybatis에서 사용할 인터페이스라는 것을 알림
 *           서버 시작시 자동으로 객체가 생성됨
 * @Param("속성명") 변수명 : sql 의 매개변수로 전달됨
 *
 * TODO : xml
 * pageReq.size : 1 페이지당 개수
 * pageReq.page : 현재 페이지 번호
 *  (oracle 12 버전 이상만 OFFSET 가능)
 *  OFFSET #{pageReq.page} * #{pageReq.size} ROWS FETCH FIRST #{pageReq.size} ROWS ONLY
 *  예) (1 페이지당 개수)size = 10, 현재 페이지 번호(page) = 2
 *  2 * 10 = 20 (db 건수 20개 건너뛰고)
 *  10       10 (10 개를 화면에 출력하세요.)
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * ———————————————————————————————
 * 2023-10-12         L.DH         최초 생성
 */
@Mapper
public interface DeptDao {
    /** 전체 조회 : 부서명 like 기능 있음 */
    public List<Dept> findByDnameContaining(@Param("dname") String dname,
                                            PageReq pageReq
                                            );
    /** 전체 테이블 개수 세기 함수 */
    long countByDname(String dname);

    /** 상세 조회(1건조회) */
    Optional<Dept> findById(int dno);
    }

 


더보기
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.mybatisexam.dao.DeptDao">

    <select id="findByDnameContaining" parameterType="PageReq" resultType="Dept">
        SELECT DNO
             , DNAME
             , LOC
        <include refid="common.selectCol"></include>
        FROM TB_DEPT
        WHERE DNAME LIKE '%' || #{dname} || '%'
        OFFSET #{pageReq.page} * #{pageReq.size} ROWS FETCH FIRST #{pageReq.size} ROWS ONLY
    </select>

    <select id="countByDname" parameterType="String" resultType="long">
        SELECT COUNT(dno)
        FROM TB_DEPT
        WHERE DNAME LIKE '%' || #{dname} || '%'
    </select>

    <select id="findById" parameterType="int" resultType="Dept">
        SELECT DNO
        , DNAME
        , LOC
        <include refid="common.selectCol"></include>
        FROM TB_DEPT
        WHERE DNO = #{dno}
    </select>
    
    </mapper>

 


 

더보기
package com.example.mybatisexam.service.exam01;

import com.example.mybatisexam.dao.DeptDao;
import com.example.mybatisexam.model.common.PageReq;
import com.example.mybatisexam.model.common.PageRes;
import com.example.mybatisexam.model.vo.Dept;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

/**
 * packageName : com.example.mybatisexam.service.exam01
 * fileName : DeptService
 * author : L.DH
 * date : 2023-10-12
 * description : CRUD 부서 서비스 클래스(업무 로직)
 * 1. 전체 조회 : like 기능
 * 2. 상세 조회
 * 3. 저장 함수
 * 4. 수정 함수
 * 5. 삭제 함수
 * 요약 :
 * <p>
 * ===========================================================
 * DATE            AUTHOR             NOTE
 * ———————————————————————————————
 * 2023-10-12         L.DH         최초 생성
 */
@Slf4j
@Service
public class DeptService {
    @Autowired
    DeptDao deptDao;    // db crud 함수들이 있는 클래스

    /**
     * 전체 조회 dname like 검색
     */
    public PageRes<Dept> findByDnameContaining(String dname,
                                               PageReq pageReq) {
//        TODO : 전체 조회 (like 됨)
        List<Dept> list = deptDao.findByDnameContaining(dname, pageReq);

//        TODO : 페이징 처리 로직
//         1) 총 테이블 개수 :
        long totalCount = deptDao.countByDname(dname);
//        TODO : 생성자 페이지 결과 객체(PageRes)
        PageRes pageRes = new PageRes(
                list,               // 검색 결과(부서) 배열
                pageReq.getPage(),  // 현재 페이지 번호
                totalCount,         // 총 테이블 건수
                pageReq.getSize()   // 1 페이지당 개수
        );

        return pageRes;
    }

    /**
     * 상세 조회
     */
    public Optional<Dept> findById(int dno) {
//  db 상세 조회 호출
        Optional<Dept> optionalDept = deptDao.findById(dno);

        return optionalDept;
    }
    
} // end of class