티스토리 뷰
MyBatis의 특징, 언제 사용해야 하는지
- JdbcTemplate보다 더 많은 기능을 제공하는 SQL Mapper
- SQL을 XML에 편리하게 작성할 수 있다. ( 자바 코드에서 사용하지 않아 혼동하지 않을 수 있음 )
- 동적 쿼리를 편안하게 작성할 수 있다.
// 자바에서 동적 쿼리
String sql = "select id, item_name, price, quantity from item";
//동적 쿼리
if (StringUtils.hasText(itemName) || maxPrice != null) {
sql += " where";
}
boolean andFlag = false;
if (StringUtils.hasText(itemName)) {
sql += " item_name like concat('%',:itemName,'%')";
andFlag = true;
}
if (maxPrice != null) {
if (andFlag) {
sql += " and";
}
sql += " price <= :maxPrice";
}
log.info("sql={}", sql);
return template.query(sql, param, itemRowMapper());
// XML에서 동적 쿼리
<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>
위와 같이 동적 쿼리를 보다 쉽게 작성할 수 있다.
진행하려는 프로젝트의 동적 쿼리가 많다면 MyBatis를, 단순하다면 JdbcTemplate를 적절하게 선택하자.
활용
@Mapper 애노테이션을 통해 MyBatis가 인식할 수 있다.
인터페이스 구현체의 메서드를 호출하면 xml 매핑 파일에서 sql을 실행하고 결과를 반환한다.
기본적으로는 매퍼 인터페이스와 xml 매핑 파일은 디렉토리의 위치를 잘 맞춰줘야 한다.
- 인터페이스 - java 하위 hello.itemservice.repository.mybatis
- xml 파일 - resources 하위 hello.itemservice.repository.mybatis
일단 sql을 작성하기 매우 편해졌다. 기존 자바 코드 사이에 존재하던 sql을 가볍게 사용할 수 있다.
findAll 같이 동적 쿼리의 경우, 더욱 간편하게 사용할 수 있는 것을 확인할 수 있을 것이다.
-> 기존 자바 코드에서 if문과 sql에 "and" 와 같은 내용을 추가하는 것과 다르게 조건문을 쉽게 사용한다.
MyBatis는 <where> 과 <if> 같은 쿼리 문법으로 동적 쿼리를 지원한다.
MyBatis 스프링 연동 모듈의 처리 원리
- 애플리케이션 로딩 시점에 MyBatis 스프링 연동 모듈은 @Mapper가 있는 인터페이스를 조회한다.
- 해당 인터페이스를 동적 프록시 기술로 구현체를 생성한다.
- 해당 구현체를 스프링 빈으로 등록한다.
매퍼 구현체를 통해 MyBatis 기술을 스프링에 편리하게 통합하여 사용할 수 있다.
구현 뿐 아니라, 예외 추상화나 데이터베이스 커넥션, 트랜잭션 기능도 함께 연동 및 동기화를 도와준다,.
MyBatis의 동적 SQL
if - 해당 조건에 따라 값을 추가할지 말지 판단한다.
choose, when, otherwise
- when과 otherwise 중 하나를 choose하는 문법, 자바의 switch와 비슷하다.
where
- 문장이 없으면(조건이 안맞으면) where을 추가하지 않는다.
- and가 먼저 시작된다면 and를 지우고 시작한다.
foreach
- 컬렉션을 반복 처리할 때 사용한다. 파라미터로는 List를 전달한다.
본 포스팅은 인프런 강의 김영한님의
[ 스프링 DB 2편 - 데이터 접근 활용 기술 ] 을 수강하며 작성한 내용입니다.