MyBatis 매퍼 XML(동적 SQL·foreach·resultMap)과 HTML 문서 기본형 모음입니다. 매퍼는 태그 구조와 SQL 본문을 함께 볼 수 있게 정리했습니다.
웹 앱에서는 빈칸을 채워 완성된 코드를 바로 복사할 수 있습니다.
매퍼 XML 뼈대
DB 접근 · MyBatis 3
<?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="com.example.app.mapper.UserMapper">
<select id="findById" parameterType="long" resultType="User">
SELECT id, name, email
FROM users
WHERE id = #{id}
</select>
</mapper>
💡 namespace는 매퍼 인터페이스의 전체 이름(FQCN)과 정확히 일치해야 메서드와 연결된다. resultType의 짧은 별칭은 mybatis-config의 typeAliases 등록 기준 — 등록 안 했으면 FQCN으로.
#{} vs ${} — 바인딩과 치환
DB 접근 · MyBatis 3
<select id="search" resultType="User">
SELECT id, name, email
FROM users
WHERE name LIKE CONCAT('%', #{keyword}, '%')
ORDER BY ${sortColumn} ${sortDir} <!-- 화이트리스트 검증을 거친 값만 -->
</select>
💡 #{}는 PreparedStatement 바인딩(안전), ${}는 문자열 그대로 치환 = SQL 인젝션 통로. 열 이름·정렬 방향처럼 바인딩이 불가능한 자리에만, 반드시 서버에서 허용 목록으로 거른 값을 넣는다.
동적 검색 — where + if
DB 접근 · MyBatis 3
<select id="searchOrders" resultType="Order">
SELECT id, status, amount, created_at
FROM orders
<where>
<if test="status != null and status != ''">
AND status = #{status}
</if>
<if test="fromDate != null">
AND created_at >= #{fromDate}
</if>
</where>
ORDER BY id DESC
</select>
💡 <where>는 안에 내용이 있을 때만 WHERE를 붙이고 맨 앞 AND/OR를 지워 준다. XML이라 부등호는 >·<로 쓰거나 <![CDATA[ ]]>로 감싼다. test는 OGNL 표현식.
IN절 — foreach
DB 접근 · MyBatis 3
<select id="findByIds" resultType="User">
SELECT id, name
FROM users
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
💡 파라미터가 이름 없는 List면 collection="list", 배열이면 "array", @Param("ids")를 붙였으면 그 이름. 빈 리스트면 IN ()이 되어 문법 오류 — 호출 전에 비었는지 확인하는 게 안전하다.