Spring/Boot
[Boot] MyBatis
hvoon
2022. 9. 10. 21:06

\src\main\resources\application.properties
# Server port
server.port=8070
# JSP
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
# Oracle
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=scott
spring.datasource.password=tiger
# mybatis
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
src\main\resources\mybatis\mapper\UserDao.xml
<?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.ecl.g11.dao.IUserDao" > <!-- 이름 틀리면 오류남 --> </mapper>
DTO
package com.ecl.g11.dto;
import lombok.Data;
@Data
public class UserDto {
private String id;
private String name;
}
Controller
package com.ecl.g11.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ecl.g11.dao.IUserDao;
@Controller
public class UserController {
@Autowired
IUserDao udao;
@RequestMapping("/")
public String root(Model model){
model.addAttribute("users", udao.getList());
return "userlist";
}
}
Interface
package com.ecl.g11.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.ecl.g11.dto.UserDto;
@Mapper
public interface IUserDao {
public List<UserDto> getList();
}
src\main\resources\mybatis\mapper\UserDao.xml
SQL 문(아래 코드에서 select * from myuser에 해당)
1. IUserDao 의 이름과 그 안에 있는 getList 메서드 이름갖고, 현재 xml 파일에서 namespace에서는 IUserDao 라는 이름 검색, 안쪽 태그들에서는 getList 라는 id를 검색 .
2. 검색된 태그내의 SQL 문을 실행 .
3. 실행결과를 resulyType 에 적힌 자료형 형태로 리턴하되 메서드의 리턴형에 맞춰서 결과가 여러개이면 List 형태로, 단일데이터면 단일데이터 Dto형태로 자동 리턴해줌.
<?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.ecl.g11.dao.IUserDao" >
<select id="getList" resultType = "com.ecl.g11.dto.UserDto">
select * from myuser
</select>
</mapper>
userlist.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>userlist.jsp</title>
</head>
<body>
<h1><% out.println("MyBatis: UserList"); %></h1>
<c:forEach var="dto" items="${users }">
<h1>${dto.id }/${dto.name }</h1>
</c:forEach>
</body>
</html>
BORAD
DTO
package com.ecl.g12.dto;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import lombok.Data;
@Data
public class BbsDto {
private int id;
@NotNull(message="Writer is Null")
@NotEmpty(message="Writer is Empty")
private String writer;
@NotNull (message="Title is Null")
@NotEmpty (message="Title is Empty")
private String title;
@NotNull (message="Content is Null")
@NotEmpty (message="Content is Empty")
private String content;
}
게시글 목록
Controller
package com.ecl.g12.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ecl.g12.dao.IBbsDao;
@Controller
public class BbsController {
@Autowired
IBbsDao bdao;
@RequestMapping("/")
public String root(Model model){
model.addAttribute("list", bdao.getList());
return "list";
}
이 안에 추가될 코드 배경 - 줄무늬
}
interface
package com.ecl.g12.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.ecl.g12.dto.BbsDto;
@Mapper
public interface IBbsDao {
public List<BbsDto> getList();
}
src\main\resources\mybatis\mapper\BbsDao.xml
<?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.ecl.g12.dao.IBbsDao" >
<select id="getList" resultType = "com.ecl.g12.dto.BbsDto">
select * from bbs order by id desc
</select>
이 안에 추가될 코드 배경 - 검정
</mapper>
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>list.jsp</title>
</head>
<body>
<table width="500" cellpadding="0" cellspacing="0" border="1">
<tr>
<th>번호</th><th>작성자</th><th>제목</th>
<th>수정</th><th>삭제</th></tr>
<c:forEach items="${list}" var="dto">
<tr>
<td align="center">${dto.id}</td>
<td align="center">${dto.writer}</td>
<td><a href="view?id=${dto.id}">${dto.title}</a></td>
<td align="center">
<a href="updateForm?id=${dto.id}">수정</a></td>
<td align="center">
<a href="delete?id=${dto.id}">X</a></td>
<tr>
</c:forEach>
</table>
<p><a href="writeForm">글작성</a></p>
</body>
</html>

Controller
@RequestMapping("writeForm")
public String writeForm(Model model) {
return "writeForm";
}
writeForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>writeForm.jsp</title>
</head>
<body>
<table width="700" cellpadding="0" cellspacing="0" border="1">
<form action="write" method="post">
<tr><td> 작성자 </td><td>
<input type="text" name="writer" size = "100" value="${dto.writer}"> </td></tr>
<tr><td> 제목 </td><td>
<input type="text" name="title" size = "100" value="${dto.title}" > </td> </tr>
<tr><td> 내용 </td><td>
<input type="text" name="content" size = "100"
value="${dto.content}"></td></tr>
<tr><td colspan="2">
<input type="submit" value="입력">
<a href="list">목록보기</a></td></tr>
<tr><td colspan="2">${msg }</td></tr>
</form>
</table>
</body>
</html>

