SQL Mapper XML

2025. 3. 10. 15:32·백엔드의 이해

인터페이스 기반 DAO

DAO(Data Access Object)는 데이터베이스에 대한 CRUD(Create, Read, Update, Delete) 연산을 캡슐화
이를 통해 애플리케이션 로직과 데이터베이스 접근 로직이 분리되어,
각각의 관심사가 명확히 분리되고 코드의 유지 관리가 편해진다.
MyBatis에서는 DAO를 인터페이스로 정의하고 이를 구현하여 사용하는 방식을 지원

 

XML 매퍼를 사용한 DAO

MyBatis는 SQL 쿼리와 결과 매핑을 XML 파일에 작성하여 관리할 수 있는 XML 매퍼를 지원
XML 매퍼는 SQL 쿼리와 그 결과를 객체와의 매핑 정보를 별도의 XML 파일에 작성하므로
코드와 SQL 쿼리를 분리하여 관리할 수 있다.

 

=> 예전에는 하나의 패키지로 전부 사용했으나

      현재는 git 활용등 업무의 브랜치 분활 및 에러를 줄이기 위해 패키지를 나누어 사용

SQL 쿼리의 분리: SQL 쿼리를 별도의 XML 파일에 작성하면,
코드에서 SQL 쿼리를 분리하여 관리할 수 있습니다. 이는 SQL 쿼리의 수정과 관리 용이

 

 

@Mapper

spring container를 통해 mybastic와 연동할 interface로 인식해서 구현체를 생성한다.
@Mapper
public interface BookDao {
	public List<Book> searchAll(PageBean bean) throws SQLException;
	public int totalCount(PageBean bean) throws SQLException;
	public Book search(String isbn)	throws SQLException;
	public void remove(String isbn)	throws SQLException;
	public void update(Book book)	throws SQLException;
	public void insert(Book book)	throws SQLException;
}

 

xml 파일과 DTO, VO 를 통해 데이터베이스와 서비스 계층에 접근할 수 있다.

출처: https://velog.io/@sorzzzzy/CSBlog-MyBatis-Mapper%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0

 

 

spring.application

 dao 연결할 수 있도록 MyBatis Setting 작성

 

application.properties 파일 마지막 줄에 MyBatis 의 설정 파일의 위치를 명시

#MyBatis Setting
mybatis.type-aliases-package=com.uplus.eureka.*.model.dto
mybatis.mapper-locations=mapper/*.xml

=> 바로 xml 을 작성할 경우 에러가 발생할 수 있어 폴더를 만들어서 작성

 

xml

 namespace는 패키지 포함한 mapper(DAO interface) 이름으로 설정 한다.

<mapper namespace="com.uplus.eureka.book.model.dao.BookDao">

 

Mapper 인터페이스(=Repository) 내의 메소드의 이름과 id  일치

출처: https://velog.io/@sorzzzzy/CSBlog-MyBatis-Mapper%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0


칼럼명, 속성명, 데이터 가 같아야한다

다를경우 alias를 이용하여 같게 해주어야 한다.

=> 서로 다를 경우 에러 발생!!!!

 

id : mapping될 함수 이름으로 설정
parameterType : 메서드 인자 타입
resultType : 쿼리를 수행한 결과(컬럼 데이타)를 담을 클래스 타입
=>return 타입
미리 등록된 Alias: mybatis-xxx.jar > org.apache.ibatis.type.TypeAliasRegistry 에서 확인 

 

=> 만약 네임스페이스나 아이디 입력을 다르게 하면 에러가 발생한다.

select

<select id  = "search"   parameterType ="string" resultType="Book">
	select isbn, title,author,price,describ ,img
	from book 
	where isbn = #{isbn}
</select>

 

resultType은 select 문을 수행한 결과 중 1개 row를 매핑할 타입을 설정한다.
myBatis가 List 객체를 생성해서 매핑한 객체를 add 해준다.
<select id="searchAll" parameterType="PageBean"  resultType="Book">
	select * from book
	<!-- where 태그는 조건이 있으면 where가 추가되고 없으면 where 절이 추가 되지 않는다-->
	<where>
		<include refid="searchCon"/>
	</where>
	order by isbn
	limit #{start}, #{interval}
</select>

<select id="totalCount" parameterType="PageBean" resultType="int">
	select count(*)from book
	<where>
		<include refid="searchCon"/>
	</where>
</select>

 

자주 사용하는 쿼리를 상용구 처럼 sql 태그를 이용해서 등록해서 재사용

=> ${테이블명, 컬럼명, 쿼리 주입} 지양

<sql id="searchCon">
    <!-- 구별되게만 작성 -->
    <if test="key != 'all' and word != null and word != ''">
        <choose>
            <when test="key == 'isbn'">
                isbn LIKE CONCAT('%', #{word}, '%')
            </when>
            <when test="key == 'title'">
                title LIKE CONCAT('%', #{word}, '%')
            </when>
            <when test="key == 'author'">
                author LIKE CONCAT('%', #{word}, '%')
            </when>
        </choose>
    </if>
</sql>

insert

<insert id="insert" parameterType="Book">
    INSERT INTO book (isbn, title, author, price, describ, img)
    VALUES (#{isbn}, #{title}, #{author}, #{price}, #{describ}, #{img})
</insert>

update

<update id="update" parameterType="Book">
    UPDATE book 
    SET 
        title = #{title}, 
        author = #{author}, 
        price = #{price}, 
        describ = #{describ}, 
        img = #{img}
    WHERE isbn = #{isbn}
</update>

delete

<delete id="remove" parameterType="String">
    DELETE FROM book
    WHERE isbn = #{isbn}
</delete>

'백엔드의 이해' 카테고리의 다른 글

JWT 기반 인증 흐름 구현: 로그인, 로그아웃 및 토큰 관리  (0) 2025.04.29
JWT 인증 방식  (0) 2025.04.28
Node.js 에 대하여 이해하기  (0) 2025.03.31
'백엔드의 이해' 카테고리의 다른 글
  • JWT 기반 인증 흐름 구현: 로그인, 로그아웃 및 토큰 관리
  • JWT 인증 방식
  • Node.js 에 대하여 이해하기
startfront
startfront
startfront 님의 블로그 입니다.
  • startfront
    startfront 님의 블로그
    startfront
  • 전체
    오늘
    어제
    • 분류 전체보기 (42) N
      • 프로젝트 (5) N
        • 프로젝트 해보기 (1) N
        • 디자인 알아보기 (2)
        • 프로젝트의 기본 (2)
      • 백엔드의 이해 (4)
      • React (14)
      • 프론트엔드 기본 (2)
        • Html (1)
        • Css (0)
        • JavaScript (1)
      • Cs기본지식 (14)
        • 알고리즘 (8)
        • 데이터베이스 (6)
      • Java (3)
        • Java의 이해 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
startfront
SQL Mapper XML
상단으로

티스토리툴바