<select id="selectMemberById" resultType="memResult" parameterType="String">
<![CDATA[
select * from t_member
where
id=#{id}
]]>
</select>
<update id="updateMember" parameterType="com.spring.ex01.MemberVO">
<![CDATA[
update t_member
set pwd=#{pwd}, name=#{name}, email=#{email}
where
id=#{id}
]]>
</update>
<delete id="deleteMember" parameterType="String">
<![CDATE[
delete from t_member
where
id=#{id}
]]>
</delete>
공통 SQL문에 대해 조건값의 유무에 따라 동적으로 공통 SQL문에 조건절 추가
구성 요소
- if
- choose(when, otherwise)
- trim(where, set)
- foreach
where 태그 안에서 사용된다.
<where> <if test='조건식'> 추가할 구문 </if> </where>
<select id="searchMember" parameterType="com.spring.ex01.MemberVO" resultMap="memResult">
<![CDATA[
select * from t_member
]]>
<where>
<if test="name != '' and name != null">
name=#{name}
</if>
<if test="email != '' and email != null">
email=#{email}
</if>
</where>
order by joinDate desc
</select>
<choose> <when test="조건식1"> 구문1 </when> <when test="조건식2"> 구문2 </when> ... <otherwise> 구문n </otherwise> </choose>
<select id="searchMember" parameterType="com.spring.ex01.MemberVO" resultMap="memResult">
<![CDATA[
select * from t_member
]]>
<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>
</select>
- collection: 전달받은 인자값. 배열(array)과 List 계열 인스턴스(list)
- index: 반복될 때마다 1씩 증가. 최초 값은 0
- item: collection 속성에 지정된 값에 접근하여 차례대로 사용
- open: 반복이 시작될 때의 지정한 기호 추가
- close: 반복이 끝난 후 지정한 기호 추가
- separator: 한 번 이상 반복될 때 반복되는 사이에 지정한 기호 추가
<foreach item="item" collection="list" index="index" open=" (" close=")" separator=","> #{item} </foreach>
<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>
Map<String, Object> nameMap = new HashMap<>();
List<String> nameList = new ArrayList<String>();
nameList.add("홍길동");
nameList.add("이순신");
nameList.add("abc");
nameMap.put("list", nameList);
List<MemberVO> membersList = memberMapper.foreachSelect(nameMap);
MySQL
<insert id="foreachInsert" parameterType="java.util.Map">
INSERT INTO t_member(id, pwd, name, email)
VALUES
<foreach item="item" collection="list">
(#{item.id}, #{item.pwd}, #{item.name}, #{item.email})
</foreach>
</insert>
Oracle
MySQL과 달리 Oracle에서는 INSERT문 반복해서 사용하면 오류 발생
따라서 반복 작업할 때는 처음에 INSERT ALL 추가
<insert id="foreachInsert" parameterType="java.util.Map">
<foreach item="item" collection="list" 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>
SQL문 중복 제거하기
<sql id="a">
<![CDATA[
select * from t_member
]]>
</sql>
<select id="searchMember" parameterType="com.spring.ex01.MemberVO" resultMap="memResult">
<include refid="a" />
<where>
<choose>
<when test="name != '' and name != null">