Controller
@RequestMapping(value="/write", method=RequestMethod.POST )
public String write(
@ModelAttribute("dto") @Valid BbsDto bbsdto,
BindingResult result, Model model) {
if(result.hasErrors()) {
if(result.getFieldError("writer")!=null)
model.addAttribute("msg",result.getFieldError("writer").getDefaultMessage());
else if(result.getFieldError("title")!=null)
model.addAttribute("msg",result.getFieldError("title").getDefaultMessage());
else if(result.getFieldError("content")!=null)
model.addAttribute("msg",result.getFieldError("content").getDefaultMessage());
return "writeForm";
} else {
// bdao.write(bbsdto);
bdao.write(bbsdto.getWriter(),bbsdto.getTitle(),bbsdto.getContent());
return "redirect:/";
}
}
IBbsDao
public void write(String writer, String title, String content);
BbsDao.xml
<insert id="write">
insert into bbs(id, writer, title, content)
values(bbs_seq.nextVal, #{param1}, #{param2}, #{param3})
</insert>


파라미터 한번에 보낼 때
@RequestMapping(value="/write", method=RequestMethod.POST )
public String write(
@ModelAttribute("dto") @Valid BbsDto bbsdto,
BindingResult result, Model model) {
if(result.hasErrors()) {
if(result.getFieldError("writer")!=null)
model.addAttribute("msg",result.getFieldError("writer").getDefaultMessage());
else if(result.getFieldError("title")!=null)
model.addAttribute("msg",result.getFieldError("title").getDefaultMessage());
else if(result.getFieldError("content")!=null)
model.addAttribute("msg",result.getFieldError("content").getDefaultMessage());
return "writeForm";
} else {
bdao.write(bbsdto);
//bdao.write(bbsdto.getWriter(),bbsdto.getTitle(),bbsdto.getContent());
return "redirect:/";
}
}
IBbsDao
// public void write(String writer, String title, String content);
public void write(@Valid BbsDto bbsdto);
BbsDao.xml
<!--
<insert id="write">
insert into bbs(id, writer, title, content)
values(bbs_seq.nextVal, #{param1}, #{param2}, #{param3})
</insert>
-->
<insert id="write" parameterType="com.ecl.g12.dto.BbsDto">
insert into bbs(id, writer, title, content)
values(bbs_seq.nextVal, #{writer}, #{title}, #{content})
</insert>


게시글 상세보기
Controller
@RequestMapping("view")
public String view(Model model, @RequestParam("id") int id) {
model.addAttribute("dto", bdao.view(id));
return "view";
}
IBbsDao
public BbsDto view(int id);
BbsDao.xml
<select id="view" resultType = "com.ecl.g12.dto.BbsDto">
select * from bbs where id=#{param1}
</select>
view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>view.jsp</title>
</head>
<body>
내용보기 <br>
<hr>
작성자 : ${dto.writer} <br>
제목 : ${dto.title} <br>
내용 : ${dto.content}
<hr>
<br><p>
<a href="/">목록보기</a>
</body>
</html>

게시글 수정하기
Controller
@RequestMapping("updateForm")
public String updateForm(Model model, @RequestParam("id") int id) {
model.addAttribute("dto", bdao.view(id));
return "updateForm";
}
updateForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>updateForm.jsp</title>
</head>
<body>
<table width="500" cellpadding="0" cellspacing="0" border="1">
<form action="update" method="post">
<tr><td> 작성자 </td><td>
<input type="text" name="writer" size = "100" value="${dto.writer}">
<input type="hidden" name="id" value="${dto.id}"></td></tr>
<tr><td> 제목 </td><td>
<input type="text" name="title" size = "100" value="${dto.title}" ></td></tr>
<tr><td> 내용 </td><td>
<input type="text" name="content" size = "100"
value="${dto.content}"></td></tr>
<tr><td colspan="2">
<input type="submit" value="수정">
<a href="/">목록보기</a></td></tr>
<tr><td colspan="2">${msg }</td></tr>
</form><br>
</table>
</body>
</html>
Controller
@RequestMapping(value="/update", method=RequestMethod.POST)
public String update(
@ModelAttribute("dto") @Valid BbsDto bbsdto,
BindingResult result, Model model) {
if(result.hasErrors()) {
if(result.getFieldError("writer")!=null)
model.addAttribute("msg",result.getFieldError("writer").getDefaultMessage());
else if(result.getFieldError("title")!=null)
model.addAttribute("msg",result.getFieldError("title").getDefaultMessage());
else if(result.getFieldError("content")!=null)
model.addAttribute("msg",result.getFieldError("content").getDefaultMessage());
return "updateForm";
} else {
bdao.update(bbsdto);
return "redirect:/";
}
}
IBbsDao
public void update(@Valid BbsDto bbsdto);
BbsDao.xml
<update id="update" parameterType="com.ecl.g12.dto.BbsDto">
update bbs set writer=#{writer}, title=#{title}, content=#{content}
where id=#{id}
</update>


게시글 삭제하기
Controller
@RequestMapping("delete")
public String delete(Model model, @RequestParam("id") int id) {
bdao.delete(id);
return "redirect:/";
}
IBbsDao
public void delete(int id);
BbsDao.xml
<delete id="delete">
delete from bbs where id=#{param1} <!-- id=#{id}도 가능 -->
</delete>
