03_Spring_Mybatis_member_map(trim,collection,CDATA)

2022. 10. 9. 17:21코딩/FRAMEWORK

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="member">
  <select id="selectOneMember" parameterType="m" resultType="m">
  <!-- 위치홀더 자리에 키값을 넣으면 바로 가져온다. -->
  <!-- vo랑 변수명이 다른 개체들은 별칭으로 vo랑이름을 맞춰준다. -->
  <!-- resultType="m" : 돌려주는 타입 -->
  	select
  	 	member_no as memberNo, 
  	 	member_id as memberId, 
  	 	member_pw as memberPw, 
  	 	member_name as memberName,
  	 	phone,
  	 	email 
  	 from member_tbl 
  	 where member_id=#{memberId} 
  	 <if test="memberPw !=null">
  	 and member_pw=#{memberPw}
  	 </if>
  </select>
  <!-- resultType 에 리스트에 들어갈 객체를 넣는것 -->
  <select id="selectAllMember" resultType="m">
  	select
  	 	member_no as memberNo, 
  	 	member_id as memberId, 
  	 	member_pw as memberPw, 
  	 	member_name as memberName,
  	 	phone,
  	 	email 
  	 from member_tbl 
  </select>
  <!-- insert나 update같이 result 타입이 int라는 사실을 알고있기때문에 지정하지 않는다 -->
  <insert id="insertMember" parameterType="m">
  	insert into member_tbl values (member_seq.nextval,#{memberId},#{memberPw},#{memberName},#{phone},#{email})
  </insert>
  <select id="selectOneMemberId" parameterType="String" resultType="m">
  	select
  		member_no as memberNo,
  		member_id as memberId,
  		member_pw as memberPw,
  		member_name as memberName,
  		phone,
  		email
  		<!-- parameter : 단일값 하나가 넘어온 경우 사용 -->
  	from member_tbl where member_id=#{_parameter}
  </select>
  
  <update id="updateMember" parameterType="m">
  	update member_tbl set 
	  	member_pw = #{memberPw},
	  	phone = #{phone}, 
	  	email = #{email} 
  	where member_id=#{memberId}
  </update>
  
  <delete id="deleteMember" parameterType="int">
  	delete from member_tbl where member_no=#{_parameter}
  </delete>
  <select id="searchMemberName" parameterType="String" resultType="m">
  	select
  		member_no as memberNo,
  		member_id as memberId,
  		member_pw as memberPw,
  		member_name as memberName,
  		phone,
  		email
  	from member_tbl where member_name like '%'||#{_parameter}||'%'
  </select>
  <!-- list 안에 멤버타입이 들어갈거라 결과타입은 m 이다 -->
  <select id="searchMember1" parameterType="map" resultType="m">
  	select
  		member_no as memberNo,
  		member_id as memberId,
  		member_pw as memberPw,
  		member_name as memberName,
  		phone,
  		email
  	from member_tbl
  	<choose>
  		<when test="type.equals('id')">
  			where member_id = #{keyword}
  		</when>
  		<when test="type.equals('name')">
  			where member_name like '%'||#{keyword}||'%'
  		</when>
  	</choose>
  </select>
  <select id="searchMember2" parameterType="m" resultType="m">
  	select
  		member_no as memberNo,
  		member_id as memberId,
  		member_pw as memberPw,
  		member_name as memberName,
  		phone,
  		email
  	from member_tbl
  	<!-- trim안이 전부 false 면 작동을 안함 -->
  	<!-- trim prefix="where" : 트림안에 있는게 ture가 나와서 조건이 붙을때 앞에 where를 붙여줘서 조건을 맞춰줌 -->
  	<!-- prefixOverrides="and|or : trim 안에 있는것이 진행이 될때 구문이 and나 or로 시작시 그 구문을 지우고 작동하라는 의미 -->
  	<trim prefix="where" prefixOverrides="and|or">
  		<if test="!memberId.equals('')">
  			member_id like '%'||#{memberId}||'%'
  		</if>
  		<if test="!memberName.equals('')">
  			and member_name like '%'||#{memberName}||'%'
  		</if>
  	</trim>
  	<!-- 
  	<choose>
  		<when test="!memberId.equals('') and memberName.equals('')">
  			where member_id like '%'||#{memberId}||'%'
  		</when>
  		<when test="memberId.equals('') and !memberName.equals('')">
  			where member_name like '%'||#{memberName}||'%'
  		</when>
  		<when test="!memberId.equals('') and !memberName.equals('')">
  			where member_id like '%'||#{memberId}||'%'
  			and member_name like '%'||#{memberName}||'%'
  		</when>
  	</choose>
  	 -->
  </select>
  <select id="idList" resultType="string">
  	select
  		member_id
  	from member_tbl
  </select>
  <select id="searchMember3" resultType="m" parameterType="map">
	  select
	  		member_no as memberNo,
	  		member_id as memberId,
	  		member_pw as memberPw,
	  		member_name as memberName,
	  		phone,
	  		email
	  	from member_tbl
	  where member_id in
	  <!-- collection : 반복할 객체 -->
	  <foreach collection="array" item="memberId" open="(" close=")" separator=",">
	  	#{memberId}
	  </foreach>
  </select>
  <select id="searchMember4" resultType="m">
  	select
 		member_no as memberNo,
 		member_id as memberId,
 		member_pw as memberPw,
 		member_name as memberName,
 		phone,
 		email
	 from member_tbl
	 <!-- 부등호는 <![CDATA[ < ]]> 라는식으로 CDATA를 사용해주어야한다.
	 이때 부등호만 감싸줘도되고 쿼리문 전체를 감싸줘도 된다.
	 단 쿼리문 전체를 감쌀씨 동적쿼리를 사용할수가 없다 -->
	 where member_no <![CDATA[ < ]]> 60
  </select>
</mapper>

 

 

<select id="searchMember1" parameterType="map" resultType="m">
  	select
  		member_no as memberNo,
  		member_id as memberId,
  		member_pw as memberPw,
  		member_name as memberName,
  		phone,
  		email
  	from member_tbl
  	<choose>
  		<when test="type.equals('id')">
  			where member_id = #{keyword}
  		</when>
  		<when test="type.equals('name')">
  			where member_name like '%'||#{keyword}||'%'
  		</when>
  	</choose>
  </select>

index에서 option을 걸고 map 에서 when을 이용해 다른 쿼리문 사용이 가능

 

trim

<select id="searchMember2" parameterType="m" resultType="m">
  	select
  		member_no as memberNo,
  		member_id as memberId,
  		member_pw as memberPw,
  		member_name as memberName,
  		phone,
  		email
  	from member_tbl
  	<!-- trim안이 전부 false 면 작동을 안함 -->
  	<!-- trim prefix="where" : 트림안에 있는게 ture가 나와서 조건이 붙을때 앞에 where를 붙여줘서 조건을 맞춰줌 -->
  	<!-- prefixOverrides="and|or : trim 안에 있는것이 진행이 될때 구문이 and나 or로 시작시 그 구문을 지우고 작동하라는 의미 -->
  	<trim prefix="where" prefixOverrides="and|or">
  		<if test="!memberId.equals('')">
  			member_id like '%'||#{memberId}||'%'
  		</if>
  		<if test="!memberName.equals('')">
  			and member_name like '%'||#{memberName}||'%'
  		</if>
  	</trim>
    </select>

if조건문을 사용하면 조건에 맞는 모든 모든 쿼리문을 실행한다.

이점을 이용해서

검색한 단어가 id에 있는경우의 정보만 구해오는것,

검색한 단어가 name에 있는 경우의 정보만 구해오는것,

둘다 있는 경우의 정보를 구해오는것을 구현할 것이다.

 

trim prefix를 사용하면 쿼리문에 지정한 특정 단어를 붙여줄수가 있다.

prefixOverrides 를 사용하면 쿼리문이 특정 단어로 시작할시 그 특정단어를 제외하고 실행할 수 있다.

 

위의 쿼리문에서

memberId 만 일치할시 where이 붙어서 아이디 검색하는 쿼리문만 작동을 할 것이며

memberName 만 일치할시 and를 제외하고 where이 붙어 이름 검색하는 쿼리문만 작동을 할것이며

 

둘다 일치할시 1번 if문 내의 쿼리문에 where이 붙고 2번 if문의 쿼리문으로 시작 하지않아 and를 지우지 않기 때문에 

where member_id like '%'||#{memberId}||'%' and member_name like '%'||#{memberName}||'%'

이런식으로 두개의 쿼리문을 합쳐서 사용할 것이다.

 

 

idList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
     <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>아이디목록</h1>
	<hr>
	<table border="1">
		<tr>
			<th>아이디</th>
		</tr>
		<form action="/searchMember3.do" method="post">
		<c:forEach items="${list }" var="memberId">
			<tr>
				<td>${memberId }</td>
			</tr>
			<input type="checkbox" name="memberId" value="${memberId }">
			${memberId }
		</c:forEach>
		<br>
		<input type="submit" value="조회">
		</form>
		<a href="/">메인페이지로</a>
	</table>
</body>
</html>

idList는 index에서 회원 아이디 전체 조회를해서 오는 jsp 이다

여기서  조회된 아이디에 체크박스를 부여하고

체크박스 값 에는 value="${memberId } 식으로 그 memberId가 부여되있다.

 

이제 정보를 조회하고 싶은 id만 체크하고 전송버튼을 눌러서 선택한 데이터만 

전송이가능하다.

이때 전송되는 데이터는 여러개 이기 때문에 

 

Controller 에서 

@RequestMapping(value = "/searchMember3.do")
	public String searchMember3(String[] memberId, Model model) {
		ArrayList<Member> list = service.searchMember3(memberId);
		model.addAttribute("list", list);
		return "member/memberList";
	}

memberId를 배열의 형태로 받고

Service,DAO 에서도 배열의 형태로 받는다

 

map

foreach

<select id="searchMember3" resultType="m" parameterType="map">
	  select
	  		member_no as memberNo,
	  		member_id as memberId,
	  		member_pw as memberPw,
	  		member_name as memberName,
	  		phone,
	  		email
	  	from member_tbl
	  where member_id in
	  <!-- collection : 반복할 객체 -->
	  <foreach collection="array" item="memberId" open="(" close=")" separator=",">
	  	#{memberId}
	  </foreach>
  </select>

배열의 형태로 여러개의 값을 받아서 foreach로 값을 꺼낸다

 

<c:forEach items="${list}" var="m"}

