MyBatis는 SQL을 XML에 편리하게 작성할 수 있고 동적 쿼리를 편리하게 작성할 수 있는 SQL Mapper 기술로 공식 사이트에 사용법이 잘 나와있다.
https://mybatis.org/spring/ko/index.html
mybatis-spring –
소개 MyBatis-Spring 은 무엇일까? 마이바티스 스프링 연동모듈은 마이바티스와 스프링을 편하고 간단하게 연동한다. 이 모듈은 마이바티스로 하여금 스프링 트랜잭션에 쉽게 연동되도록 처리한다.
mybatis.org
MyBatis – 마이바티스 3 | 소개
마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와
mybatis.org
build.gradle 설정
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
application.properties
#MyBatis
# 타입 정보를 사용할 때 패키지 경로 생략 가능, 지정한 패키지와 그 하위 패키지가 자동으로 인식
mybatis.type-aliases-package=hello.itemservice.domain
# 언더바 -> 카멜 자동 변경
mybatis.configuration.map-underscore-to-camel-case=true
# MyBatis 실행 쿼리 로그 확인
logging.level.hello.itemservice.repository.mybatis=trace
# resources/mapper 를 포함한 하위 폴터 XML을 XML 매핑 파일로 인식
mybatis.mapper-locations=classpath:mapper/**/*.xml
@Mapper
스프링 부트가 애플리케이션 로딩 시점에 @Mapper가 붙은 인터페이스를 동적 프록시로 구현체를 생성하고 스프링 빈으로 등록하기 때문에 인터페이스 만으로 XML의 데이터를 찾아서 호출할 수 있고 매퍼 구현체는 MyBatis에서 발생한 예외를 스프링 예외 추상화인 DataAccessException으로 변환해준다.
@Mapper
public interface ItemMapper {
void save(Item item);
// 파라미터가 2개 이상이면 @Param("name")으로 매핑
void update(@Param("id") Long id, @Param("updateParam") ItemUpdateDto
updateParam);
Optional<Item> findById(Long id);
List<Item> findAll(ItemSearchCond itemSearch);
}
XML
XML 파일 경로는 resources 하위에 mapper 와 같은 패키지 위치로 맞추어 생성한다.
<insert id="save" useGeneratedKeys="true" keyProperty="id">
insert into item (item_name, price, quantity)
values (#{itemName}, #{price}, #{quantity})
</insert>
- id는 인터페이스에 설정한 메서드 명이랑 맞추고 파라미터는 #{} 문법을 사용하면 된다.
- 파라미터가 2개 이상일 경우는 Mapper 인터페이스에 @Param으로 이름을 지정해서 파라미터를 구분해야 한다.
- resultType은 반환 타입으로 결과를 해당 타입의 객체에 매핑해준다.
- 반환 객체가 여러개면 컬렉션을 사용하면 되는데 주로 List를 사용한다.
<select id="findAll" resultType="Item">
select id, item_name, price, quantity
from item
<where>
<if test="itemName != null and itemName != ''">
and item_name like concat('%',#{itemName},'%')
</if>
<if test="maxPrice != null">
and price <= #{maxPrice}
</if>
</where>
</select>
- 동적 쿼리 문법인 <where>은 내부 동적 쿼리가 생성이 되면 맨 앞에 and를 where로 변환하고 생성이 되지 않을 경우는 where를 만들지 않는다.
- XML에는 HTML 엔티티를 사용할 수 없는데 CDATA 문법을 사용하면 태그를 단순 문자로 인식하도록 하지만 <if>, <where>같은 동적 쿼리 문법도 적용되지 않기 때문에 잘 써야 한다. (<![CDATA[ ... ]]>)
동적 SQL
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
문자열 치환
#{} 문법은 ?를 넣고 파라미터를 바인딩하는 PreparedStatement 를 사용하는데 파라미터 바인딩이 아닌 문자 그대로를 처리하는 경우 ${} 를 사용하면 되는데 SQL Injection 공격을 당할 수 있기 때문에 사용하지 않는 것이 좋다.
SQL Fragment
<sql>는 fragment 기능으로 사용할 수 있는데 <include>를 통해 반복 코드를 편리하게 불러올 수 있다.
resultMap, 별칭(alias)
컬럼명과 객체의 프로퍼티 명이 다를 경우 별칭 "as"를 사용하거나 resultMap으로 선언해서 사용하면 된다.
* 문법은 필요할 때 찾아서 직접 사용해보는 것이 좋다.
[참고] 인프런 김영한님 강의를 공부한 내용입니다.
'데이터베이스' 카테고리의 다른 글
[Real MySQL] MySQL 아키텍처 (0) | 2022.12.02 |
---|---|
[MyBatis] 마이바티스 스프링 연동 모듈 (0) | 2022.07.13 |
[DB 접근 기술1] 스프링 데이터베이스 예외 추상화 (0) | 2022.06.19 |
[DB 접근 기술1] 스프링 트랜잭션 (0) | 2022.06.19 |
[DB 접근 기술1] 트랜젝션(Transaction) 기초 (0) | 2022.06.19 |