[Spring] Mapper

Mapper

  • 매핑파일에 기재된 SQL을 호출하기 위한 인터페이스이다.
  • Mybatis 3.0부터 생겼다.
  • 매핑파일에 있는 SQL을 인터페이스로 호출한다.

Mapper 사용하지않았을시?

  • session.selectOne("namespace.아이디", 파라미터); 형식 이였다.
  • 네임스페이스+"."+SQL ID 로 지정해야한다.
  • 문자열로 작성하기때문에 버그가 생길 수 있다.
  • IDE에서 제공하는 code assist를 사용할 수 없다.

Mapper 사용했을때

  • Mapper 인터페이스 개발자가 직접작성한다.
  • 패키지 이름+"."+인터페이스이름+"."+메서드이름이 네임스페이스+"."+SQL의 ID를 설정해야 한다.
  • 네임스페이스 속성에는 패키지를 포함한 Mapper 인터페이스 이름 형식이다.
  • SQL ID 에는 매핑하는 메서드 이름을 지정하는 것.

Mapper 인터페이스 작성

반드시 인터페이스로 선언해주어야한다.
네임스페이스 명은 패키지포함 인터페이스이름으로 작성. 
ex)
메서드명은 SQLID와 동일하게작성.

root-context

  • 개발자가 직접 dao를 생성하지 않아도 자동으로 Mapper인터페이스를 활용하는 객체를 생성.
    소스마다 설정하지 않고 자동으로 경로를 설정해서 인식시킬 수 있음
<!-- 개발자가 직접 dao를 생성하지 않아도 자동으로 Mapper인터페이스를 활용하는 객체를 생성. 
		소스마다 설정하지 않고 자동으로 경로를 설정해서 인식시킬 수 있음  -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<property name="basePackage" value="kr.or.ddit.*.mapper"></property>
	</bean>

mapper(interface)

package kr.or.ddit.mapper;

import java.util.List;
import java.util.Map;

import kr.or.ddit.BuyerVO;
import kr.or.ddit.LprodVO;
import kr.or.ddit.MemberVO;

public interface LprodMapper {
	// 상품분류 별 거래처 목록
	public List<LprodVO> lprodlist(Map<String, Object> map);
	
	// 상품분류 별 거래처 목록 행의 수
	public int listCount(Map<String,Object> map) ;
	
	// 거래처 상세 정보
	public BuyerVO detail(String buyerId) ;
	
	// 거래처 수정
	public int modify(BuyerVO buyerVO) ;
	
	// 로그인
	public MemberVO loginPost(MemberVO memberVO);

	public List<LprodVO> list(Map<String, Object> map);
}

serviceImple - dao를 사용하지 않는다.

package kr.or.ddit;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class LprodServiceImpl implements LprodService {
	@Autowired
	private kr.or.ddit.mapper.LprodMapper lprodMapper;
	
	//상품분류 별 거래처 목록
	//메소드 재정의
	@Override
	public List<LprodVO> list(Map<String,Object> map){
		return this.lprodMapper.list(map);
	}
	
	//상품분류 별 거래처 목록 행의 수
	@Override
	public int listCount(Map<String, Object> map) {
		return this.lprodMapper.listCount(map);
	}
	
	//거래처 상세 정보
	@Override
	public BuyerVO detail(String buyerId) {
		return this.lprodMapper.detail(buyerId);
	}
	
	//거래처 수정
	@Override
	public int modify(BuyerVO buyerVO) {
		return this.lprodMapper.modify(buyerVO);
	}
	
	//로그인 
	//메소드 재정의
	@Override
	public MemberVO loginPost(MemberVO memberVO) {
		return lprodMapper.loginPost(memberVO);
	}
}

mapper.xml에 namespace경로설정(alias도 바꿔주시궜어요)

