MyBatis sql xml

suah·2025년 4월 22일

조회, 수정, 삭제

<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문에 대해 조건값의 유무에 따라 동적으로 공통 SQL문에 조건절 추가

  • JSTL과 XML 기반으로 동적 SQL문 작성
  • 조건절(where)에 조건을 동적으로 추가

구성 요소

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

if 태그

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

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

foreach 태그

  • 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과 include 태그

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">
profile
IT developer

0개의 댓글