본문 바로가기
Spring

Spring #3 : 마이바티스 프레임워크 - 회원 출력/검색/추가/수정/삭제 (230117)

by haheehee 2023. 1. 18.

기존의 JDBC

- connection → Statement 객체 생성 → SQL문 전송 → 결과 반환 → close 과정으로 작업

- SQL문이 프로그래밍 코드에 섞여 코드가 복잡 => 사용, 유지 보수가 어려움

 

++ 마이바티스 ++

- 마이바티스 프레임워크를 도입 => SQL문의 가독성을 높여서 사용이 편리

- 코드와 SQL문을 분리 -> 사용, 유지 보수가 편리

 

- SQL 실행 결과를 자바 빈즈 또는 Map 객체에 매핑해 주는 Persisitence 솔루션으로 관리

- SQL을 소스 코드가 아닌 XML로 분리

- SQL문과 프로그래밍 코드를 분리해서 구현

- 데이터소스(DataSource) 기능과 트랜잭션 처리 기능 제공

 

  1. SqlMapConfig.xml에 각 기능별로 실행할 SQL문을 SqlMap.xml에 미리 작성한 후 등록
  2. 애플리케이션에서 데이터베이스와 연동하는 데 필요한 데이터를 각각의 매개변수에 저장한 후 마이바티스에 전달
  3. 애플리케이션에서 요청한 SQL문을 SqlMap.xml에서 선택
  4. 전달한 매개변수와 선택한 SQL문을 결합
  5. 매개변수와 결합된 SQL문을 DBMS에서 실행
  6. DBMS에서 반환된 데이터를 애플리케이션에서 제공하는 적당한 매개변수에 저장한 후 반환

 

필요 JAR파일 라이브러리에 추가

마이바티스 설정 파일

설정 파일 function
SqlMapConfig.xml 데이터베이스 연동 시 반환되는 값을 저장할 빈, 트랜잭션, 데이터소스 등 마이바티스 관련 정보 설정
member.xml 회원 정보 관련 SQL문 설정

SqlSession 클래스의 메소드들

method function
List selectList(query_id) id에 대한 select문을 실행한 후 여러 레코드를 List로 반환
List selectList(query_id, 조건) id에 대한 select문을 실행하면서 사용되는 조건도 전달
T selectOne(query_id) id에 대한 select문을 실행한 후 지정한 타입으로 한 개의 레코드를 반환
T selectOne(query_id, 조건) id에 대한 select문을 실행하면서 사용되는 조건도 전달
Map<K,V>selectMap(quert_id, 조건) id에 대한 select문을 실행하면서 사용되는 조건도 전달합니다. Map 타입으로 레코드를 반환
int insert(query_id, Object obj) id에 대한 insert문을 실행하면서 obj 객체의 값을 테이블에 추가
int update(query_id, Object obj) obj 객체의 값을 조건문의 수정 값으로 사용해 id에 대한 update문을 실행
int delete(query_id, Object obj) obj 객체의 값을 조건문의 조건 값으로 사용해 id에 대한 delete문을 실행

 

경로를 꼭 이대로 해야한다!!! (형식이 정해진 것)

**src 패키지 아래에 SqlMapConfig.xml은 mybatis 패키지에,

**member.xml은 /mybatis/mappers 패키지에 위치

 

 


마이바티스 회원 정보 출력 실습 #1

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
	
<configuration>
	<typeAliases>
		<typeAlias type="com.spring.ex01.MemberVO" alias="memberVO" />
	</typeAliases>
	
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="org.mariadb.jdbc.Driver" />
				<property name="url" value="jdbc:mariadb://localhost:3306/membertable" />
				<property name="username" value="root" />
				<property name="password" value="1234" />
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<mapper resource="mybatis/mappers/member.xml" />
	</mappers>
</configuration>