<?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="kr.or.ddit.mapper.LprodMapper">
	<resultMap type="lprodVO" id="lprodMap">
		<id property="lprodGu" column="LPROD_GU" />
		<result property="rnum" column="RNUM" />
		<result property="lprodNm" column="LPROD_NM" />
		<collection property="buyerVO" resultMap="buyerMap"></collection>
	</resultMap>
	
	<resultMap type="buyerVO" id="buyerMap">
		<id property="buyerId" column="BUYER_ID" />
		<result property="buyerName" column="BUYER_NAME" />
		<result property="buyerLgu" column="BUYER_LGU" />
	</resultMap>
	<!-- 상품분류 별 거래처 목록 -->
	<!-- 
	parameter : 
		{keyWord=캐주,currentPage=1,size=10}
	-->
	<select id="list" parameterType="hashMap" resultMap="lprodMap">
		SELECT T.RNUM, T.LPROD_GU, T.LPROD_NM
		     , T.BUYER_ID, T.BUYER_NAME, T.BUYER_LGU
		FROM
		(
		    SELECT ROW_NUMBER() OVER(ORDER BY LPROD_NM, BUYER_ID) RNUM
		         , L.LPROD_GU
		         , L.LPROD_NM
		         , B.BUYER_ID
		         , B.BUYER_NAME
		         , B.BUYER_LGU
		    FROM   LPROD L INNER JOIN BUYER B
		    ON(L.LPROD_GU = B.BUYER_LGU)
		    WHERE  1 = 1
		    <if test="keyWord!=null and keyWord!=''">
			    AND    (L.LPROD_GU LIKE '%'||#{keyWord}||'%'
			    OR     L.LPROD_NM LIKE '%'||#{keyWord}||'%'
			    OR     B.BUYER_ID LIKE '%'||#{keyWord}||'%'
			    OR     B.BUYER_NAME LIKE '%'||#{keyWord}||'%')
		    </if>
		) T
		WHERE T.RNUM BETWEEN #{currentPage}*7-6 AND #{currentPage}*7
	</select>
	
	<!-- 상품분류 별 거래처 목록의 totalCount -->
	<select id="listCount" parameterType="hashMap" resultType="int">
		SELECT COUNT(*)
		FROM   LPROD L INNER JOIN BUYER B
		ON(L.LPROD_GU = B.BUYER_LGU)
		WHERE  1 = 1
	    <if test="keyWord!=null and keyWord!=''">
		    AND    (L.LPROD_GU LIKE '%'||#{keyWord}||'%'
		    OR     L.LPROD_NM LIKE '%'||#{keyWord}||'%'
		    OR     B.BUYER_ID LIKE '%'||#{keyWord}||'%'
		    OR     B.BUYER_NAME LIKE '%'||#{keyWord}||'%')
	    </if>
	</select>
	<!-- 거래처 상세 정보 -->
	<select id="detail" parameterType="String" resultType="buyerVO">
		SELECT (SELECT L.LPROD_NM FROM LPROD L WHERE L.LPROD_GU = B.BUYER_LGU) LPROD_NM
		     , B.BUYER_ID
		     , B.BUYER_NAME
		     , B.BUYER_LGU
		     , B.BUYER_BANK
		     , B.BUYER_BANKNO
		     , B.BUYER_BANKNAME
		     , B.BUYER_ZIP
		     , B.BUYER_ADD1
		     , B.BUYER_ADD2
		     , B.BUYER_COMTEL
		     , B.BUYER_FAX
		     , B.BUYER_MAIL
		     , B.BUYER_CHARGER
		     , B.BUYER_TELEXT
		     , B.BUYER_IMG
		FROM   BUYER B
		WHERE  B.BUYER_ID = #{buyerId}
	</select>
	
	<!-- 거래처 수정 -->
	<update id="modify" parameterType="buyerVO">
		UPDATE BUYER
		SET    BUYER_MAIL = #{buyerMail}, BUYER_COMTEL = #{buyerComtel},
		       BUYER_CHARGER = #{buyerCharger}, BUYER_IMG = #{buyerImg}
		WHERE  BUYER_ID = #{buyerId}
	</update>
	
	<!-- 로그인 
	기본키의 2가지 특징. Not Null, 유일성/중복제거(no duplicate) -->
	<select id="loginPost" parameterType="memberVO" resultType="memberVO">
		SELECT MEMBERID,PASSWORD,NAME,EMAIL,REGDATE,INTRODUCTION,MEMBER_SERT_PIC
		FROM MEMBER
		WHERE  MEMBERID = #{memberid}
		AND    PASSWORD = PKG_CRYPTO.ENCRYPT(#{password})
	</select>
</mapper>












좋은 웹페이지 즐겨찾기