You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
MyBatis 는 JdbcTemplate 보다 더 많은 기능을 제공하는 SQL Mapper 이다.
기본적으로 JdbcTemplate 이 제공하는 대부분의 기능을 제공한다.
JdbcTemplate 과 비교해서 MyBatis 의 가장 매력적인 점은 SQL 을 XML 에 편리하게 작성할 수 있고 동적 쿼리를 매우 편리하게 작성할 수 있다는 점이다.
자바 객체에는 주로 카멜(camelCase) 표기법을 사용한다. itemName 처럼 중간에 낙타 봉이 올라와 있는 표기법이다.
반면에 관계형 데이터베이스에서는 주로 언더스코어를 사용하는 snake_case 표기법을 사용한다. item_name 처럼 중간에 언더스코어를 사용하는 표기법이다.
이렇게 관례로 많이 사용하다 보니 map-underscore-to-camel-case 기능을 활성화 하면 언더스코어 표기법을 카멜로 자동 변환해준다. 따라서 DB에서 select item_name 으로 조회해도 객체의 itemName (setItemName()) 속성에 값이 정상 입력된다.
정리하면 해당 옵션을 켜면 snake_case 은 자동으로 해결되니 그냥 두면 되고, 컬럼 이름과 객체 이름이 완전히 다른 경우에는 조회 SQL 에서 별칭을 사용하면 된다.
예)
DB select item_name
객체 name
별칭을 통한 해결 방안 select item_name as name
3️⃣ MyBatis 적용1 - 기본
본격적으로 MyBatis 를 사용해서 데이터베이스에 데이터를 저장해보자.
XML 에 작성한다는 점을 제외하고는 JDBC 반복을 줄여준다는 점에서 기존 JdbcTemplate 과 거의 유사하다.
id 에는 매퍼 인터페이스에 설정한 메서드 이름을 지정하면 된다. 여기서는 메서드 이름이 save() 이므로 save 라고 지정하면 된다.
파라미터는 #{} 문법을 사용하면 된다. 그리고 매퍼에서 넘긴 객체의 프로퍼티 이름을 적어주면 된다.
#{} 문법을 사용하면 PreparedStatement 를 사용한다. JDBC 의 ? 를 치환한다고 생각하면 된다.
useGeneratedKeys 는 데이터베이스가 키를 생성해주는 IDENTITY 전략일 때 사용한다. keyProperty 는 생성되는 키의 속성 이름을 지정한다. insert 가 끝나면 item 객체의 id 속성에 생성된 값이 입력된다.
update - update
<updateid="update">
update item
set item_name=#{updateParam.itemName},
price=#{updateParam.price},
quantity=#{updateParam.quantity}
where id = #{id}
</update>
Update SQL 은 <update> 를 사용하면 된다.
여기서는 파라미터가 Long id, ItemUpdateDto updateParam 으로 2개이다. 파라미터가 1개만 있으면 @Param 을 지정하지 않아도 되지만, 파라미터가 2개 이상이면 @Param 으로 이름을 지정해서 파라미터를 구분해야 한다.
select - findById
<selectid="findById"resultType="Item">
select id, item_name, price, quantity
from item
where id = #{id}
</select>
Select SQL 은 <select> 를 사용하면 된다.
resultType 은 반환 타입을 명시하면 된다. 여기서는 결과를 Item 객체에 매핑한다.
앞서 application.properties 에 mybatis.type-aliases-package=hello.itemservice.domain 속성을 지정한 덕분에 모든 패키지 명을 다 적지는 않아도 된다.
JdbcTemplate 의 BeanPropertyRowMapper 처럼 SELECT SQL 의 결과를 편리하게 객체로 바로 변환해준다.
mybatis.configuration.map-underscore-to-camel-case=true 속성을 지정한 덕분에 언더스코어를 카멜 표기법으로 자동으로 처리해준다. (item_name -> itemName)
자바 코드에서 반환 객체가 하나이면 Item, Optional<Item> 과 같이 사용하면 되고, 반환 객체가 한 이상이면 컬렉션을 사용하면 된다. 주로 List 를 사용한다.
select - findAll
<selectid="findAll"resultType="Item">
select id, item_name, price, quantity
from item
<where>
<iftest="itemName != null and itemName != ''">
and item_name like concat('%',#{itemName},'%')
</if>
<iftest="maxPrice != null">
and price <= #{maxPrice}
</if>
</where>
</select>
</mapper>
Mybatis 는 <where> , <if> 같은 동적 쿼리 문법을 통해 편리한 동적 쿼리를 지원하다.
<if> 는 해당 조건이 만족하면 구문을 추가한다.
<where> 은 적절하게 where 문장을 만들어준다.
예제에서 <if> 가 모두 실패하게 되면 SQL where 을 만들지 않는다.
예제에서 <if> 가 하나라도 성공하면 처음 나타나는 and 를 where 로 변환해준다.
XML 특수문자
and price <= #{maxPrice}
여기를 확인하면 <= 를 사용하지 않고 <= 를 사용한 것을 확인할 수 있다. 그 이유는 XML 에서는 데이터 영역에 < , > 같은 특수 문자를 사용할 수 없기 때문이다 이유는 XML 에서 TAG 가 시작하거나 종료할 때 < , > 같은 특수문자를 사용하기 때문이다.
< : <
> : >
& : &
다른 해결 방안으로는 XML 에서 지원하는 CDATA 구문을 사용하는 것이다. 이 구문 안에서는 특수문자를 사용할 수 있다. 대신 이 구문 안에서는 XML TAG 가 단순 문자로 인식되기 때문에 <if> , <where> 등이 적용되지 않는다.
XML CDATA 사용
<selectid="findAll"resultType="Item">
select id, item_name, price, quantity
from item
<where>
<iftest="itemName != null and itemName != ''">
and item_name like concat('%',#{itemName},'%')
</if>
<iftest="maxPrice != null">
<![CDATA[ and price <= #{maxPrice}]]>
</if>
</where>
</select>
특수문자와 CDATA 각각 상황에 따른 장단점이 있으므로 원하는 방법을 그때그때 선택하면 된다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
1️⃣ MyBatis 소개
MyBatis 는 JdbcTemplate 보다 더 많은 기능을 제공하는 SQL Mapper 이다.
기본적으로 JdbcTemplate 이 제공하는 대부분의 기능을 제공한다.
JdbcTemplate 과 비교해서 MyBatis 의 가장 매력적인 점은 SQL 을 XML 에 편리하게 작성할 수 있고 동적 쿼리를 매우 편리하게 작성할 수 있다는 점이다.
MyBatis 는 XML 에 작성하기 때문에 라인이 길어져도 문자 더하기에 대한 불편함이 없다.
상품을 검색하는 로직을 통해 동적 쿼리를 비교해보자
JdbcTemplate 은 자바 코드로 직접 동적 쿼리를 작성해야 한다. 반면에 MyBatis 는 동적 쿼리를 매우 편리하게 작성할 수 있는 다양한 기능들을 제공해준다.
JdbcTemplate 은 스프링에 내장된 기능이고, 별도의 설정없이 사용할 수 있다는 장점이 있다. 반면에 MyBatis 는 약간의 설정이 필요하다.
정리
프로젝트에서 동적 쿼리가 복잡한 쿼리가 많다면 MyBatis 를 사용하고, 단순히 쿼리들이 많으면 JdbcTemplate 을 선택해서 사용하면 된다.
2️⃣ MyBatis 설정
mybatis-spring-boot-starter라이브러리를 사용해서 설정하는 방법build.gradlemybatis-spring-boot-starter: MyBatis 를 스프링 부트에서 편리하게 사용할 수 있게 시작하는 라이브러리mybatis-spring-boot-autoconfigure: MyBatis 와 스프링 부트 설정 라이브러리mybatis-spring: MyBatis 와 스프링을 연동하는 라이브러리mybatis: MyBatis 라이브러리main - application.propertiestest - application.propertiesmybatis.type-aliases-package,,;로 구분하면 된다.mybatis.configuration.map-underscore-to-camel-caseBeanPropertyRowMapper에서 처럼 언더바를 카멜로 자동 변경해주는 기능을 활성화한다.logging.level.hello.itemservice.repository.mybatis=trace관례의 불일치
자바 객체에는 주로 카멜(
camelCase) 표기법을 사용한다.itemName처럼 중간에 낙타 봉이 올라와 있는 표기법이다.반면에 관계형 데이터베이스에서는 주로 언더스코어를 사용하는
snake_case표기법을 사용한다.item_name처럼 중간에 언더스코어를 사용하는 표기법이다.이렇게 관례로 많이 사용하다 보니
map-underscore-to-camel-case기능을 활성화 하면 언더스코어 표기법을 카멜로 자동 변환해준다. 따라서 DB에서select item_name으로 조회해도 객체의itemName (setItemName())속성에 값이 정상 입력된다.정리하면 해당 옵션을 켜면
snake_case은 자동으로 해결되니 그냥 두면 되고, 컬럼 이름과 객체 이름이 완전히 다른 경우에는 조회 SQL 에서 별칭을 사용하면 된다.예)
select item_namename별칭을 통한 해결 방안
select item_name as name3️⃣ MyBatis 적용1 - 기본
본격적으로 MyBatis 를 사용해서 데이터베이스에 데이터를 저장해보자.
XML 에 작성한다는 점을 제외하고는 JDBC 반복을 줄여준다는 점에서 기존 JdbcTemplate 과 거의 유사하다.
마이바티스 매핑 XML 을 호출해주는 매퍼 인터페이스이다.
이 인터페이스에는
@Mapper애노테이션을 붙여주어야 한다. 그래야 MyBatis 에서 인식할 수 있다.이 인터페이스의 메서드를 호출하면 다음에 보이는
xml의 해당 SQL 을 실행하고 결과를 돌려준다.src/main/resources/hello/itemservice/repository/mybatis/ItemMapper.xmlinsert - save
insert SQL 은
<insert>를 사용한다.id에는 매퍼 인터페이스에 설정한 메서드 이름을 지정하면 된다. 여기서는 메서드 이름이save()이므로save라고 지정하면 된다.파라미터는
#{}문법을 사용하면 된다. 그리고 매퍼에서 넘긴 객체의 프로퍼티 이름을 적어주면 된다.#{}문법을 사용하면PreparedStatement를 사용한다. JDBC 의?를 치환한다고 생각하면 된다.useGeneratedKeys는 데이터베이스가 키를 생성해주는IDENTITY전략일 때 사용한다.keyProperty는 생성되는 키의 속성 이름을 지정한다. insert 가 끝나면item객체의id속성에 생성된 값이 입력된다.update - update
<update>를 사용하면 된다.Long id,ItemUpdateDto updateParam으로 2개이다. 파라미터가 1개만 있으면@Param을 지정하지 않아도 되지만, 파라미터가 2개 이상이면@Param으로 이름을 지정해서 파라미터를 구분해야 한다.Select SQL 은
<select>를 사용하면 된다.resultType은 반환 타입을 명시하면 된다. 여기서는 결과를Item객체에 매핑한다.application.properties에mybatis.type-aliases-package=hello.itemservice.domain속성을 지정한 덕분에 모든 패키지 명을 다 적지는 않아도 된다.BeanPropertyRowMapper처럼 SELECT SQL 의 결과를 편리하게 객체로 바로 변환해준다.mybatis.configuration.map-underscore-to-camel-case=true속성을 지정한 덕분에 언더스코어를 카멜 표기법으로 자동으로 처리해준다. (item_name->itemName)자바 코드에서 반환 객체가 하나이면
Item,Optional<Item>과 같이 사용하면 되고, 반환 객체가 한 이상이면 컬렉션을 사용하면 된다. 주로List를 사용한다.select - findAll
<where>,<if>같은 동적 쿼리 문법을 통해 편리한 동적 쿼리를 지원하다.<if>는 해당 조건이 만족하면 구문을 추가한다.<where>은 적절하게where문장을 만들어준다.<if>가 모두 실패하게 되면 SQLwhere을 만들지 않는다.<if>가 하나라도 성공하면 처음 나타나는and를where로 변환해준다.XML 특수문자
and price <= #{maxPrice}여기를 확인하면
<=를 사용하지 않고<=를 사용한 것을 확인할 수 있다. 그 이유는 XML 에서는 데이터 영역에<,>같은 특수 문자를 사용할 수 없기 때문이다 이유는 XML 에서 TAG 가 시작하거나 종료할 때<,>같은 특수문자를 사용하기 때문이다.다른 해결 방안으로는 XML 에서 지원하는
CDATA구문을 사용하는 것이다. 이 구문 안에서는 특수문자를 사용할 수 있다. 대신 이 구문 안에서는 XML TAG 가 단순 문자로 인식되기 때문에<if>,<where>등이 적용되지 않는다.XML CDATA 사용
특수문자와 CDATA 각각 상황에 따른 장단점이 있으므로 원하는 방법을 그때그때 선택하면 된다.
🔗 출처
김영한 - 스프링 DB 2편 - 데이터 접근 활용 기술
All reactions