SqlMapConfig.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="mapper.member">
	<resultMap id="memResult" type="memberVO">
		<result property="id" column="id" />
		<result property="pwd" column="pwd" />
		<result property="name" column="name" />
		<result property="email" column="email" />
		<result property="joinDate" column="joinDate" />
	</resultMap>
	
	<select id="selectAllMemberList" resultMap="memResult">
	<![CDATA[ 
		select * from t_member order by joinDate desc
	]]>
	</select>
	
	<select id="selectName" resultType="String">
		<![CDATA[ 
			select name from t_member
			where id = 'kongdol'
		]]>
	</select>
	<select id="selectPwd" resultType="int">
		<![CDATA[ 
			select pwd from t_member
			where id = 'kongdol'
		]]>
	</select>
	
	<select id="selectMemberById" resultType="memberVO" parameterType="String">
		<![CDATA[ 
			select * from t_member
			where id=#{id}
		]]>
	</select>
	<select id="selectMemberByPwd" resultMap="memResult" parameterType="int">
		<![CDATA[ 
			select * from t_member
			where pwd=#{pwd}
		]]>
	</select>
	
	<insert id="insertMember" parameterType="memberVO">
		<![CDATA[ 
			insert into t_member(id,pwd,name,email)
			values(#{id},#{pwd},#{name},#{email})
		]]>
	</insert>
	<insert id="insertMember2" parameterType="java.util.Map">
		<![CDATA[ 
			insert into t_member(id,pwd,name,email)
			values(#{id},#{pwd},#{name},#{email})
		]]>
	</insert>
	
	<update id="updateMember" parameterType="memberVO">
		<![CDATA[ 
			update t_member
			set pwd=#{pwd}, name=#{name}, email=#{email}
			where id=#{id}
		]]>
	</update>
	
	<delete id="deleteMember" parameterType="String">
		<![CDATA[ 
			delete from t_member
			where id=#{id}
		]]>
	</delete>
	
	<!-- 동적 SQL문 -->
	<select id="searchMember" parameterType="memberVO" resultMap="memResult">
		<![CDATA[ 
			select * from t_member
		]]>
		<where>
			<if test=" name != '' and name != null">
				name=#{name}
			</if>
			<if test=" email != '' and email != null">
				and email=#{email}
			</if>
		</where>
		order by joinDate desc
	</select>
	
	<select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
		<![CDATA[ 
			select * from t_member
		]]>
		where name in
		<foreach item="item" collection="list" open="(" separator="," close=")">
			#{item}
		</foreach>
		order by joinDate desc
	</select>
	
	<insert id="foreachInsert" parameterType="java.util.Map"> 
			insert INTO t_member(id, pwd, name, email)
			VALUES
			<foreach item="item" collection="list" index="index" separator=",">
			(#{item.id}, #{item.pwd}, #{item.name}, #{item.email})
		</foreach>
	</insert>
	
	<!-- like 검색 -->
	<select id="selectLike" resultMap="memResult" parameterType="String">
		<![CDATA[ 
			select * from t_member
			where
			name like '%' || #{name} || '%'
		]]>
	</select>
</mapper>

member.xml

 <result>태그 안 속성 : property --> MemberVO객체안         /         column --> DB

<![CDATA[ ...query문...]]> : 없어도 되지만, 간혹 오류가 발생하므로 꼭 넣어주기

DB표현언어 ===> #{..}

 

package com.spring.ex01;

import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/mem.do")
public class MemberServlet extends HttpServlet {	
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 호출");
	}
	public void destroy() {
		System.out.println("destroy 호출");		
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	
	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		MemberDAO dao = new MemberDAO();
		List<MemberVO> membersList = dao.selectAllMemberList();
		request.setAttribute("membersList", membersList);
		RequestDispatcher dispatch = request.getRequestDispatcher("test01/listMembers.jsp");
		dispatch.forward(request, response);
	}
}

MemberServlet.java

 

package com.spring.ex01;

import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MemberDAO {
	public static SqlSessionFactory sqlMapper = null;
	private static SqlSessionFactory getInstance() {
		if(sqlMapper == null) {
			try {
				String resource = "mybatis/SqlMapConfig.xml";
				Reader reader = Resources.getResourceAsReader(resource);
				sqlMapper = new SqlSessionFactoryBuilder().build(reader);
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sqlMapper;
	}
	
	public List<MemberVO> selectAllMemberList() {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		List<MemberVO> memlist = null;
		memlist = session.selectList("mapper.member.selectAllMemberList");
		return memlist;
	}
}

MemberDAO.java

 

MemberVO.java (그대로)

 

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" import="java.util.*,com.spring.ex01.*" isELIgnored="false"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>회원정보 출력창</title>
<style type="text/css">
.cls1 {	font-size: 40px;	text-align: center; }
.cls2 {	text-align: center; }
</style>
</head>
<body>
	<table align="center" width="80%" border="1">
		<tr align="center" bgcolor="lightblue">
			<td>ID</td>
			<td>PASSWORD</td>
			<td>NAME</td>
			<td>EMAIL</td>
			<td>JOINDATE</td>
		</tr>
		<c:forEach var="member" items="${membersList}">
			<tr align="center">
				<td>${member.id}</td>
				<td>${member.pwd}</td>
				<td>${member.name}</td>
				<td>${member.email}</td>
				<td>${member.joinDate}</td>			
			</tr>
		</c:forEach>
	</table>
</body>
</html>

test01폴더 안 listMembers.jsp 파일

 

-- 결과 --

 


마이바티스 회원 (ID, 비밀번호 조회) 실습 #2

member.xml

SqlMapConfig.xml 등 기본설정 실습 #1과 동일

 

package com.spring.ex02;
...
@WebServlet("/mem2.do")
public class MemberServlet extends HttpServlet {	
	...	
	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		MemberDAO dao = new MemberDAO();
		String name = dao.selectName();
		// int pwd = dao.selectPwd();
		PrintWriter pw = response.getWriter();
		pw.write("<script>");
		pw.write(" alert('이름 : " + name + "');");
		// pw.write(" alert('비밀번호 : " + pwd + "');");
		pw.write("</script>");
	}
}

MemberServlet.java

com.spring.ex02 패키지 생성해서 넣기

 

package com.spring.ex02;
...
public class MemberDAO {
	public static SqlSessionFactory sqlMapper = null;
	private static SqlSessionFactory getInstance() {
		if(sqlMapper == null) {
			try {
				String resource = "mybatis/SqlMapConfig.xml";
				Reader reader = Resources.getResourceAsReader(resource);
				sqlMapper = new SqlSessionFactoryBuilder().build(reader);
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sqlMapper;
	}
	
	public String selectName() {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		String name = session.selectOne("mapper.member.selectName");
		return name;
	}
	public int selectPwd() {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		int pwd = session.selectOne("mapper.member.selectPwd");
		return pwd;
	}
}

MemberDAO.java

마찬가지로 ex02패키지에..

 

-- 결과 --

pwd부분 주석 풀고, id관련 부분 주석처리


마이바티스 회원 (조건값으로 정보 조회) 실습 #3

- MemberDAO에서 메서드 호출 시 전달된 조건 값은 매개변수 이름으로 SQL문의 조건식에 전달

- SQL문에서 조건값 사용 방법 : #{전달된_매개변수명}

 

member.xml

SqlMapConfig.xml

MemberVO.java 등 기본설정 실습 #1과 동일

MemberVO는 com.spring.ex01의 MemberVO를 import해와서 사용

 

package com.spring.ex03;
...
import com.spring.ex01.MemberVO;
@WebServlet("/mem3.do")
public class MemberServlet extends HttpServlet {	
	...	
	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		MemberDAO dao = new MemberDAO();
		MemberVO memberVO = new MemberVO();
		String action = request.getParameter("action");
		String nextPage = "";
		if(action==null || action.equals("listMembers")) {
			List membersList = dao.selectAllMemberList();
			request.setAttribute("membersList", membersList);
			nextPage = "test02/listMembers.jsp";
		} else if(action.equals("selectMemberById")) {
			String id = request.getParameter("value");
			memberVO = dao.selectMemberById(id);
			request.setAttribute("member", memberVO);
			nextPage = "test02/memberInfo.jsp";
		} else if(action.equals("selectMemberByPwd")) {
			int pwd = Integer.parseInt(request.getParameter("value"));
			List<MemberVO> membersList = dao.selectMemberByPwd(pwd);
			request.setAttribute("membersList", membersList);
			nextPage = "test02/listMembers.jsp";
		}
		RequestDispatcher dispatch = request.getRequestDispatcher(nextPage);
		dispatch.forward(request, response);
	}
}

MemberServlet.java

 

package com.spring.ex03;
...
import com.spring.ex01.MemberVO;
public class MemberDAO {
	public static SqlSessionFactory sqlMapper = null;
	private static SqlSessionFactory getInstance() {
		if(sqlMapper == null) {
			try {
				String resource = "mybatis/SqlMapConfig.xml";
				Reader reader = Resources.getResourceAsReader(resource);
				sqlMapper = new SqlSessionFactoryBuilder().build(reader);
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sqlMapper;
	}

	public List<MemberVO> selectAllMemberList() {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		List<MemberVO> memlist = null;
		memlist = session.selectList("mapper.member.selectAllMemberList");
		return memlist;
	}

	public MemberVO selectMemberById(String id) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		MemberVO memberVO = session.selectOne("mapper.member.selectMemberById", id);
		return memberVO;
	}
	public List<MemberVO> selectMemberByPwd(int pwd) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		List<MemberVO> membersList = null;
		membersList = session.selectList("mapper.member.selectMemberByPwd", pwd);
		return membersList;
	}
}

MemberDAO.java

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 검색창</title>
</head>
<body>
	<form action="${pageContext.request.contextPath}/mem3.do">
		입력 : <input type="text" name="value" />
		<select name="action">
			<option value="listMembers">전체</option>
			<option value="selectMemberById">아이디</option>
			<option value="selectMemberByPwd">비밀번호</option>
		</select><br>
		<input type="submit" value="검색" />
	</form>
</body>
</html>

search.jsp

test02폴더 생성 후,

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
	<table border="1" width="100%" align="center">
		<tr align=center bgcolor="lightblue">
			<td><b>아이디</b></td>
			<td><b>비밀번호</b></td>
			<td><b>이름</b></td>
			<td><b>이메일</b></td>
			<td><b>가입일</b></td>
		</tr>
		<tr align=center>
			<td>${member.id}</td>
			<td>${member.pwd}</td>
			<td>${member.name}</td>
			<td>${member.email}</td>
			<td>${member.joinDate}</td>
		</tr>
	</table>
</body>
</html>

memberInfo.jsp

마찬가지로 test02폴더 안에

 

-- 결과 --

search.jsp 서버로 실행

초기 실행 화면

'kongdol'을 입력후, 아이디 선택-> 검색

id가 'kongdol'인 회원 정보가 출력된다.

 

다시 되돌아가,

비밀번호가 '1234'인 회원정보 검색

해당 회원 정보가 출력된다.

 

 


마이바티스 회원 (추가) 실습 #4

...
	<insert id="insertMember" parameterType="memberVO">
		<![CDATA[ 
			insert into t_member(id,pwd,name,email)
			values(#{id},#{pwd},#{name},#{email})
		]]>
	</insert>
...

member.xml 위와 동일한데, 이 부분을 쓰는 것!

resultMap : 위쪽에서 만든 것

 

...
	else if(action.equals("insertMember")) {
			String id = request.getParameter("id");
			String pwd = request.getParameter("pwd");
			String name = request.getParameter("name");
			String email = request.getParameter("email");
			memberVO.setId(id);
			memberVO.setPwd(pwd);
			memberVO.setName(name);
			memberVO.setEmail(email);
			dao.insertMember(memberVO);
			nextPage = "/mem4.do?action=listMembers";
		}
...

MemberServlet.java

doHandle()함수 제일 밑에 :

RequestDispatcher dispatch = request.getRequestDispatcher(nextPage);
dispatch.forward(request, response);

위 두 줄은 나중에 xml로 빼야한다. -> 흐름에 관계없으니까!

 

...
    public int insertMember(MemberVO memberVO) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		int result = 0;
		result = session.insert("mapper.member.insertMember", memberVO);
		session.commit();
		return result;
	}
...

MemberDAO.java

session.insert("mapper.member.insertMember", memberVO);

=> 지정한 id의 SQL문에 memberVO의 값을 전달 -> 회원 정보를 테이블에 추가.

session.commit();

=> 수동 커밋 -> 반드시 commit()메소드 호출해서 영구 반영.

 

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" isELIgnored="false"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>회원가입 창</title>
</head>
<body>
	<form method="post" action="${contextPath}/mem4.do?action=insertMember">
		<h1 style="text-align: center">회원가입창</h1>
		<table align="center">
			<tr>
				<td width="200"><p align="right">아이디</p></td>
				<td width="400"><input type="text" name="id"></td>
			</tr>
			<tr>
				<td width="200"><p align="right">비밀번호</p></td>
				<td width="400"><input type="password" name="pwd"></td>
			</tr>
			<tr>
				<td width="200"><p align="right">이름</p>	</td>
				<td width="400"><input type="text" name="name"></td>
			</tr>
			<tr>
				<td width="200"><p align="right">이메일</p></td>
				<td width="400"><input type="text" name="email"></td>
			</tr>
			<tr>
				<td width="200"></td>
				<td width="80">
					<input type="submit" value="가입하기">
					<input type="reset" value="다시입력">
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

memberForm.jsp

(test03 폴더)

 

-- 결과 --

회원가입창이 나오면, 

정보입력해서 받은 값.

데이터베이스에서도 확인 가능.

 


마이바티스 회원 (HashMap 사용 추가) 실습 #5

...
    <insert id="insertMember2" parameterType="java.util.Map">
		<![CDATA[ 
			insert into t_member(id,pwd,name,email)
			values(#{id},#{pwd},#{name},#{email})
		]]>
	</insert>
...

member.xml

동일함! 위 부분을 사용

 

...
    else if(action.equals("insertMember2")) {
			String id = request.getParameter("id");
			String pwd = request.getParameter("pwd");
			String name = request.getParameter("name");
			String email = request.getParameter("email");
			Map memberMap = new HashMap();
			memberMap.put("id", id);
			memberMap.put("pwd", pwd);
			memberMap.put("name", name);
			memberMap.put("email", email);
			dao.insertMember2(memberMap);
			nextPage = "/mem4.do?action=listMembers";
		}
...

MemberServlet.java 에 추가

(com.spring.ex04)

 

...
	public int insertMember2(Map<String, String> memberMap) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		int result = session.insert("mapper.member.insertMember2", memberMap);
		session.commit();
		return result;
	}
...

MemberDAO.java 에 추가

(com.spring.ex04)

 

...
    <form method="post" action="${contextPath}/mem4.do?action=insertMember2">
...

memberForm.jsp

<form>태그의 action 속성값 수정!! insertMember에서 insertMember2로

 

-- 결과 --

실습 #4와 동일한 결과

 


마이바티스 회원 (수정, 삭제) 실습 #6

...
    <update id="updateMember" parameterType="memberVO">
		<![CDATA[ 
			update t_member
			set pwd=#{pwd}, name=#{name}, email=#{email}
			where id=#{id}
		]]>
	</update>
	
	<delete id="deleteMember" parameterType="String">
		<![CDATA[ 
			delete from t_member
			where id=#{id}
		]]>
	</delete>
...

member.xml

동일함! 위부분사용

 

...
        else if(action.equals("updateMember")) {
			String id = request.getParameter("id");
			String pwd = request.getParameter("pwd");
			String name = request.getParameter("name");
			String email = request.getParameter("email");
			memberVO.setId(id);
			memberVO.setPwd(pwd);
			memberVO.setName(name);
			memberVO.setEmail(email);
			dao.updateMember(memberVO);
			nextPage = "/mem4.do?action=listMembers";
		} else if(action.equals("deleteMember")) {
			String id = request.getParameter("id");
			dao.deleteMember(id);
			nextPage = "/mem4.do?action=listMembers";
		}
...

MemberServlet.java 에 추가

dao.updateMember(memberVO); => 회원 수정창에서 전송된 회원 정보를 MemberVO의 속성에 설정,

=> 후 updateMember()호출하면서 MemberVO객체를 전달

delete는 id를 가지고와서 전달된 ID를 deleteMember()메소드를 호출해 SQL문으로 전달.

 

...
	public int updateMember(MemberVO memberVO) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		int result = session.update("mapper.member.updateMember", memberVO);
		session.commit();
		return result;
	}

	public int deleteMember(String id) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		int result = session.delete("mapper.member.deleteMember", id);
		session.commit();
		return result;
	}
...

MemberDAO.java 에 추가

session.update("mapper.member.updateMember", memberVO);

=> update문 호출 시 SqlSession의 update()메서드 사용

updateMember() 메소드 성공하면 1리턴.

update 함수에서는 꼭 session.commit(); 필수!!! => 임시로 업데이트한 것이므로 확정해야한다.

 

session.delete("mapper.member.deleteMember", id);

=>SqlSession의 delete()메소드 사용.

마찬가지로 SQL문 실행한 후, 커밋하기

 

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" isELIgnored="false"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>회원정보 수정창</title>
</head>
<body>
	<form method="post" action="${contextPath}/mem4.do?action=updateMember">
		<h1 style="text-align: center">회원 정보 수정창</h1>
		<table align="center">
			<tr>
				<td width="200"><p align="right">아이디</p></td>
				<td width="400"><input type="text" name="id"></td>
			</tr>
			<tr>
				<td width="200"><p align="right">비밀번호</p></td>
				<td width="400"><input type="password" name="pwd"></td>
			</tr>
			<tr>
				<td width="200"><p align="right">이름</p>	</td>
				<td width="400"><input type="text" name="name"></td>
			</tr>
			<tr>
				<td width="200"><p align="right">이메일</p></td>
				<td width="400"><input type="text" name="email"></td>
			</tr>
			<tr>
				<td width="200"></td>
				<td width="80">
					<input type="submit" value="수정하기">
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

modMember.jsp

test03폴더에 추가

 

...
	<td>수정</td>
	<td>삭제</td>
...
	<td><a href="${contextPath}/mem4.do?action=updateMember">수정</a></td>
	<td><a href="${contextPath}/mem4.do?action=deleteMember&id=${member.id}">삭제</a></td>
...

listMembers.jsp

에 수정/삭제 열 추가

 

-- 결과 --

mem4.do호출해서 회원정보 출력창

 

김우유 수정창을 눌러서

id가 dou인 회원의 비밀번호, 이름, 이메일을 수정하기 위해 해당칸에 다른 데이터를 입력.

회원 출력창과 데이터베이스에서 

해당 회원의 정보가 수정된 것을 확인할 수 있다.

 

id가 iamJsp인 회원의 정보를 삭제

(삭제클릭)

삭제되었다.

 


마이바티스 회원 (검색) 실습 #7

 

...
	<!-- 동적 SQL문 -->
	<select id="searchMember" parameterType="memberVO" resultMap="memResult">
		<![CDATA[ 
			select * from t_member
		]]>
		<where>
			<if test=" name != '' and name != null">
				name=#{name}
			</if>
			<if test=" email != '' and email != null">
				and email=#{email}
			</if>
		</where>
		order by joinDate desc
	</select>
...

member.xml

 

...
	else if(action.equals("searchMember")) {
			String name = request.getParameter("name");
			String email = request.getParameter("email");
			memberVO.setName(name);
			memberVO.setEmail(email);
			List membersList = dao.searchMember(memberVO);
			request.setAttribute("membersList", membersList);
			nextPage = "test03/listMembers.jsp";
		}
...

MemberServlet.java 에 추가

 

...
	public List searchMember(MemberVO memberVO) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		List list = session.selectList("mapper.member.searchMember", memberVO);
		return list;
	}
...

MemberDAO.java 에 추가

 

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" import="java.util.*,com.spring.ex01.*" isELIgnored="false"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>회원 검색</title>
<style type="text/css">
.cls1 {
	font-size: 40px;
	text-align: center;
}

.cls2 {
	text-align: center;
}
</style>
</head>
<body>
	<h2>회원검색</h2>
	<form action="${contextPath}/mem4.do">
		<input type="hidden" name="action" value="searchMember" />
		이름 : <input type="text" name="name" /><br>
		이메일 : <input type="text" name="email" /><br>
		<input type="submit" value="검색" />
	</form>
</body>
</html>

searchMember.jsp 추가

 

...
	<a href="${contextPath}/test03/searchMember.jsp"><h3 style="text-align: center">회원검색</h3></a>
...

listMembers.jsp 에 추가

 

-- 결과 --


마이바티스 회원 (foreach로 한번에 검색) 실습 #8

 

...
	<select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
		<![CDATA[ 
			select * from t_member
		]]>
		where name in
		<foreach item="item" collection="list" open="(" separator="," close=")">
			#{item}
		</foreach>
		order by joinDate desc
	</select>
...

member.xml

 

...
	else if(action.equals("foreachSelect")) {
			List<String> nameList = new ArrayList<String>();
			nameList.add("김자바");
			nameList.add("김디비");
			nameList.add("김제이");
			List membersList = dao.foreachSelect(nameList);
			request.setAttribute("membersList", membersList);
			nextPage = "test03/listMembers.jsp";
		}
...

MemberServlet.java 에 추가

 

...
	public List foreachSelect(List<String> nameList) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		List list = session.selectList("mapper.member.foreachSelect", nameList);
		return list;
	}
