ㅁ main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<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"%>
<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>