map의collection 이 jsp의 item

map의 item 이 jsp의 var 의 역활이라 생각하면된다.

<foreach collection="array" item="memberId" open="(" close=")" separator=",">

for문을 시작할때 ( 를 열고 끝나면 )로 닫고 memberId 사이사이 ,를 넣는 다라는 의미이다

만약 내가 user01,user03,user04,user07 의 값을 받아 왔다면

member_id in ('user01','user03','user04','user07') ; 식이 되는 것이다.

 

 

CDATA

<select id="searchMember4" resultType="m">
  	select
 		member_no as memberNo,
 		member_id as memberId,
 		member_pw as memberPw,
 		member_name as memberName,
 		phone,
 		email
	 from member_tbl
	 <!-- 부등호는 <![CDATA[ < ]]> 라는식으로 CDATA를 사용해주어야한다.
	 이때 부등호만 감싸줘도되고 쿼리문 전체를 감싸줘도 된다.
	 단 쿼리문 전체를 감쌀씨 동적쿼리를 사용할수가 없다 -->
	 where member_no <![CDATA[ < ]]> 60
  </select>

 

동적쿼리를 쓸려면 항상 태그를 열어주어야하는데

CDATA 를 사용하지 않으면 태그를 열어주는것으로 인식을 하기 때문에

map에서 쿼리문 에서 부등호 사용시 CDATA를 사용해 주어야 한다

 

번호가 60 보다 아래인 데이터를 출력할려면

where member_no <![CDATA[ < ]]> 60

식으로 사용해야한다.

이때 부등호를 감싸는 것이 아닌

<select id="searchMember4" resultType="m">
  	<![CDATA[
    select
 		member_no as memberNo,
 		member_id as memberId,
 		member_pw as memberPw,
 		member_name as memberName,
 		phone,
 		email
	 from member_tbl
	 where member_no < 60
     ]]>
  </select>

 쿼리문 전체를 감싸는 식으로도 사용이 가능하다

단 이때 

전체를 감쌀시 쿼리문 작성시 태그를 못쓰게 되므로 if같은 동적쿼리를 사용할 수 없게 된다.

'코딩 > FRAMEWORK' 카테고리의 다른 글

03_Spring_Mybatis(ajax)  (0) 2022.10.11
04_Spring_AOP  (0) 2022.10.11
Mybatis  (0) 2022.10.06
Spring[CRUD] 라이브러리 세팅  (0) 2022.09.30
SPRING [CRUD]  (0) 2022.09.29