▣ LAB · DB

Mapper 인터페이스 ↔ XML

데이터와 MyBatis — 실습

📍 지금 어디를 만지고 있나요?
브라우저
데이터와 MyBatis
DB

사전 준비

이번 실습의 목표

XML 의 namespace = 인터페이스의 풀 클래스명. 각 메서드 = 같은 id 의 SQL.

1
BoardMapper 인터페이스 작성
// src/main/java/com/smhrd/mapper/BoardMapper.java
package com.smhrd.mapper;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.smhrd.domain.Board;

@Mapper
public interface BoardMapper {
    List<Board> selectList();
    Board     selectOne(int num);
    void      insert(Board b);
}
CHECKPOINT
  • 패키지가 com.smhrd.mapper 인가?
  • 임포트한 도메인이 com.smhrd.domain.Board 인가?
2
BoardMapper.xml 작성 (같은 경로)
<!-- src/main/resources/com/smhrd/mapper/BoardMapper.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="com.smhrd.mapper.BoardMapper">

    <select id="selectList" resultType="com.smhrd.domain.Board">
        SELECT num, title, writer, content
        FROM myboard ORDER BY num DESC
    </select>

    <select id="selectOne"
            parameterType="int"
            resultType="com.smhrd.domain.Board">
        SELECT num, title, writer, content
        FROM myboard WHERE num = #{num}
    </select>

    <insert id="insert" parameterType="com.smhrd.domain.Board">
        INSERT INTO myboard(title, writer, content)
        VALUES(#{title}, #{writer}, #{content})
    </insert>
</mapper>
CHECKPOINT
  • XML 의 namespace 가 인터페이스 풀 클래스명과 글자 그대로 같은가?
  • id 가 인터페이스 메서드명과 같은가? (selectList / selectOne / insert)
3
실행 + MyBatis SQL 로그 확인

Service 에서 boardMapper.selectList() 를 호출하고 콘솔에서 MyBatis SQL 로그를 확인합니다.

CHECKPOINT
  • 콘솔에 SELECT num, title, writer, content FROM myboard SQL 이 찍혔는가?
  • 「Invalid bound statement」 가 나오면 namespace 또는 id 의 오타다 — 다시 비교.

실습 완료 체크리스트

인터페이스 패키지 com.smhrd.mapper
XML namespace = com.smhrd.mapper.BoardMapper
id ↔ 메서드명 (selectList / selectOne / insert) 일치
SQL 로그에 myboard 쿼리 출력 확인