본문 바로가기

자바 웹/스프링

마이바티스

728x90
  • SQL을 소스 코드가 아닌 XML로 분리
  • SQL문과 코드를 분리해서 구현
  • 데이터소스 기능과 트랙잭션 처리 기능을 제공

마이바티스의 SqlSession에서 제공하는 주요 메서드

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(query_id, 조건) id에 대한 select문 실행하면서 사용되는 조건도 절달 / Map 타입으로 반환
int insert(query_id, Object obj) id에 대한 insert문 실행하면서 obj 객체의 값을 테이블에 추가
int update(query_id, Object obj) obj 객체의 값을 조건문의 수정 값으로 사용하여 update문 실행
int delete(query_id, Object obj) obj 객체의 값을 조건문의 조건 값으로 사용 delete문 실행

 

마이바티스를 이용한 회원정보 CRUD


회원 ID, 비밀번호 조회

 

 

매핑 경로 설정해서 실행하면 위와 같이 출력

 

sqlMapConfig.xml

 

<?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>
		<!-- DAO에서 SQL 문으로 값을 전달할 때 또는 SQL문을 실행한 후 가져온 값을 DAO로 전달할 때 사용할 빈을 생성 -->
		<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="oracle.jdbc.driver.OracleDriver"/>
				<property name="url" value="JDBC:oracle:thin:@localhost:1521:XE"/>
				<property name="username" value="scott"/>
				<property name="password" value="tiger"/>
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
		<!-- 회원 기능 관련 SQL문이 있는 member.xml을 읽어들인다. 반드시 지정한 패키지 이름과 일치해야함 -->
		<mapper resource="mybatis/mappers/member.xml"/>
	</mappers>
</configuration>

 

member.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"><!-- member.xml의 네임스페이스 지정 -->
	<!-- sql문 실행 후 반환되는 레코드들을 <typeAlias>에서 지정한 memberVO 빈에 저장 -->
	<resultMap type="memberVO" id="memResult">
		<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>
	
	<!-- DAO에서 id를 통해 해당 SQL문 호출 --><!-- 반환되는 레코드를 memResult에 저장 -->
<!-- 	
	<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 = 'hong'
		]]>
	</select>
	<select id="selectPwd" resultType="int">
		<![CDATA[
			select pwd from t_member
			where id = 'hong'
		]]>
	</select>
</mapper>

 

MemberDAO

 

public class MemberDAO {
	
	private static SqlSessionFactory sqlMapper = null;
	public static SqlSessionFactory getInstance() {
		if (sqlMapper == null) {
			try {
				//MemberDAO의 각 메서드 호출 시 sqlMapConfig.xml에서 설정 정보를 읽은 후 데이터베이스와 연동
				String resource = "mybatis/sqlMapConfig.xml";
				
				Reader reader = Resources.getResourceAsReader(resource);
				
				//마이바티스를 이용하는 sqlMapper 객체 가져옴
				sqlMapper = new SqlSessionFactoryBuilder().build(reader);
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sqlMapper;
	}
	
	public String selectName() {
		sqlMapper = getInstance();
		SqlSession sqlSession = sqlMapper.openSession();
		//selectOne()메서드로 인자로 지정한 sql문을 싱행한 후 한 개의 데이터(문자열)를 반환
		String name = sqlSession.selectOne("mapper.member.selectName");
		return name;
	}
	public String selectPwd() {
		sqlMapper = getInstance();
		SqlSession sqlSession = sqlMapper.openSession();
		//selectOne()메서드로 인자로 지정한 sql문을 싱행한 후 한 개의 데이터(정수)를 반환
		String pwd = sqlSession.selectOne("mapper.member.selectPwd");
		return pwd;
	}
}

 

MemberServlet

 

@WebServlet("/mem2.do")
public class MemberServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	@Override
	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();
		
		String name = dao.selectName();
		//int pwd = dao.selectPwd();
		
		PrintWriter writer = response.getWriter();
		writer.write("<script>");
		writer.write("alert(' 이름: "+name+"');");//조회한 이름 브라우저로 출력
		//writer.write("alert(' 비밀번호: "+pwd+"');");
		writer.write("</script>");

	}
}

 

