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="입력">&nbsp;&nbsp;
		<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="수정">&nbsp;&nbsp;
		<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>
번호 5 삭제됨