50일차(3)/Spring(6) : MyBatis / 회원정보 수정 기능 구현 (getData, update)
- 회원정보 불러오기, 회원정보 수정 기능 구현
- getData, update, updateform 메소드 완성하고 뷰 페이지 생성
MemberController (최종)
package com.sy.spring02.member.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.sy.spring02.member.dao.MemberDao;
import com.sy.spring02.member.dto.MemberDto;
@Controller
public class MemberController {
//필요한 핵심 의존 객체를 주입받는다.
@Autowired
private MemberDao dao;
@RequestMapping("/member/update")
public String update(MemberDto dto) {
dao.update(dto);
return "member/update";
}
@RequestMapping("/member/updateform")
public ModelAndView updateform(int num, ModelAndView mView) {//ModelAndView 객체도 받을 수 있다.
//수정할 회원의 정보를 DB에서 불러온다.
MemberDto dto=dao.getData(num);
//ModelAndView 객체에 담고
mView.addObject("dto", dto);
//view page의 정보도 담아서
mView.setViewName("member/updateform");
//리턴해준다.
return mView;
}
@RequestMapping("/member/delete")
public String delete(int num) {//get 방식 전송 파라미터도 추출 가능
dao.delete(num);
return "redirect:/member/list";
}
@RequestMapping("/member/insert")
public String insert(MemberDto dto) { //폼 전송되는 name, addr이 자동으로 추출되어 MemberDto에 담겨서 전달된다.
dao.insert(dto);
return "member/insert";
}
@RequestMapping("/member/insertform")
public String insertfrom() {
// /WEB-INF/views/member/insertform.jsp로 forward 이동해서 응답
return "member/insertform";
}
@RequestMapping("/member/list")
public ModelAndView getList(ModelAndView mView) {
//주입받은 MemberDao 객체를 이용해서 회원목록을 얻어온다.
List<MemberDto> list=dao.getList();
//View page에 전달할 Model을 담는다.
mView.addObject("list", list);
//View page 정보도 담아서
mView.setViewName("member/list");
//리턴해준다.
return mView;
}
}
MemberDaoImpl
package com.sy.spring02.member.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.sy.spring02.member.dto.MemberDto;
// component scan 을 통해서 spring 이 관리하는 bean 이 될수 있도록 어노테이션 붙여놓기
@Repository
public class MemberDaoImpl implements MemberDao{
@Autowired
private SqlSession session; // select, insert, update, delete 작업을 하기 위한 핵심 의존 객체
@Override
public void insert(MemberDto dto) {
/*
* mapper's namespace=>member
* sql's id=>insert
* parameterType=MemberDto
*/
session.insert("member.insert", dto);
}
@Override
public void update(MemberDto dto) {
/*
* mapper's namespace => member
* sql's id => update
* resultType => dto
*/
session.update("member.update", dto);
}
@Override
public void delete(int num) {
/*
* mapper's namespace => member
* sql's id => delete
* resultType => int
*/
session.delete("member.delete", num);
}
@Override
public MemberDto getData(int num) {
/*
* mapper's namespace => member
* sql's id => getData
* parameterType => int
*
* - selectOne() 메소드를 호출하면 mapper xml의 resultType이 바로 메소드의 return type이 된다.
* resultType => MemberDto
* return Type => MemberDto
*/
MemberDto dto=session.selectOne("member.getData", num);
return dto;
}
@Override
public List<MemberDto> getList() {
/*
* mapper's namespace => member
* sql's id => getList
*
* - selectList() 메소드를 호출하면 List가 return type이고
* mapper xml의 resultType이 바로 List의 generic type이 된다.
*
* resultType => MemberDto
* return Type => List
*/
List<MemberDto> list=session.selectList("member.getList");
return list;
}
}
MemberMapper
<?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="member">
<select id="update" parameterType="com.sy.spring02.member.dto.MemberDto">
UPDATE member
SET name=#{name}, addr=#{addr}
WHERE num=#{num}
</select>
<select id="getData" parameterType="int" resultType="com.sy.spring02.member.dto.MemberDto">
SELECT num, name, addr
FROM member
WHERE num=#{num}
</select>
<!--
parameterType의 숫자나 문자열이면 값이 하나이기 때문에
#{ 여기는 아무 문자열이나 넣어도 된다. }
#{num}
#{xxx}
-->
<delete id="delete" parameterType="int">
DELETE FROM member
WHERE num=#{num}
</delete>
<!--
parameterType이 dto인 경우에 값을 바인딩하는 방법은
#{ dto의 필드명 } 과 같은 방식으로 바인딩하면 된다.
#{ name }은 dto의 name이라는 필드에 있는 값을 해당 위치에 바인딩하라는 의미이다.
#{ addr }은 dto의 addr이라는 필드에 있는 값을 해당 위치에 바인딩하라는 의미이다.
즉 필드명과 일치시켜야 동작을 한다.
#{ } 기호는 MyBatis가 해석하는 특별한 기호이다.
-->
<insert id="insert" parameterType="com.sy.spring02.member.dto.MemberDto">
INSERT INTO member
(num, name, addr)
VALUES(member_seq.NEXTVAL, #{name}, #{addr})
</insert>
<!--
여기서 resultType은 select 된 row를 어떤 객체에 담을지를 결정하는 것이다.
dto로 설정했다면
SELECT num, name, addr 의 칼럼명과
dto의 필드명이 반드시 일치해야 정상 동작을 한다.
-->
<select id="getList" resultType="com.sy.spring02.member.dto.MemberDto">
SELECT num, name, addr
FROM member
ORDER BY num ASC
</select>
</mapper>
- 수정 기능 추가
- 컨트롤러 추가
@RequestMapping("/member/updateform")
public ModelAndView updateform(int num, ModelAndView mView) {//ModelAndView 객체도 받을수 있다.
//수정할 회원의 정보를 DB 에서 불러와서
MemberDto dto=dao.getData(num);
//ModelAndView 객체에 담고
mView.addObject("dto", dto);
//view page 의 정보도 담아서
mView.setViewName("member/updateform");
//리턴해준다.
return mView;
}
- MemberDaoImpl의 메소드 수정(getdata)
@Override
public MemberDto getData(int num) {
/*
* mapper's namespace => member
* sql's id => getData
* parameterType => int
*
* - selectOne() 메소드를 호출하면 mapper xml의 resultType이 바로 메소드의 return type이 된다.
* resultType => MemberDto
* return Type => MemberDto
*/
MemberDto dto=session.selectOne("member.getData", num);
return dto;
}
MemberDto dto=session.selectOne("member.getData", num);
가져올 데이터가 하나이므로 selectOne 사용!
- selectOne() 메소드를 호출하면 mapper xml의 resultType이 바로 메소드의 return type이 된다.
- selectList() 메소드를 호출하면 List가 return type이고
mapper xml의 resultType 이 바로 List의 generic type ( MemberDto )이 된다.
- 둘을 비교해서 기억하기!
- mapper 작성
<select id="getdata" parameterType="int" resultType="com.sy.spring02.member.dto.MemberDto">
SELECT num, name, addr
FROM member
WHERE num=#{num}
</select>
- #{num} 에는 아무 단어나 들어가도 된다. 어차피 하나의 값만 가져왔으므로!(위의 int)
- updateform.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>updateform.jsp</title>
</head>
<body>
<div class="container">
<h1>회원정보 수정 폼</h1>
<form action="update" method="post">
<input type="hidden" name="num" value="${dto.num }" />
<div>
<label for="num">번호</label>
<input type="text" id="num" value="${dto.num }" readonly />
</div>
<div>
<label for="name">이름</label>
<input type="text" name="name" value="${dto.name }" />
</div>
<div>
<label for="addr">주소</label>
<input type="text" name="addr" value="${dto.addr }" />
</div>
<button type="submit">수정확인</button>
<button type="reset">취소</button>
</form>
</div>
</body>
</html>
- ModelAndView에 담으면 알아서 request 영역에 담긴다.
- 어떤 키값으로, 어떤 타입으로 담았는지 기억하고 이동해야한다. 그래야 원활하게 작성할 수 있다.
- getData 를 사용해서 이렇게 기본값이 들어와 있다.
- 컨트롤러 - 메소드 - sql문 작성 - 뷰 페이지 생성
컨트롤러 - update
@RequestMapping("/member/update")
public String update(MemberDto dto) {
dao.update(dto);
return "member/update";
}
- 수정 폼에서 파라미터 값이 3개가 넘어온다.
- dto로 이 3개를 모두 받아올 수 있다.
DaoImpl - update메소드 수정
@Override
public void update(MemberDto dto) {
/*
* mapper's namespace => member
* sql's id => update
* resultType => dto
*/
session.update("member.update", dto);
}
- nameplace, id, resultType 기억
- mapper 작성
<select id="update" parameterType="com.sy.spring02.member.dto.MemberDto">
UPDATE member
SET name=#{name}, addr=#{addr}
WHERE num=#{num}
</select>
- dto에서 각각에 매칭시켜준다. 필드와 이름이 같으면!
/views/member/ update.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/views/member/update.jsp</title>
</head>
<body>
<div class="container">
<h3>알림</h3>
<p>
회원 정보를 수정했습니다.
<a href="${pageContext.request.contextPath}/member/list">확인</a>
</p>
</div>
</body>
</html>
- 뷰 페이지까지 생성하면 완성!
'국비교육(22-23)' 카테고리의 다른 글
51일차(1)/Spring(8) : Interceptor (0) | 2022.12.19 |
---|---|
50일차(4)/Spring(7) : Service 메소드 / Todo 테이블로 실습 (1) | 2022.12.18 |
50일차(2)/Spring(5) : MyBatis / 회원 추가, 삭제 기능 구현 (insert, delete) (0) | 2022.12.17 |
50일차(1)/Spring(4) : MyBatis 설치 / DB 데이터 불러오기 (getList) (0) | 2022.12.17 |
49일차(2)/Spring(3) : 요청 파라미터 추출 / forward, redirect 이동 / Dependency Injection (0) | 2022.12.15 |