Spring - MyBatis
SQL이 복잡하거나 길어지는 경우에는 어노테이션보다 XML을 이용하는 것이 좋다
MyBatis-Spring의 경우 Mapper 인터페이스와 XML을 연동하여 동시에 이용할 수 있다.
인터페이스 객체,메소드() 를 사용하는 순간 해당하는 인터페이스의 경로를 namespace로 가지고 있는 xml mapper를 찾아가서 메소드명과 동일한 id의 쿼리문을 수행하여 결과를 돌려준다
MyBatis는 내부적으로 JDBC의 Preparedstatement 를 이용하여 SQL을 처리한다
따라서 SQL에 전달되는 파라미터는 JDBC에서와 같이 ?로 치환되어서 처리한다
복잡한 SQL의 경우 ?로 나오는 값이 제대로 전달 되었는지 확인하기가 쉽지 않다
실핸한 SQL의 내용을 정확히 확인하기 어렵기 때문에 Log4jdbc-log4j2 라이브러리를 사용하여 어떤 값인지 확인할 수 있다
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
로그 레벨 설정
테스트 코드 실행시 많은 양의 로그가 출력되기 떄문에 불편할 수 있다
이럴 때에는 로그의 레벨을 이용해서 수정해준다
resoureces/log4j.xml 파일에 있는 level 태그를 수정한다
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!-- Appenders -->
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p: %c - %m%n" />
</layout>
</appender>
<!-- Application Loggers -->
<logger name="com.myapp.controller">
<level value="info" />
</logger>
<!-- 3rdparty Loggers -->
<logger name="org.springframework.core">
<level value="info" />
</logger>
<logger name="org.springframework.beans">
<level value="info" />
</logger>
<logger name="org.springframework.context">
<level value="info" />
</logger>
<logger name="org.springframework.web">
<level value="info" />
</logger>
<!-- Root Logger -->
<root>
<priority value="warn" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
MyBatis 동적 태그들
- if
- choose(when, otherwise)
- where
- trim
- foreach
## if
<if test="조건식">
if문의 조건이 참일때만 쿼리문으로 써짐
</if>
select \* from spring_board
<if test="max != null">
where boardnum < #{max}
</if>
max에 10을 넘겼다면 : select _ from spring_board where boardnum < 10
max를 넘기지 않는 다면 : select _ from spring_board
## choose
<choose>
<when test="조건식">
조건에 따라 실행
</when>
....
<otherwise>
위의 조건이 모두 거짓일 떄 실행
</otherwise>
</choose>
## where
select \* from spring_board
<where>
<if test="">
boardnum =#{boardnum}
</if>
</where>
## trim
<trim prefix="앞에 붙일 문자열" suffix="끝에 붙일 문자열" prefixOverrides="">
쿼리문
</trim>
ex)
<trim prefix="(" suffix=") and" prefixOverrides="or">
or boardnum=#{boardnum}
</trim>
<!-- (boardnum=#{boardnum}) and 로 인식 -->
## foreach
List, 배열, Map 등을 이용해서 루프를 처리한다.
<foreach item="값을 꺼내올 변수" index="인덱스 or 키" collection="컬렉션">
</foreach>
<!-- 제목 또는 내용으로 "app"을 검색
map.put("T","app")
map.put("C","app")
-->
select * from spring_board
<trim prefix="where(" suffix=")" preffixOverrides="or">
<foreach collection="map" item="val" index="key">
<trim prefix="or">
<choose>
<when test="key == 'T'.toString()">
title=#{val}
</when>
<when test="key == 'C'.toString()">
contents=#{val}
</when>
<when test="key == 'W'.toString()">
writer=#{val}
</when>
</choose>
</trim>
</foreach>
</trim>
<!-- select * from spring_board where( title="app" or contents="app") -->
'BACK-END' 카테고리의 다른 글
[Spring] Spring MVC 구조(2) (0) | 2022.03.30 |
---|---|
[Spring] Spring MVC 구조 (1) (0) | 2022.03.24 |
[Spring] 의존성 주입(Dependency Injection) (0) | 2022.03.21 |
[Spring]스프링 프레임워크란 ? (0) | 2022.03.18 |
[Oracle] 오라클 데이터베이스 (0) | 2022.03.11 |