Spring Boot

MyBatis - Spring 설정

게슬 2022. 6. 2. 09:36
728x90

1. build

implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'

springframework에서 정식으로 해주는게 아니라 버전 입력 필요함.


2. application.properties

mybatis.type-aliases-package={매핑되어 나올 Class 위치}

# 이렇게 하면 /resources/mapper밑에 있는 모든 xml 파일 읽어서 mapping해줌
mybatis.mapper-locations=classpath:mapper/**/*.xml

3. code

@Mapper
public interface ItemMapper {

    void save(Item item);

    void update(@Param("id") Long id, @Param("updateParam") ItemUpdateDto itemUpdateDto);

    Optional<Item> findById(Long id);

    List<Item> findAll(ItemSearchCond itemSearchCond);

}

1) ibatis의 @Mapper 어노테이션을 달아줘야함

2) 파라미터가 2개 이상인 경우 @Param("{xml에서 사용할 이름}") 을 달아줘야함.

3) Optional 지원


4. xml 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="hello.itemservice.repository.mybatis.ItemMapper">

    <insert id="save" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO item (item_name, price, quantity)
        values (#{itemName}, #{price}, #{quantity})
    </insert>

    <update id="update">
        UPDATE item
        SET item_name=#{updateParam.itemName},
        price=#{updateParam.price},
        quantity=#{updateParam.quantity}
        WHERE id=#{id}
    </update>

    <select id="findById" resultType="Item">
        SELECT id, item_name, price, quantity
        FROM item
        WHERE id =#{id}
    </select>

    <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 &lt;=#{maxPrice}
            </if>
        </where>
    </select>

</mapper>

1) Select, Update, Insert, Delete가능

2) resultType 속성으로 반환Class mapping가능

3) where절에서 주의하기

 

#{parameter} -> preparedStatement처럼 값 입력 가능

${value} -> colume값 입력 가능한데 SQL injection 방어 할 수 없으니 사용 주의

728x90