스프링/6. 스프링 DB-2

20. 마이바티스 적용 1

sdafdq 2023. 10. 10. 02:05
@Mapper
public interface ItemMapper {
    void save(Item item);
    void update(@Param("id") Long id, @Param("updateParam") ItemUpdateDto updateParam);
    Optional<Item> findById(Long id);
    List<Item> findAll(ItemSearchCond itemSearch);
}

먼저 인터페이스를 만듦. 이건 마이바티스 매핑 XML을 호출해주는 매퍼 인터페이스.

@Mapper를 꼭 붙여야 인식됨.

@Param은 파라미터 하나일 경우에는 안넣어도 되는데, 2개 들어갈 때는 넣어줘야 함.

아마 하나면 알아서 인식해서 되는 듯 함.

그러니까, 따져보면 다 매개변수들이 @Param 붙어있어야 하는데 하나라서 그냥 해도 괜찮은 그런 느낌인 듯.

여튼 저렇게 가면 매개변수인 객체의 필드를 이름 그대로 사용할 수 있는 듯.

itemName이라던지.

 

 

이 인터페이스의 메서드를 호출하면 xml의 해당 sql을 실행한다.

 

xml과 매핑할 인터페이스를 만들어 주고, xml을 만들어 주고, 이 인터페이스의 메소드를 사용하면 자동으로 그 xml의 sql이 실행 됨.

 

구현체는 알아서 자동으로 생성 됨.

 

 

이게 xml 위치도 맞춰줘야 하는데,

자바코드는 아니기에 java가 아닌 resources 폴더에 만들어 줘야 하는데,

근데 인터페이스랑 같은 위치여야 함.

그러니까 인터페이스의 위치가

java.hello.itemservice.repository.mybatis 라면

resources.hello.itemservice.repostiory.mybatis 에 만들어 줘야 함.

 

그 다음 거기에 인터페이스랑 이름도 같아야 함.

ItemMapper.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">
    
</mapper>

xml인거와 기본설정 해 주고,

문서타입은 맵퍼이고, 뭐 mybatis에서 정의한 문서타입 가져오는? 그런건가 봄

 

그 다음

mapper 하고 저 안에 이제 sql문 만들면 되는데, 저 namespace 안에 ItemMapper의 경로를 넣어줘야 함.

 

 

<mapper namespace="hello.itemservice.repository.mybatis.ItemMapper">
    <insert id=""></insert>
    
    <update id=""></update>
    
    <select id=""></select>
</mapper>

여기 안에 이제 id는 메서드 이름 해서 채워주면 됨.

 

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

하나 작성해 봄.

id는 메소드 이름

useGeneratedKeys 는 자동계산, 생성되는 키를 사용한다는 거고, 키의 프로퍼티는 id라고 했다.

DB의 id에 계산된 걸 item.id에 알아서 넣어준다고 함.

 

쿼리를 작성하는데, 

뭐 똑같은 데

 

void save(Item item);

인터페이스에서 사용했던 인자 사용하려면

#{필드명} 하면 됨.

 

 

그 다음 update.

이건 파라마티가 2개였다.

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

 

xml을 작성해 보겠다.

<select id="findById" resultType="Item">
    select id, item_name, price, quantity
    from item
    where id=#{id}
</select>

우리가 이거는 결과를 반환하도록 해야 하기 때문에

resultType 이라는 것을 써 줌.

그럼 그 타입으로 반환 됨.

지금 보면 Item타입으로 반환되어지게끔 했음

길긴 한데,

우리가 application.properties에서 mybatis에 대한 설정으로 

mybatis.type-aliases-package=hello.itemservice.domain

이렇게 해 준적이 있음. 뭐 대충 마이바티스의 타입의 패키지인데,

저렇게 정해놨기 때문에

<select id="findById" resultType="Item">

그냥 이렇게 domain까지 생략해서 쓸 수 있음.

저 application.properties의 설정은 , 붙여서 여러 개 할 수 있음.

 

resultType="item"은 BeanPropertyRowMapper처럼 바로 알아서 변환해 주는 거.

BeanPropertyRowMapper가 스네이크문법을 자동으로 카멜케이스로 변환해 줬듯이 이것도 그럼.

 

파라미터가 2개인 경우는 #{파라미터이름.필드}

이렇게 쓰면 되는 듯.

원시타입은 그냥 #{id} 바로 이렇게 쓰고

 

위의 save같은 경우도 사실 #{item.itemName} 이런 식으로 썼었어야 했던 거 같은데, 파라미터가 하나만 있어서 생략이 가능했나 봄.

 

 

그 다음

findAll

동적 쿼리

<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>

where은 그러니까 아래 조건들이 하나라도 만족해야 생기는 것 같다.

if test="테스트할 조건문"

저 조건이 참이면

if문 안에 있는 쿼리가 추가가 된다. 물론 하나라도 참이니 앞에 where가 붙어서 (조건이 맞는 것 중 처음은 and가 사라지는 듯.)

테스트할 조건문은 #{itemName} 이렇게 안쓰고 그대로 쓰는 듯.

 

반환값이 여러개 이면 알아서 List<Item>으로 생성해서 주는 듯

 

아 그리고 문장 중에 $lt; 이거는 아무래도 우리가 xml문서를 쓰고 있는거라 <가 태그 열고닫고 그거라 &lt; 이렇게 해 줘야 함. $lt;= 하면 작거나 같은 수

 

<?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>

여튼 xml은 다 작성을 하였다.

 

 

근데 또 아무래도 xml과 인터페이스 자리를 맞춰야 하니 지저분할 수도 있다.

그럴 때는 application.properties에다가

mybatis.mapper-locations=classpath:mapper/**/*.xml

이렇게 하면 mapper 패키지 안에 모든 패키지 안의 *.xml을 인지하겠단 소리..

resources/mapper안의 모든 패키지를 인지할 수 있다.

 

이렇게 하면 파일 이름도 자유롭게 설정할 수 있긴 하지만 맞추는 게 좋을 듯.

 

 

'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글

22. 마이바티스 기능들.  (0) 2023.10.10
21. 마이바티스 적용2  (0) 2023.10.10
19. MyBatis 설정  (0) 2023.10.09
18. MyBatis  (0) 2023.10.09
17. 스프링부트의 임베디드 DB  (0) 2023.10.09