HashMap을 이용한 모든 회원 정보 조회

 

 

member.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"><!-- member.xml의 네임스페이스 지정 -->

	<resultMap type="java.util.HashMap" id="memResult">
		<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>
	
	<!-- 조회한 정보 HashMap에 저장 -->
	<select id="selectAllMemberList" resultMap="memResult">
		<![CDATA[
			select * from t_member order by joinDate desc
		]]>
	</select> 

</mapper>

 

MemberDAO

 

public class MemberDAO {
	
	private static SqlSessionFactory sqlMapper = null;
	public static SqlSessionFactory getInstance() {
		if (sqlMapper == null) {
			try {
				//MemberDAO의 각 메서드 호출 시 sqlMapConfig.xml에서 설정 정보를 읽은 후 데이터베이스와 연동
				String resource = "mybatis/sqlMapConfig.xml";
				
				Reader reader = Resources.getResourceAsReader(resource);
				
				//마이바티스를 이용하는 sqlMapper 객체 가져옴
				sqlMapper = new SqlSessionFactoryBuilder().build(reader);
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sqlMapper;
	}
	
	public List<HashMap<String, String>> selectAllMemberList(){
		sqlMapper = getInstance();
		//실제 member.xml의 sql문을 호출하는데 사용되는 SqlSession 객체 가져옴
		SqlSession sqlSession = sqlMapper.openSession();
		
//		List<MemberVO> memList = null;
		List<HashMap<String, String>> memList = null;
		//실행하고자하는 sql문의 id를 인자로 전달
		memList = sqlSession.selectList("mapper.member.selectAllMemberList");
		return memList;
	}
}

 

MemberServlet

 

@WebServlet("/mem.do")
public class MemberServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	@Override
	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();
		List<HashMap<String, String>> membersList = dao.selectAllMemberList();
		request.setAttribute("membersList", membersList);
		
		RequestDispatcher dispatch = request.getRequestDispatcher("test01/listMembers.jsp");
		dispatch.forward(request, response);
	}
}

 

조건 값으로 회원 정보 조회

 

전체 : 리스트

아이디 검색 : 단일 정보 조회

비밀번호 검색 : 리스트

 

member.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"><!-- member.xml의 네임스페이스 지정 -->

	<resultMap type="java.util.HashMap" id="memResult">
		<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>
	
	<!-- 조회한 정보 HashMap에 저장 -->
	<select id="selectAllMemberList" resultMap="memResult">
		<![CDATA[
			select * from t_member order by joinDate desc
		]]>
	</select> 

	
	<select id="selectMemberById" resultType="memberVO" parameterType="String">
		<![CDATA[
			select * from t_member
			where id = #{id}
		]]>
	</select>
	<select id="selectMemberByPwd" resultType="memberVO" parameterType="String">
		<![CDATA[
			select * from t_member
			where pwd = #{pwd}
		]]>
	</select>
</mapper>

 

MemberServlet

 

@WebServlet("/mem3.do")
public class MemberServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}
	@Override
	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");
		MemberDAO dao = new MemberDAO();
		MemberVO memberVO = new MemberVO();
		
		String action = request.getParameter("action");
		String nextPage = "";
		
		if (action==null || action.equals("listMembers")) {
			List<MemberVO> membersList = dao.selectAllMemberList();
			request.setAttribute("membersList", membersList);
			nextPage = "test01/listMembers.jsp";
		}
		//검색 조건이 selectMemberById인 경우
		else if (action.equals("selectMemberById")) {
			String id = request.getParameter("value");
			memberVO = dao.selectMemberById(id);
			request.setAttribute("member", memberVO);
			nextPage = "test02/memberInfo.jsp";
		}
		//검색 조건이 selectMemberByPwd인 경우
		//비밀번호가 같은 회원은 여러명 있을 수 있기 때문에 List로 조회
		else if (action.equals("selectMemberByPwd")) {
			String pwd = request.getParameter("value");
			List<MemberVO> membersList = dao.selectMemberByPwd(pwd);
			request.setAttribute("membersList", membersList);
			nextPage = "test01/listMembers.jsp";
		}
		
		RequestDispatcher dispatch = request.getRequestDispatcher(nextPage);
		dispatch.forward(request, response);
	}
}

 

