본문 바로가기
MyBatis

[MyBatis] select (2) 여러 행 조회

by moca7 2024. 10. 11.

 

 

 

ㅁ main.jsp

 

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />

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

    <h3>1. insert연습 (공지사항 등록)</h3>
    <a href="${ contextPath }/regist.no">공지사항 등록페이지로 이동</a>

    <h3>2. select연습 - 한 행 (공지사항 상세조회)</h3>
    <form action="${ contextPath }/detail.no">
        검색할 글번호 : <input type="text" name="noticeNo">
        <button type="submit">검색</button>
    </form>


    <h3>3. select연습 - 여러행 (공지사항 전체목록조회)</h3>
    <a href="${ contextPath }/list.no">공지사항 전체 목록 페이지로 이동</a>


    <h4>4. select연습 - 여러행 + 페이징 처리 - RowBounds 적용</h4>

    <h5>5. select연습 + update연습 (회원정보 상세조회 + 회원정보 변경) - TypeHandler 적용</h5>
   
    <h6>6. 동적쿼리 연습 (회원 검색)</h6>

</body>
</html>
 

 

 

- 공지사항 전체 목록 페이지로 이동하는 a 태그를 둔다.

 

 

 

 

ㅁ com.br.mybatis.notice.controller에 NoticeListController 서블릿을 만든다.

 

 
package com.br.mybatis.notice.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.br.mybatis.notice.dto.NoticeDto;
import com.br.mybatis.notice.service.NoticeServiceImpl;

/**
 * Servlet implementation class NoticeListController
 */
@WebServlet("/list.no")
public class NoticeListController extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public NoticeListController() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 페이징 처리 X
        List<NoticeDto> list = new NoticeServiceImpl().selectList();

        request.setAttribute("list", list);
        request.getRequestDispatcher("/WEB-INF/views/notice/noticeList.jsp").forward(request, response);
       
       
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
 

 

 

 

 

 

ㅁ com.br.mybatis.notice.service의 NoticeServiceImpl에 selectList 메소드를 만든다.

 

 
package com.br.mybatis.notice.service;

import static com.br.mybatis.common.template.Template.getSqlSession;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.br.mybatis.common.dto.PageInfoDto;
import com.br.mybatis.notice.dao.NoticeDao;
import com.br.mybatis.notice.dto.NoticeDto;

public class NoticeServiceImpl implements NoticeService {
   
   
    private NoticeDao noticeDao = new NoticeDao();
   


    @Override
    public int insertNotice(NoticeDto n) {
       
        SqlSession sqlSession = /*Template.*/getSqlSession();
       
        int result = noticeDao.insertNotice(sqlSession, n);
       
        if(result > 0) {
            sqlSession.commit();
        }
       
        sqlSession.close();
       
        return result;
    }
   
   
    @Override
    public NoticeDto selectNotice(int noticeNo) {
       
        SqlSession sqlSession = getSqlSession();
        NoticeDto n = noticeDao.selectNotice(sqlSession, noticeNo);
       
        sqlSession.close();
        return n;
    }
 

   
    @Override
    public List<NoticeDto> selectList() {
       
        SqlSession sqlSession = getSqlSession();
        List<NoticeDto> list = noticeDao.selectList(sqlSession);
       
        sqlSession.close();
        return list;
    }

   
    @Override
    public int selectListCount() {
        return 0;
    }

   
    @Override
    public List<NoticeDto> selectList(PageInfoDto pi) {
        return null;
    }
   

}
 

 

 

 

 

 

ㅁ com.br.mybatis.notice.dao의 NoticeDao에 selectList 메소드를 만든다.

 

 
 
package com.br.mybatis.notice.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.br.mybatis.notice.dto.NoticeDto;
 

public class NoticeDao {

    public int insertNotice(SqlSession sqlSession, NoticeDto n) {
       
        return sqlSession.insert("noticeMapper.insertNotice", n);
    }
   
    public int updateNotice(SqlSession sqlSession, NoticeDto n) {
       
        return sqlSession.update("noticeMapper.updateNotice", n);
       
    }
   
    public int deleteNotice(SqlSession sqlSession, int noticeNo) {
       
        return sqlSession.delete("noticeMapper.deleteNotice", noticeNo);
    }

    public NoticeDto selectNotice(SqlSession sqlSession, int noticeNo) {
       
        return sqlSession.selectOne("noticeMapper.selectNotice", noticeNo);
    }
 

    public List<NoticeDto> selectList(SqlSession sqlSession) {
       
        return sqlSession.selectList("noticeMapper.selectList");
    }

}
 

 

 

- 완성된 형태의 sql문이라 딱히 전달할 데이터가 없다. 매개변수 1개짜리 selectList() 메소드를 사용한다.

- 나중에 페이징처리할 때는 매개변수 3개짜리 selectList() 메소드를 사용한다. rowbounds를 사용한다.

- 조회된 결과가 없다면 텅빈 list를 반환한도록 저 메소드 자체에 정의되어 있다. 

 

 

 

 

 

ㅁ notice-mapper.xml에 쿼리를 추가한다.

 

 

 

- 여러행 조회여도 각 행별로 어떤 타입으로 담을건지 지정하면 된다. 

resultType이나 resultMap에 list를 쓸 필요가 없다.

 

 

- 만들어놓은 noticeResultMap을 재사용한다.

select 태그의 resultMap 속성에 "noticeResultMap"를 작성해서 참조한다.

- notice_content 컬럼은 조회하지 않지만 상관 없다.

조회 결과 중 column명에 해당하는 것이 "있으면" property에 담는거라 조회결과가 없어도 상관없다. 

 

 

 

 

 

ㅁ noticeList.jsp 파일 생성

 

 
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />

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

    <h3>공지사항 목록 (페이징 x)</h3>
   
    <c:choose>
        <c:when test="${ empty list }">
            존재하는 공지사항이 없습니다.
        </c:when>
        <c:otherwise>
            <table border="1">
                <thead>
                    <tr>
                        <th>글번호</th>
                        <th>글제목</th>
                        <th>작성자</th>
                        <th>작성일</th>
                    </tr>
                </thead>
                <tbody>
                    <c:forEach var="n" items="${ list }">
                        <tr>
                            <td>${ n.noticeNo }</td>
                            <td>${ n.noticeTitle }</td>
                            <td>${ n.noticeWriter }</td>
                            <td>${ n.registDate }</td>
                        </tr>
                    </c:forEach>
                </tbody>
            </table>
        </c:otherwise>
    </c:choose>

</body>
</html>