framework/spring

4. 데이터 접근 기술 - MyBatis(spring, maven) 활용

wooweee 2023. 6. 30. 13:17
728x90

생성해야하는 파일

  • myBatis-config.xml 수정

  • DTO 생성 
    파일명 : ~~~.Dto

  • DAO 생성
    파일명 : ~~~Dao || DaoImpl

  • Mapper 생성
    파일명 : ~~~~Mapper.xml

1. myBatis-config.xml

자주하는 실수 : 별명을 무조건 올린다. mapper에서 returntype으로 그냥 쓸 때 에러 발생 / 별명(alias)가 중복되면 안된다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias alias="BoardDto" type="com.teamProject.ezmeal.domain.BoardDto"/>
        <typeAlias alias="SearchCondition" type="com.teamProject.ezmeal.domain.SearchCondition" />
        <typeAlias alias="CommentDto" type="com.teamProject.ezmeal.domain.CommentDto"/>

        <typeAlias alias="CartDto" type="com.teamProject.ezmeal.domain.CartDto"/>
        <typeAlias alias="CartProductDto" type="com.teamProject.ezmeal.domain.CartProductDto"/>
        <typeAlias alias="DeliveryAddressDto" type="com.teamProject.ezmeal.domain.DeliveryAddressDto"/>
        <typeAlias alias="MemberDto" type="com.teamProject.ezmeal.domain.MemberDto"/>


    </typeAliases>
</configuration>

 

2. DTO 생성

package com.teamProject.ezmeal.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CartDto {
    private Long cart_seq;
    private Long mbr_id;
}

 

3. DAO 생성

자주 실수하는 부분

  • SqlSession을 받아야한다.
  • namespace끝에 점이 붙는다. -> Mapper.xml의 namespace와 동일
  • session method : selectOne, selectList , insert, delete, update
    • selectOne : 1개만 받는다. 행 or 값 1개
    • seleList : 행 여러개를 list로 받는다. [행, 행, 행] -> mapper에서 returntype을 list안에 들어갈 객체 명으로 한다.
    • selectMap : 거의 사용X
    • insert, update, delete는 returntype을 따로 정하지 않고 변경된 행의 개수가 자동으로 반환 된다. int
  • mapper에 넘겨야하는 값이 여러개인 경우 (mapper.xml 작성되어있음)
    • map으로 감싸서 넘긴다.
    • 사용할 때 #{map.CartSeq}가 아니라 #{CartSeq}로 바로 사용
    • 아래 map으로 감싼것이 array형태일 경우 foreach로 생성하고 #{} 없이  " " string으로 바로 넘긴다.
package com.teamProject.ezmeal.dao;

import lombok.RequiredArgsConstructor;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

@Repository
@RequiredArgsConstructor
public class PointTransactionHistoryDao {
    private final SqlSession session;
    private static final String namespace = "tb_pointTransactionHistory.";

    public int pointCanUse(Long mbrId){
        return session.selectOne(namespace + "point_can_use", mbrId);
    }
    
    // map으로 값 전달하는 경우
        public List<CartProductDto> cartProducts(Long mbrId, String prodCodeString) throws Exception {
        Long cartSeq = cartSeq(mbrId);// cart_seq

        // 하나로 되어있는 string 배열로 쪼개기
        String[] parts = prodCodeString.split("p"); // TODO 구독상품은 p -> g

        ArrayList<String> prodCdList = new ArrayList<>();
        for (String part : parts) {
            if (!part.isEmpty()) {
                String prodCd = "p" + part; // TODO 구독상품은 p -> g
                prodCdList.add(prodCd);
            }
        }

        // map으로 다른 것들 담기
        Map map = new HashMap<>();
        map.put("cartSeq", cartSeq);
        map.put("prodCdList", prodCdList);

        return session.selectList(namespace + "select_prod", map);
    }
}

 

4. Mapper 생성

자주하는 실수

  • 파일명은 무조건 Mapper.xml로 마무리 지어야한다.
  • id는 dao의 namespace 다음의 string이다. cf) dao의 method명과 상관 없음
<?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="tb_member">

    <select id="lgin_pw" parameterType="String" resultType="String">
        SELECT lgin_pw
        FROM tb_member
        WHERE lgin_id = #{loginId}
    </select>

    <select id="mbr_id" parameterType="String" resultType="long">
        SELECT mbr_id
        FROM tb_member
        WHERE lgin_id = #{loginId}
    </select>

    <select id="mbr_Info" parameterType="Long" resultType="MemberDto">
        select *
        from tb_member
        where mbr_id = ${memberId}
    </select>
    
    
    <!--동적쿼리, 상품 여러개 받아오기-->
    <select id="select_prod" resultType="CartProductDto">
        SELECT *
        from tb_cart_product cp,
        tb_product p
        WHERE cp.cart_seq = #{cartSeq}
          and cp.prod_cd = p.prod_cd
        AND cp.prod_cd IN
        <foreach item="item" collection="prodCdList" open="(" separator="," close=")">
            #{item}
        </foreach>
    </select>

</mapper>

 

 

5. 참고 - 설정파일

 

root-context

  • 여기 설정에 의해서 mapper.xml의 위치와 파일명 규칙이 생성이 된다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
    ...
    
    <!-- Root Context: defines shared resources visible to all other web components -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url"
                  value="jdbc:mysql:mysql schema url 경로"/>
        <property name="username" value="xxxxxxxxx"></property>
        <property name="password" value="xxxxxxxxx"></property>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/> <!-- mybatis 설정파일 -->
        <property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/>
    </bean>

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory"/>
    </bean>
...
</beans>