MemberDAO

 

public class MemberDAO {
	
	private static SqlSessionFactory sqlMapper = null;
	public static SqlSessionFactory getInstance() {
		if (sqlMapper == null) {
			try {
				//MemberDAO의 각 메서드 호출 시 sqlMapConfig.xml에서 설정 정보를 읽은 후 데이터베이스와 연동
				String resource = "mybatis/sqlMapConfig.xml";
				
				Reader reader = Resources.getResourceAsReader(resource);
				
				//마이바티스를 이용하는 sqlMapper 객체 가져옴
				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 sqlSession = sqlMapper.openSession();
		//서블릿에서 넘어온 id의 값을 selectOne()메서드 호출 시 조건 값으로 전달
		MemberVO memberVO = sqlSession.selectOne("mapper.member.selectMemberById", id);
		return memberVO;
	}
	
	//비밀번호가 같은 회원은 여러명 있을 수 있기 때문에 List로 조회
	public List<MemberVO> selectMemberByPwd(String pwd) {
		sqlMapper = getInstance();
		SqlSession sqlSession = sqlMapper.openSession();
		List<MemberVO> memlist = null;
		memlist = sqlSession.selectList("mapper.member.selectMemberByPwd",pwd);
		return memlist;
	}
}

 

memberInfo.jsp

 

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<%
	request.setCharacterEncoding("utf-8");
%>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
	<table border=1 align="center" width="100%" >
		<tr align="center"   bgcolor="lightgreen">
	      	<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>

 

search.jsp

 

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<%
	request.setCharacterEncoding("utf-8");
%>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>회원 검색 창</title>
</head>
<body>
	<form method="post" action="${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>

 

회원 정보 추가(VO 객체 사용, HashMap 사용)

 

 

member.xml

 

	<!-- memberVO를 사용한 추가 -->
	<insert id="insertMember" parameterType="memberVO">
		<![CDATA[
			insert into t_member(id, pwd,name,email)
			values(#{id}, #{pwd}, #{name}, #{email})			
		]]>
	</insert>
	
	<!-- HashMap을 사용한 추가 -->
	<insert id="insertMember2" parameterType="java.util.HashMap">
		<![CDATA[
			insert into t_member(id, pwd,name,email)
			values(#{id}, #{pwd}, #{name}, #{email})			
		]]>
	</insert>

 

MemberServlet

 

		//memberVO를 사용한 추가
		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";
		}
		
		//HashMap을 사용한 추가
		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";
		}

 

MemberDAO

 

	//memberVO를 사용한 추가
	public int insertMember(MemberVO memberVO) {
		sqlMapper = getInstance();
		SqlSession sqlSession = sqlMapper.openSession();
		int re = 0;
		re = sqlSession.insert("mapper.member.insertMember", memberVO);
		sqlSession.commit();
		return re;
	}
	
	//HashMap을 사용한 추가
	public int insertMember2(Map<String, String> memberMap) {
		sqlMapper = getInstance();
		SqlSession sqlSession = sqlMapper.openSession();
		int re = 0;
		re = sqlSession.insert("mapper.member.insertMember2", memberMap);
		sqlSession.commit();
		return re;
	}

 

회원정보 수정, 삭제

 

 

member.xml

 

	<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>

 

MemberServlet

 

		//회원정보 수정
		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";
		}

 

MemberDAO

 

