본문 바로가기
Back/Spring

Day52_MyBatis CRUD 구조

by uxia 2023. 7. 6.

어제 MyBatis 초기 세팅을 배웠는데
세팅을 하고 JDBC 4 단계가 MyBatis에서는 얼마나 어떻게
줄어드는 지 확인한다.
 
insert문을 먼저 만들건데,
전체적인 구조는 이렇다.

 
그 많은 JDBC 코드가 5줄 내로 줄었다.

 
memberMapper.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="member">

	<insert id="insert" parameterType="memberDTO">
		insert into member values (#{id}, #{pw}, #{name}, #{tel})
	</insert>
	
	<!-- insert, update, delete문은 결과가 int임
		 mybatis에서는 resultType="int"가 자동으로 들어가있음 -->
	
</mapper>

 
MemberDAO

package com.multi.mvc04;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository // 어딘가에 저장하기 위한 용도의 어노테이션 
public class MemberDAO {
	
	@Autowired
	SqlSessionTemplate my; // 100번 주소
	
	public int insert(MemberDTO dto) {
		
		// 기존에는 JDBC 4단계 일일이 코딩했음
		return my.insert("member.insert", dto);
		
	}
	
}

 
MemberController

package com.multi.mvc04;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MemberController {
	
	@Autowired
	MemberDAO dao; // di
	
	@RequestMapping("insert")
	public void insert(MemberDTO dto) {
		int result = dao.insert(dto);
		System.out.println(result);
	}
	
}

 


 
다음은 update 부분도 만들어준다.
 
memberMapper.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="member">

	<insert id="insert" parameterType="memberDTO">
		insert into member values (#{id}, #{pw}, #{name}, #{tel})
	</insert>
	
	<!-- insert, update, delete문은 결과가 int임
		 mybatis에서는 resultType="int"가 자동으로 들어가있음 -->
	
	
	<!-- parameterType은 입력값 설정 -->
	<update id="update" parameterType="memberDTO">
		update member	
		set tel = #{tel}
		where id = #{id}
	</update>
	
</mapper>

 
MemberDAO

package com.multi.mvc04;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository // 어딘가에 저장하기 위한 용도의 어노테이션 
public class MemberDAO {
	
	@Autowired
	SqlSessionTemplate my; // 100번 주소
	
	public int insert(MemberDTO dto) {
		
		// 기존에는 JDBC 4단계 일일이 코딩했음
		return my.insert("member.insert", dto);
		
	}
	
	public int update(MemberDTO dto) {
		return my.update("member.update", dto);
	}
	
}

 
MemberController

package com.multi.mvc04;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MemberController {
	
	@Autowired
	MemberDAO dao; // di
	
	@RequestMapping("insert")
	public void insert(MemberDTO dto) {
		int result = dao.insert(dto);
		System.out.println(result);
	}
	
	@RequestMapping("update")
	public void update(MemberDTO dto, Model model) {
		int result = dao.update(dto);
		System.out.println(result);
		model.addAttribute("dto", dto);
	}
}

 
수정요청된 데이터를 views 페이지에서 보여주기 위해
model을 사용했다.

 


 
검색하는 one이 좀 헷갈리는데
구조를 한 눈에 보기 위해 정리했다.

 
 
memberMapper.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="member">

	<insert id="insert" parameterType="memberDTO">
		insert into member values (#{id}, #{pw}, #{name}, #{tel})
	</insert>
	
	<!-- insert, update, delete문은 결과가 int임
		 mybatis에서는 resultType="int"가 자동으로 들어가있음 -->
	
	
	<!-- parameterType은 입력값 설정 -->
	<update id="update" parameterType="memberDTO">
		update member	
		set tel = #{tel}
		where id = #{id}
	</update>
	
	<select id="one" parameterType="String" resultType="memberDTO">
		select * from member
		where id = #{id}
	</select>
</mapper>

 
MemberDAO

package com.multi.mvc04;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository // 어딘가에 저장하기 위한 용도의 어노테이션 
public class MemberDAO {
	
	@Autowired
	SqlSessionTemplate my; // 100번 주소
	
	public int insert(MemberDTO dto) {
		
		// 기존에는 JDBC 4단계 일일이 코딩했음
		return my.insert("member.insert", dto);
		
	}
	
	
	public int update(MemberDTO dto) {
		return my.update("member.update", dto);
	}
	
	
	public MemberDTO one(String id) {
		return my.selectOne("member.one", id);
	}
	
}

 
MemberController

package com.multi.mvc04;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MemberController {
	
	@Autowired
	MemberDAO dao; // di
	
	@RequestMapping("insert")
	public void insert(MemberDTO dto) {
		int result = dao.insert(dto);
		System.out.println(result);
	}
	
	@RequestMapping("update")
	public void update(MemberDTO dto, Model model) {
		int result = dao.update(dto);
		System.out.println(result);
		model.addAttribute("dto", dto);
	}
	
	@RequestMapping("one")
	public void one(String id, Model model) {
		MemberDTO dto = dao.one(id);
		System.out.println(dto);
		model.addAttribute("dto", dto);
	}
	
	
	
}

 
마찬가지로 model을 통해 DB로부터 데이터를 끌어온다.

 


 
모든 데이터를 한 눈에 보기 위한 list 페이지를 만든다.
 

 
 
memberMapper.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="member">

	<insert id="insert" parameterType="memberDTO">
		insert into member values (#{id}, #{pw}, #{name}, #{tel})
	</insert>
	
	<!-- insert, update, delete문은 결과가 int임
		 mybatis에서는 resultType="int"가 자동으로 들어가있음 -->
	
	
	<!-- parameterType은 입력값 설정 -->
	<update id="update" parameterType="memberDTO">
		update member	
		set tel = #{tel}
		where id = #{id}
	</update>
	
	<!-- 마이바티스에서 controller의 string id을 string에 받아서 저장 -->
	<select id="one" parameterType="String" resultType="memberDTO">
		select * from member
		where id = #{id}
	</select>
	
	<select id="count" parameterType="String" resultType="int">
		select count(id) from member
		where name = ${name}
	</select>
	
	<select id="all" resultType="memberDTO">
		select * from member
	</select>
</mapper>

 
 
MemberDAO

package com.multi.mvc04;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;



@Repository // 어딘가에 저장하기 위한 용도의 어노테이션 
public class MemberDAO {
	
	@Autowired
	SqlSessionTemplate my; // 100번 주소
	
	public int insert(MemberDTO dto) {
		
		// 기존에는 JDBC 4단계 일일이 코딩했음
		return my.insert("member.insert", dto);
		
	}
	
	
	public int update(MemberDTO dto) {
		return my.update("member.update", dto);
	}
	
	
	public MemberDTO one(String id) {
		return my.selectOne("member.one", id);
	}
	
	
	public List<MemberDTO> list() {
		return my.selectList("member.all");
	}
	
	
}

 
 
MemberController

package com.multi.mvc04;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MemberController {
	
	@Autowired
	MemberDAO dao; // di
	
	@RequestMapping("insert")
	public void insert(MemberDTO dto) {
		int result = dao.insert(dto);
		System.out.println(result);
	}
	
	@RequestMapping("update")
	public void update(MemberDTO dto, Model model) {
		int result = dao.update(dto);
		System.out.println(result);
		model.addAttribute("dto", dto);
	}
	
	@RequestMapping("one")
	public void one(String id, Model model) {
		MemberDTO dto = dao.one(id);
		System.out.println(dto);
		model.addAttribute("dto", dto);
	}
	
	@RequestMapping("list")
	public void list(Model model) {
		List<MemberDTO> list = dao.list();
		model.addAttribute("list", list);
	}
	
}

 
 
views 아래 list.jsp

<%@ page import="java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- taglib 지시자, tomcat에게 미리 예고 -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	회원 목록 검색<hr>
	<c:forEach items="${list}" var="dto">
	검색된 회원 ID : ${dto.id}<br>
	검색된 회원 PW : ${dto.pw}<br>
	검색된 회원 이름 : ${dto.name}<br>
	검색된 회원 번호 : ${dto.tel}<hr>
	</c:forEach>
</body>
</html>

 
 


 
 
마무리 팀프로젝트
 
- 추가할 table설정(항목 설정, 컬럼 제약조건설정)
- mybatis-config.xml에 추가할 내용 확인(mapper파일추가, alias추가)
- mapper파일 추가(이름, 어떤 crud를 사용할지 함께 정의)
- webapp아래 필요한 파일 확인
- views아래 필요한 파일 확인
- controller, dao확인
- dto확인
- 구현화면 + 에러(인원별 1개 이상)
- 에러(확인창 → 원인분석 → 해결과정)
 


 
나는 drug에 대한 목업 데이터를 받아서 진행했다.

drug.sql
0.03MB

 
 
drug_insert.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Drug Information</title>
    <style>
        body {
       		font-family: Arial, sans-serif;
            margin: 0; /* 추가 */
            display: flex;
            flex-direction: column; /* 추가 */
            justify-content: center;
            align-items: center;
            height: 95vh;
        }

        h3 {
            margin-bottom: 10px;
        }

        table {
            border-collapse: collapse;
            width: 300px;
            margin: 0 auto; /* 수정 */
        }

        th, td {
            padding: 8px;
            text-align: left;
        }

        .button-container {
            text-align: center;
            margin-top: 20px;
        }

        .button-container button {
            padding: 10px 20px;
            font-size: 16px;
            background-color: #4CAF50;
            border: none;
            color: white;
            cursor: pointer;
            border-radius: 4px;
        }

        .button-container button:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
    <h3>복용 약물 데이터 수집</h3><br>
    <a href="drug_insert.jsp">
        <button id="b1">첫페이지로</button>
    </a><br>

    <form action="drug_insert" method="post">
        <table>
            <tr>
                <td>약물 ID :</td>
                <td><input name="id" value="17"></td>
            </tr>
            <tr>
                <td>약물 이름 :</td>
                <td><input name="name" value="Nisoldipine"></td>
            </tr>
            <tr>
                <td>제조사 :</td>
                <td><input name="company" value="Washington"></td>
            </tr>
            <tr>
                <td>약물 코드 :</td>
                <td><input name="code" value="68428-228"></td>
            </tr>
        </table>
        <div class="button-container">
            <button type="submit" id="b2">Submit</button>
        </div>
    </form>
</body>
</html>

 
views / drug_insert.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="lightblue">
	입력한 약물 정보<hr>
	약물 ID : ${dto.id}<br>
	약물 이름 : ${dto.name}<br>
	제조사 : ${dto.company}<br>
	약물 코드 : ${dto.code}
</body>
</html>

 
출력 결과

 

 

 
 
drug_update.jsp
 
 
views/ drug_update.jsp
 
 
 
 
출력 결과

 

 

 
 
drug_one.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Drug Information Read</title>
    <style>
        body {
       		font-family: Arial, sans-serif;
            margin: 0; /* 추가 */
            display: flex;
            flex-direction: column; /* 추가 */
            justify-content: center;
            align-items: center;
            height: 95vh;
        }

        h3 {
            margin-bottom: 10px;
        }

        table {
            border-collapse: collapse;
            width: 300px;
            margin: 0 auto; /* 수정 */
        }

        th, td {
            padding: 8px;
            text-align: left;
        }

        .button-container {
            text-align: center;
            margin-top: 20px;
        }

        .button-container button {
            padding: 10px 20px;
            font-size: 16px;
            background-color: #4CAF50;
            border: none;
            color: white;
            cursor: pointer;
            border-radius: 4px;
        }

        .button-container button:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
    <h3>복용 약물 목록</h3><br>
    <a href="drug_one.jsp">
        <button id="b1">첫페이지로</button>
    </a><br>

    <form action="drug_one" method="post">
        <table>
            <tr>
                <td class="t1">약물 이름 :</td>
                <td><input name="name" value="ZYFLO"></td>
            </tr>
        </table>
         <div class="button-container">
            <button type="submit" id="b2">Submit</button>
        </div>
    </form>
</body>
</html>

 
views / drug_one.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor="lightblue">
	입력한 약물 정보<hr>
	약물 ID : ${dto.id}<br>
	약물 이름 : ${dto.name}<br>
	제조사 : ${dto.company}<br>
	약물 코드 : ${dto.code}
</body>
</html>

 
 
출력 결과

 

 

 
 
DrugController.java

package com.multi.mvc04;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class DrugController {
	
	@Autowired
	DrugDAO dao; //di
	
	@RequestMapping("drug_insert")
	public void insert(DrugDTO dto, Model model) {
		int result = dao.insert(dto);
		System.out.println(result);
		model.addAttribute("dto", dto);
	}
	
	@RequestMapping("drug_update")
	public void update(DrugDTO dto, Model model) {
		int result = dao.update(dto);
		System.out.println(result);
		model.addAttribute("dto", dto);
	}
	
	@RequestMapping("drug_one")
	public void one(String name, Model model) {
		System.out.println(name);
		DrugDTO dto = dao.one(name);
		System.out.println(dto);
		model.addAttribute("dto", dto);
	}
	
}

 
DrugDAO.java

package com.multi.mvc04;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class DrugDAO {

	@Autowired
	SqlSessionTemplate mysql;
	
	public int insert(DrugDTO dto) {
		return mysql.insert("drug.insert", dto);
		
	}
	
	public int update(DrugDTO dto) {
		return mysql.update("drug.update", dto);
	}
	
	public DrugDTO one(String name) {
		return mysql.selectOne("drug.one", name);
	}
	
}

 
 
DrugDTO.java

package com.multi.mvc04;

public class DrugDTO {
	
	private String id;
	private String name;
	private String company;
	private String code;
	
	
	public String getId() {
		return id;
	}
	
	public void setId(String id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getCompany() {
		return company;
	}
	
	public void setCompany(String company) {
		this.company = company;
	}
	
	public String getCode() {
		return code;
	}
	
	public void setCode(String code) {
		this.code = code;
	}
	
	
	@Override
	public String toString() {
		return "DrugDTO [id=" + id + ", name=" + name + ", company=" + company + ", code=" + code + "]";
	}
	
}

 
drugMapper.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="drug">

	<insert id="insert" parameterType="drugDTO">
		insert into drug values (#{id}, #{name}, #{company}, #{code})
	</insert>
	
	<!-- parameterType은 입력값 설정 -->
	<update id="update" parameterType="drugDTO">
		update drug	
		set code = #{code}
		where id = #{id}
	</update>
	
	<!-- 마이바티스에서 controller의 string id을 string에 받아서 저장 -->
	<select id="one" parameterType="String" resultType="drugDTO">
		select * from drug
		where name = #{name}
	</select>
	
	
	
	
</mapper>