- 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} || '%'
위와 같은 형태로 작성해야 한다.
'자바 웹 > 스프링' 카테고리의 다른 글
다중 파일 업로드 (0) | 2022.07.04 |
---|---|
메이븐과 STS (0) | 2022.07.04 |
스프링 애너테이션 기능 (0) | 2022.07.01 |
스프링 트랜잭션 (0) | 2022.07.01 |
스프링 MVC 기능 (0) | 2022.06.29 |