	//회원정보 수정
	public int updateMember(MemberVO memberVO) {
		sqlMapper = getInstance();
		SqlSession sqlSession = sqlMapper.openSession();
		int re = sqlSession.update("mapper.member.updateMember", memberVO);
		sqlSession.commit();
		return re;
	}	
	//회원정보 삭제
	public int deleteMember(String id) {
		sqlMapper = getInstance();
		SqlSession sqlSession = sqlMapper.openSession();
		int re = sqlSession.update("mapper.member.deleteMember", id);
		sqlSession.commit();
		return re;
	}

 

modMember.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" 
    isELIgnored="false"  %>
<%@ 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>Insert title here</title>
</head>
<body>
	<form action="${contextPath}/mem4.do?action=updateMember" method="post">
		<h1 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 colspan="2" align="center">
					<input type="submit" value="수정하기">
					<input type="reset" value="다시입력">
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

 

listMembers.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" 
    isELIgnored="false"  %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<c:set var="contextPath"  value="${pageContext.request.contextPath}"  />

<%
  request.setCharacterEncoding("UTF-8");
%>    


<html>
<head>
<meta charset=UTF-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border="1"  align="center"  width="80%">
    <tr align="center"   bgcolor="lightgreen">
      <td ><b>아이디</b></td>
      <td><b>비밀번호</b></td>
      <td><b>이름</b></td>
      <td><b>이메일</b></td>
      <td><b>가입일</b></td>
      <td><b>삭제</b></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>
      <td><a href="${contextPath}/mem4.do?action=deleteMember&id=${member.id}">삭제</a></td>
      
    </tr>
  </c:forEach>   
</table>
<a  href="${contextPath}/member/memberForm.do"><h1 style="text-align:center">회원가입</h1></a>
</body>
</html>

 

마이바티스의 동적 SQL문 사용하기


예를들어 조건절만 다른 똑같은 select문이 3개가 있다고 할 때 이들을 일일이 만드는 것 보다는 마이바티스의 동적 SQL 기능을 사용하면 각 조건절에 대해 한 개의 SQL 문으로 구현할 수 있어서 더 편리하다.

 

동적 SQL문은 주로 where절을 동적으로 추가한다. 그리고 동적 SQL문에 사용되는 태그들은 JSTL에서 사용되는 코어 태그들과 유사하다.

 

동적 SQL문을 구성하는 요소들은 아래와 같다.

  • if
  • choose(when, otherwise)
  • trim(where, set)
  • foreach

 

<if> 태그로 동적 SQL문 만들기

<if>태그는 <where> 태그 안에서 사용된다. <where> 태그는 <if> 태그에 따라 조건식이 존재하면 공통 SQL문에 where절을 추가하며, 조건식이 없으면 추가하지 않는다.

 

 

둘 다 공백에서 검색 : 전체 데이터

이름 검색 : 이름에 해당하는 데이터

이메일 검색 : 이메일에 해당하는 데이터

둘 다 작성하고 검색 : 해당하는 데이터

 

member.xml

 

	<select id="searchMember" parameterType="memberVO" resultMap="memResult">
		<![CDATA[
			select * from t_member		
		]]>
		<!-- name과 email 속성 값을 체크해 해당 조건을 만족하면 조건을 위의 공통 SQL문 뒤에 추가함 -->
		<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>

 

MemberServlet

 

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

 

MemberDAO

 

	public List<MemberVO> searchMember(MemberVO memberVO){
		sqlMapper = getInstance();
		SqlSession sqlSession = sqlMapper.openSession();
		List<MemberVO> membersList = sqlSession.selectList("mapper.member.searchMember", memberVO);
		return membersList;
	}

 

searchMember.jsp

 

<%@ 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}"  />

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>회원 검색창</title>
</head>
<body>
	<h1>회원검색</h1>
	<form method="post" 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>

 

<choose>태그로 동적 SQL문 만들기

SQL문에서 자바의 switch와 같은 기능을 구현한다고 생각하면 됨. <otherwise>는 생략이 가능하다.

 

	<select id="searchMember" parameterType="memberVO" resultMap="memResult">
		<![CDATA[
			select * from t_member		
		]]>
		<!-- name과 email 속성 값을 체크해 해당 조건을 만족하면 조건을 위의 공통 SQL문 뒤에 추가함 -->
		<where>
			<choose>
				<when test="name != '' and name != null and email != '' and email != null">
					name = #{name} and email = #{email}
				</when>
				<when test="name != '' and name != null">
					name = #{name}
				</when>
				<when test="email != '' and email != null">
					email = #{email}
				</when>
			</choose>
		</where>
		order by joinDate desc
	</select>

 

결과는 <if>태그를 사용했을 경우와 똑같음

 

<foreach> 태그로 회원정보 조회

이 태그를 사용하면 SQL문에서 한 번에 여러 개의 데이터를 처리할 수 있음

 