...

MemberDAO.java 에 추가

 

-- 결과 --

http://localhost:8080/prosp03r/mem4.do?action=foreachSelect 로 요청

nameList.add("김자바");
nameList.add("김디비");
nameList.add("김제이");

데이터베이스에 존재하는 두 회원의 정보가 나온다.

 


마이바티스 회원 (foreach로 한번에 추가) 실습 #9

 

...
	<insert id="foreachInsert" parameterType="java.util.Map"> 
			insert INTO t_member(id, pwd, name, email)
			VALUES
			<foreach item="item" collection="list" index="index" separator=",">
			(#{item.id}, #{item.pwd}, #{item.name}, #{item.email})
		</foreach>
	</insert>
...

member.xml

 

...
	else if(action.equals("foreachInsert")) {
			List<MemberVO> memList = new ArrayList();
			memList.add(new MemberVO("m1", "1234", "박길동", "m1@test.com"));
			memList.add(new MemberVO("m2", "1234", "정길동", "m2@test.com"));
			memList.add(new MemberVO("m3", "1234", "최길동", "m3@test.com"));
			int result = dao.foreachInsert(memList);
			nextPage="/mem4.do?action=listMembers";
		}
...

MemberServlet.java 에 추가

 

...
	public int foreachInsert(List<MemberVO> memList) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		int result = session.insert("mapper.member.foreachInsert", memList);
		session.commit();
		return result;
	}
...

MemberDAO.java 에 추가

 

-- 결과 --

http://localhost:8080/prosp03r/mem4.do?action=foreachInsert 로 요청

memList.add(new MemberVO("m1", "1234", "박길동", "m1@test.com"));
memList.add(new MemberVO("m2", "1234", "정길동", "m2@test.com"));
memList.add(new MemberVO("m3", "1234", "최길동", "m3@test.com"));

데이터베이스에 한번에 추가된 것을 확인할 수 있다.

댓글