🌱 오늘의 주제 : MyBatis
🌱 MyBatis
- XML에 SQL 쿼리를 작성하여 데이터베이스에 접근하고, 자바 객체와 매핑해주는 Persistence Framework
쿼리 수행 로그 세팅
수행된 쿼리문을 Console에서 볼 수 있도록 로그를 찍는 세팅을 한다.
SpringBoot web starter에 기본으로 logback이라는 로깅 라이브러리가 세팅되어 있으며 설정을 추가하면 된다.
src/main/resources에 설정 파일명을 logback-spring.xml로 설정하면 logback 설정 파일을 읽는다.
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- Appenders -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%d %5p [%c] %m%n</Pattern>
</encoder>
</appender>
<!-- Logger -->
<logger name="com.marobiana" level="DEBUG" appender-ref="console" />
<!-- Root Logger -->
<root level="info">
<appender-ref ref="console" />
</root>
</configuration>
위의 내용의 코드를 추가하면 수행된 쿼리문이 로그에 찍힌다.
🌱 CRUD 예제
SELECT 문
mapper.xml
http://mybatis.org/dtd/mybatis-3-mapper.dtd">
SELECT
`id`
, `storeId`
, `menu`
, `userName`
, `point`
, `review`
, `createdAt`
, `updatedAt`
FROM
`new_review`
WHERE
`id` = #{id}
- mapper namespace: 명시된 인터페이스와 xml을 매핑한다.
- select의 속성
- id: mapper namespace에 명시된 인터페이스의 메소드명과 일치하는 쿼리가 수행된다.
- parameterType: 쿼리를 동적으로 구성하기 위한 데이터의 타입(자료형 또는 객체)
- resultType: 쿼리 수행 후 결과의 타입(자료형 또는 객체)
Mapper Interface.java
@Repository
public interface ReviewDAO {
public Review selectReview(@Param("id") int id);
}
- Mapping이 되는 인터페이스는 @Repository 어노테이션으로 Spring Bean을 만든다.
- @Param 어노테이션에 정의된 이름으로 xml에서 동적으로 값을 세팅한다.
Insert 문
mapper.xml
<insert id="insertReview" parameterType="com.marobiana.lesson03.model.Review">
INSERT INTO `new_review`
(
`storeId`
, `menu`
, `userName`
, `point`
, `review`
, `createdAt`
, `updatedAt`
)
VALUES
(
#{storeId}
, #{menu}
, #{userName}
, #{point}
, #{review}
, NOW()
, NOW()
)
</insert>
<!-- 또는 -->
<insert id="insertReviewAsField" parameterType="map">
INSERT INTO `new_review`
(
`storeId`
, `menu`
, `userName`
, `point`
, `review`
, `createdAt`
, `updatedAt`
)
VALUES
(
#{storeId}
, #{menu}
, #{userName}
, #{point}
, #{review}
, NOW()
, NOW()
)
</insert>
- insert의 속성
- id: mapper namespace에 명시된 인터페이스의 메소드명과 일치하는 쿼리가 수행된다.
- parameterType: 쿼리를 동적으로 구성하기 위한 데이터의 타입(자료형 또는 객체)
- 결과가 없으므로 resultType은 쓰지 않는다.
- insert가 되고 난 후 몇 행이 insert 되었는지 리턴 받을 수 있다.
Mapper Interface.java
@Repository
public interface ReviewDAO {
public int insertReview(Review review); // review 객체의 내용을 row로 추가
// 또는
public int insertReviewAsField(
@Param("storeId") int storeId,
@Param("menu") String menu,
@Param("userName") String userName,
@Param("point") double point,
@Param("review") String review); // 여러 파라미터들을 row로 추가
}
- insertReview: 객체를 넘기면 객체의 필드명으로 xml에서 동적으로 값을 세팅한다.
- insertReviewAsField:
- @Param 어노테이션에 정의된 이름들로 xml에서 동적으로 값을 세팅한다.
- xml에서는 파라미터들을 map으로 받으면 된다.
Update 문
mapper.xml
<update id="updateReviewById" parameterType="map">
UPDATE `new_review`
SET
`review` = #{review}
WHERE
`id` = #{id}
</update>
Mapper Interface.java
public void updateReviewById(
@Param("id") int id,
@Param("review") String review);
Delete 문
mapper.xml
<delete id="deleteReviewById" parameterType="int">
DELETE
FROM `new_review`
WHERE
`id` = #{id}
</delete>
Mapper Interface.java
public void deleteReviewById(@Param("id") int id);
쿼리문에서 부등호 사용하기
아래와 같은 코드는 에러를 발생시킨다.
XML 태그가 닫히는 것으로 인식하기 때문이다.
id가 5보다 큰 데이터들 가져오기
<select id="selectUserById" parameterType="int" resultType="map">
SELECT
*
FROM `user`
WHERE
id > 5
</select>
CDATA 사용
쿼리 예시
<select id="selectUserById" parameterType="int" resultType="map">
SELECT
*
FROM `user`
WHERE
<![CDATA[
id > 5
]]>
</select>
부등호를 HTML 특수 기호로 사용
쿼리 예시
<select id="selectUserById" parameterType="int" resultType="map">
SELECT
*
FROM `user`
WHERE
id & g t ; 5
</select>
'Spring' 카테고리의 다른 글
Spring - Interceptor란? (1) | 2023.05.17 |
---|---|
Spring - @RequestBody / @ResponseBody 어노테이션 이란? (0) | 2023.05.13 |
Spring - DB 연동(MyBatis) Cycle (0) | 2023.04.10 |
Spring - 요청/응답 Life Cycle , 어노테이션(Annotation) 종류, JSP View 연동하기 (0) | 2023.04.10 |
Spring - 동작 방식 (0) | 2023.04.10 |