collection 전달받은 인자값
index 반복될 때마다 1씩 증가시키면서 접근하는 값의 위치
item 반복문 실행될 때마다 collection 속성에 지정된 값에 접근하여 차례대로 사용
open 해당 구문이 시작될 때의 지정한 기호를 추가
close 해당 구문이 끝날 때의 지정한 기호를 추가
separator 한 번 이상 반복될 때 반복되는 사이에 지정한 기호를 추가

 

member.xml

	<!-- sql문에 List인스턴스나 배열을 전달하면 자동으로 Map에 전달되어 이름을 키로 사용(List : list / 배열 : array) -->
	<select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
		<![CDATA[
			select * from t_member		
		]]>
		where name in
		<foreach collection="list" item="item" open="(" separator="," close=")">
			#{item}
		</foreach>
		order by joinDate desc
	</select>



MemberServlet

		else if(action.equals("foreachSelect")) {
			//ArrayList에 검색할 이름을 저장한 후 sql문으로 ArrayList를 전달
			List<String> nameList = new ArrayList<String>();
			nameList.add("홍길동");
			nameList.add("이순신");
			nameList.add("김유신");
			List<MemberVO> membersList = dao.foreachSelect(nameList);
			
			request.setAttribute("membersList", membersList);
			nextPage = "test03/listMembers.jsp";
		}



MemberDAO

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

 

 

설정한 이름에 해당하는 리스트가 나오는 것을 확인할 수 있음

 

<foreach> 태그로 회원정보 추가하기

 

MySql과 달리 오라클에서는 insert문을 동시에 여러개 사용하면 오류가 발생한다.따라서 오라클에서는 <foreach> 태그의 open과 close 속성에 sql문을 설정한 후 서브 쿼리 형식으로 다중 insert문을 구현한다.

 

member.xml

	<insert id="foreachInsert" parameterType="java.util.Map">
										<!-- foreach로 반복할 때 처음에는 INSERT ALL를 작성 -->
		<foreach collection="list" item="item" open="INSERT ALL" separator=" " close="SELECT * FROM DUAL">
			into t_member(id, pwd, name, email)
			values(#{item.id},#{item.pwd},#{item.name},#{item.email})
		</foreach>
	</insert>



MemberServlet

		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 re = dao.foreachInsert(memList);
			nextPage = "/mem4.do?action=listMembers";
		}



MemberDAO

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

 

 

MemberServlet에서 입력한 정보가 추가된 것을 확인할 수 있음

 

<sql> 태그와 <include> 태그로 SQL문 중복 제거

 

마이바티스에서는 <sql> 태그를 제공하여 매퍼 파일에서 SQL문을 재사용할 수 있게 해준다.

 

	<!-- <sql>태그를 이용해 공통 SQL문의 refid를 a로 지정 -->
	<sql id="a">
		<![CDATA[
			select * from t_member
		]]>
	</sql>
	
	<select id="searchMember" parameterType="memberVO" resultMap="memResult">
		<include refid="a"/><!-- 공통 SQL문 재사용 -->
		<where>
			<choose>
				<when test="name != '' and name != null and email != '' and email != null">
					name = #{name} and email = #{email}
				</when>
				<when test="name != '' and name != null">
					name = #{name}
				</when>
				<when test="email != '' and email != null">
					email = #{email}
				</when>
			</choose>
		</where>
		order by joinDate desc
	</select>
	
	<select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
		<include refid="a"/>
		<foreach collection="list" item="item" open="(" separator="," close=")">
			#{item}
		</foreach>
		order by joinDate desc
	</select>

 

앞서 작성했던 것들을 위와같이 공통 SQL문을 재사용해서 작성하는 방법으로 쓸 수 있다.

 

 

*마이바티스에서 like를 사용할 때는

 

name like '%' || #{name} || '%'

 

위와 같은 형태로 작성해야 한다.

728x90

'자바 웹 > 스프링' 카테고리의 다른 글

다중 파일 업로드  (0) 2022.07.04
메이븐과 STS  (0) 2022.07.04
스프링 애너테이션 기능  (0) 2022.07.01
스프링 트랜잭션  (0) 2022.07.01
스프링 MVC 기능  (0) 2022.06.29