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에 편리하게 작성할 수 있고 또 동적 쿼리를 매우 편리하게 작성할 수 있다는 점이다.
#MyBatismybatis.type-aliases-package=hello.itemservice.domain // 마이바티스에서 특정 파라미터나 응답값을 패키지 명까지 XML 로 적어줘야 하는데 다 적지 않아도 되도록 하는 설정 (자동 인식)
mybatis.configuration.map-underscore-to-camel-case=true // 언더스코어를 케멀로 바꿔줌
logging.level.hello.itemservice.repository.mybatis=trace // 로그 출력
주의할점! 테스트 쪽 application 에도 넣어줘야함.
mybatis.type-aliases-package
마이바티스에서 타입 정보를 사용할 때는 패키지 이름을 적어주어야 하는데, 여기에 명시하면 패키지 이름 을 생략할 수 있다.
JdbcTemplate 에서 본것 처럼 데이터베이스는 snake_case 표기법을 사용하기 때문에 자바 객체의 Camel 표기법이랑 맞지 않음.
map-underscore-to-camel-case 기능을 활성화해서 이를 자동으로 변환하도록 해줌.
정리하면 해당 옵션을 켜면 snake_case 는 자동으로 해결되니 그냥 두면 되고, 컬럼 이름과 객체 이름이 완전히 다른 경우에는 조회 SQL에서 별칭을 사용하면 된다.
MyBatis 적용1 - 기본
이제부터 본격적으로 MyBatis를 사용해서 데이터베이스에 데이터를 저장해보자.
XML에 작성한다는 점을 제외하고는 JDBC 반복을 줄여준다는 점에서 기존 JdbcTemplate과 거의 유사하다.
@MapperpublicinterfaceItemMapper {
voidsave(Itemitem);
voidupdate(@Param("id") Longid, @Param("updateParam") ItemUpdateDtoitemUpdateDto); // 파라미터 2개 이상인 경우엔 @Param 넣어야함List<Item> findAll(ItemSearchConditemSearch);
Optional<Item> findById(Longid);
}
id 에는 매퍼 인터페이스에 설정한 메서드 이름을 지정하면 된다. 여기서는 메서드 이름이 save() 이므로 save 로 지정하면 된다.
파라미터는 #{} 문법을 사용하면 된다. 그리고 매퍼에서 넘긴 객체의 프로퍼티 이름을 적어주면 된다.
#{} 문법을 사용하면 PreparedStatement 를 사용한다. JDBC의 ? 를 치환한다 생각하면 된다.
useGeneratedKeys 는 데이터베이스가 키를 생성해 주는 IDENTITY 전략일 때 사용한다. keyProperty 는 생성되는 키의 속성 이름을 지정한다. Insert가 끝나면 item 객체의 id 속성에 생성된 값이 입력된다.
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 으로 이름을 지정해서 파라미터를 구분 해야 한다.
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.configuration.map-underscore-to-camel-case=true 속성을 지정한 덕분에 언 더스코어를 카멜 표기법으로 자동으로 처리해준다. ( item_nameitemName )
자바 코드에서 반환 객체가 하나이면 Item , Optional<Item> 과 같이 사용하면 되고, 반환 객체가 하나 이상 이면 컬렉션을 사용하면 된다. 주로 List 를 사용한다. 다음을 참고하자.
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>
Mybatis는 <where> , <if> 같은 동적 쿼리 문법을 통해 편리한 동적 쿼리를 지원한다.
<if> 는 해당 조건이 만족하면 구문을 추가한다.
<where> 은 적절하게 where 문장을 만들어준다.
예제에서 <if> 가 모두 실패하게 되면 SQL where 를 만들지 않는다.
예제에서 <if> 가 하나라도 성공하면 처음 나타나는 and 를 where 로 변환해준다.
** XML 특수문자**
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>
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.
MyBatis 소개
MyBatis는 앞서 설명한 JdbcTemplate보다 더 많은 기능을 제공하는 SQL Mapper 이다.
기본적으로 JdbcTemplate이 제공하는 대부분의 기능을 제공한다.
JdbcTemplate과 비교해서 MyBatis의 가장 매력적인 점은 SQL을 XML에 편리하게 작성할 수 있고 또 동적 쿼리를 매우 편리하게 작성할 수 있다는 점이다.
SQL 이 여러줄인 경우 둘을 비교
JdbcTemplate - SQL 여러줄
MyBatis - SQL 여러줄
MyBatis는 XML에 작성하기 때문에 라인이 길어져도 문자 더하기에 대한 불편함이 없다.
동적 쿼리의 경우 JdbcTemplate 은 언제 where 이 들어가고, and 가 들어가고 를 직접 작성했음.
JdbcTemplate - 동적 쿼리
MyBatis - 동적 쿼리
JdbcTemplate은 자바 코드로 직접 동적 쿼리를 작성해야 한다. 반면에 MyBatis는 동적 쿼리를 매우 편리하게 작성 할 수 있는 다양한 기능들을 제공해준다.
설정의 장단점
JdbcTemplate은 스프링에 내장된 기능이고, 별도의 설정없이 사용할 수 있다는 장점이 있다. 반면에 MyBatis는 약 간의 설정이 필요하다.
정리
프로젝트에서 동적 쿼리와 복잡한 쿼리가 많다면 MyBatis를 사용하고, 단순한 쿼리들이 많으면 JdbcTemplate을 선 택해서 사용하면 된다. 물론 둘을 함께 사용해도 된다. 하지만 MyBatis를 선택했다면 그것으로 충분할 것이다.
MyBatis 설정
MyBatis 라이브러리 넣기
build.gradle 에 추가하기.
스프링이 공식적으로 지원하는 라이브러리는 버젼정보를 넣지 않아도 되는데, MyBatis는 공식지원이 아니기 때문에 버젼 정보를 넣어줘야함.
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'application.properties 에도 설정 추가 필요.
주의할점! 테스트 쪽 application 에도 넣어줘야함.
mybatis.type-aliases-package,,;로 구분하면 된다.mybatis.configuration.map-underscore-to-camel-caseBeanPropertyRowMapper에서 처럼 언더바를 카멜로 자동 변경해주는 기능을 활성 화 한다. 바로 다음에 설명하는 관례의 불일치 내용을 참고하자.logging.level.hello.itemservice.repository.mybatis=trace관례의 불일치
JdbcTemplate 에서 본것 처럼 데이터베이스는 snake_case 표기법을 사용하기 때문에 자바 객체의 Camel 표기법이랑 맞지 않음.
map-underscore-to-camel-case 기능을 활성화해서 이를 자동으로 변환하도록 해줌.
정리하면 해당 옵션을 켜면
snake_case는 자동으로 해결되니 그냥 두면 되고, 컬럼 이름과 객체 이름이 완전히 다른 경우에는 조회 SQL에서 별칭을 사용하면 된다.MyBatis 적용1 - 기본
이제부터 본격적으로 MyBatis를 사용해서 데이터베이스에 데이터를 저장해보자.
XML에 작성한다는 점을 제외하고는 JDBC 반복을 줄여준다는 점에서 기존 JdbcTemplate과 거의 유사하다.
이제 같은 위치에 실행할 SQL이 있는 XML 매핑 파일을 만들어주면 된다.
참고로 자바 코드가 아니기 때문에
src/main/resources하위에 만들되, 패키지 위치는 맞추어 주어야 한다.XML 파일을 원하는 위치에 두고 싶으면
application.properties에 다음과 같이 설정하면 된다.mybatis.mapper-locations=classpath:mapper/**/*.xml이렇게 하면
resources/mapper를 포함한 그 하위 폴더에 있는 XML을 XML 매핑 파일로 인식한다. 이 경우파일 이름은 자유롭게 설정해도 된다. (xml 에 맵핑을 위한 설정 namespace 가 있기 때문)<insert>를 사용하면 된다.id에는 매퍼 인터페이스에 설정한 메서드 이름을 지정하면 된다. 여기서는 메서드 이름이save()이므로save로 지정하면 된다.#{}문법을 사용하면 된다. 그리고 매퍼에서 넘긴 객체의 프로퍼티 이름을 적어주면 된다.#{}문법을 사용하면PreparedStatement를 사용한다. JDBC의?를 치환한다 생각하면 된다.useGeneratedKeys는 데이터베이스가 키를 생성해 주는IDENTITY전략일 때 사용한다.keyProperty는 생성되는 키의 속성 이름을 지정한다. Insert가 끝나면item객체의id속성에 생성된 값이 입력된다.<update>를 사용하면 된다.Long id,ItemUpdateDto updateParam으로 2개이다. 파라미터가 1개만 있으면@Param을 지정하지 않아도 되지만, 파라미터가 2개 이상이면@Param으로 이름을 지정해서 파라미터를 구분 해야 한다.<select>를 사용하면 된다.resultType은 반환 타입을 명시하면 된다. 여기서는 결과를Item객체에 매핑한다. application.properties 에서 속성 지정해서 패키지명 전부 적지 않아도 괜찮음.mybatis.configuration.map-underscore-to-camel-case=true속성을 지정한 덕분에 언 더스코어를 카멜 표기법으로 자동으로 처리해준다. (item_nameitemName)Item,Optional<Item>과 같이 사용하면 되고, 반환 객체가 하나 이상 이면 컬렉션을 사용하면 된다. 주로List를 사용한다. 다음을 참고하자.<where>,<if>같은 동적 쿼리 문법을 통해 편리한 동적 쿼리를 지원한다.<if>는 해당 조건이 만족하면 구문을 추가한다.<where>은 적절하게where문장을 만들어준다.<if>가 모두 실패하게 되면 SQLwhere를 만들지 않는다.<if>가 하나라도 성공하면 처음 나타나는and를where로 변환해준다.** XML 특수문자**
xml 태그에 < > 를 쓰기 때문에 이 부분을 바꿔서 사용해야함
다른 해결 방안으로 CDATA 구문 문법 사용이 있음.
이 구문 안에선 특수문자 사용 가능. 대신 구문 안에선 태그가 적용하지 않기 때문에 적절한 위치에 사용해야함.
복잡하면 이걸 쓰는것도 좋음.
All reactions