Day72 :) Mybatis mvc패턴 구현

Nux·2021년 12월 31일
0

자바웹개발

목록 보기
86/105
post-thumbnail

Mybatis

Mapper xml

  • 파일명은 달라도 되지만 파일 형식과 경로는 같아야함
  • SQL 매핑정보를 담고 있는 파일
  • SQL명령어에 따라 <select>, <insert>, <update>, <delete>로 나누어 작성
<?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.sample.dao.BookDao">

	<insert id="insertBook" parameterType="com.sample.vo.Book">
		insert into sample_spring_books
		(book_no, book_title, book_author, book_publisher, 
        book_price, book_discount_price, book_pub_date, book_stock)
		values
		(books_seq.nextval, #{title}, #{author}, #{publisher}, #{price}, 
        	#{discountPrice}, #{pubDate}, #{stock})
	</insert>
    
	<select id="getAllBooks" resultType="com.sample.vo.Book">
		select
			book_no					as no,
			book_title				as title,
			book_author				as author,
			book_publisher				as publisher,
			book_price				as price,	
			book_discount_price			as discountPrice,
			book_pub_date				as pubDate,
			book_stock				as stock,
			book_updated_date			as updatedDate,
			book_created_date			as createdDate
		from 
			sample_spring_books
		order by
			book_no desc
	</select> 
</mapper>    

<!DOCTYPE mapper...>

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  • 태그규칙을 정의한 DTD 선언(고정값)

<mapper namespace...>

<mapper namespace="com.경로.경로.Dao">
  • 구현클래스(DAO) 연결. 작성 필수

result type, resultMap, parameterType

  • <insert>, <update>, <delete>에서 사용 가능한 속성
  • id: SQL문을 구분하는 식별자. 중복 불가
  • resultType: SQL문 실행결과를 담는 객체. resultMap과 함께 쓸 수 없음
  • resultMap: SQL문 실행결과를 담는 객체를 resultMap으로 지정.resultType과 함께 쓸 수 없음
  • ParameterType: 전달받는 패러미터값의 Type 지정


java파일이 위치할 package 생성

VO 정의

  • 멤버변수 및 getter, setter 메서드 정의

Dao mapper 인터페이스 정의

@Mapper
public interface BookDao {

	void insertBook(Book book);
	void updateBook(Book book);
	List<Book> getAllBooks();
    
}

@Mapper

  • Mapper 설정 파일(xml)에 있는 SQL 쿼리문을 호출하기 위한 어노테이션

Service 정의

@Service
public class BookService {
	
	@Autowired
	private BookDao bookDao;
    
	public List<Book> getAllBookList(){
		return bookDao.getAllBooks();
	}

	public void addNewBook(Book book) {
		bookDao.insertBook(book);
	}
	
	public void updateBookPrice(int bookNo, int price, int discountPrice) {
		Book book = bookDao.getBookByNo(bookNo);
		book.setPrice(price);
		book.setDiscountPrice(discountPrice);
		
		bookDao.updateBook(book);
	}
    
}

Controller 정의

  • 클라이언트 요청을 처리하는 메서드(요청핸들러메서드) 구현
@Controller
@RequestMapping("/book")
public class BookController {

	@Autowired
	BookService bookService;

	@GetMapping("/list.do")
	public String list(Model model) {
		List<Book> books = bookService.getAllBookList();
		model.addAttribute("books", books);
		
		return "book/list.jsp";
	}
}

@GetMapping

  • @RequestMapping(method = RequestMethod.GET)과 같은 기능
  • @RequestMapping과 다르게 메서드에만 적용 가능
  • 주소에 패러미터가 노출됨

참고: @PostMapping

  • 주소창에 패러미터가 노출되지 않음

View

<c:choose>
	<c:when test="${empty books }">
		<tr>
			<td class="text-center" colspan="5">등록된 도서 정보가 없습니다.</td>
		</tr>
	</c:when>
	<c:otherwise>
		<c:forEach var="book" items="${books }" varStatus="loop">
			<tr>
				<td>${loop.count }</td>
				<td><a href="detail.do?no=${book.no}" class="text-none">${book.title }</a></td>
				<td>${book.author }</td>
				<td class="text-end pe-3"><fmt:formatNumber value="${book.price }" pattern="##,###"/></td>
				<td class="text-end pe-3"><strong class="text-danger"><fmt:formatNumber value="${book.discountPrice }" pattern="##,###"/></strong></td>
			</tr>
		</c:forEach>
	</c:otherwise>
</c:choose>

0개의 댓글