Mybatis - 매핑 discriminator

yeong ·2023년 2월 6일

mybatis

목록 보기
4/4

MyHewonMapper.xml(discriminator ,동적 SQL(Dynamic SQL) )

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="xyz.itwill.mapper.MyHewonMapper">
	<insert id="insertHewon" parameterType="MyHewon">
		insert into myhewon values(#{id},#{name},#{phone},#{email},#{state})
	</insert>
	
	<resultMap type="MyHewon" id="myHewonResultMap">
		<id column="hewon_id" property="id"/>
		<result column="hewon_name" property="name"/>
		<result column="hewon_phone" property="phone"/>
		<result column="hewon_email" property="email"/>
		<result column="hewon_state" property="state"/>
	</resultMap>
	
	<select id="selectHewonList" resultMap="myHewonResultMap">
		select * from myhewon order by hewon_id
	</select>
	
	<!-- 검색된 회원정보에서 공개범위에 따라 다른 매핑정보를 제공하기 위한 resultMap 엘리먼트 -->
	<!-- discriminator : 검색행의 컬럼값을 비교하여 서로 다른 매핑정보를 제공하기 위한 엘리먼트 -->
	<!-- => 하위 엘리먼트로 case 엘리먼트를 사용하여 컬럼값을 비교해 같은 경우 매핑정보 제공 -->
	<!-- javaType 속성 : 검색행의 비교 컬럼값의 Java 자료형을 속성값으로 설정 -->
	<!-- => Java 자료형 대신 typeAlias 엘리먼트의 별칭 사용 가능 -->
	<!-- column 속성 : 검생행의 비교 컬럼명을 속성값으로 설정 -->
	<!-- 
	<resultMap type="MyHewon" id="myHewonDiscriminatorResultMap">
		<discriminator javaType="int" column="hewon_state">
			<case value="1">
				<id column="hewon_id" property="id"/>
				<result column="hewon_state" property="state"/>
			</case>
			<case value="2">
				<id column="hewon_id" property="id"/>
				<result column="hewon_name" property="name"/>
				<result column="hewon_state" property="state"/>
			</case>
			<case value="3">
				<id column="hewon_id" property="id"/>
				<result column="hewon_name" property="name"/>
				<result column="hewon_phone" property="phone"/>
				<result column="hewon_state" property="state"/>
			</case>
			<case value="4">
				<id column="hewon_id" property="id"/>
				<result column="hewon_name" property="name"/>
				<result column="hewon_phone" property="phone"/>
				<result column="hewon_email" property="email"/>
				<result column="hewon_state" property="state"/>
			</case>
		</discriminator>
	</resultMap>
	-->

	<!-- case 엘리먼트의 공통적인 매핑정보가 존재할 경우 discriminator 엘리먼트가 아닌 다른
	엘리먼트를 사용하여 매핑 정보 제공 가능 -->	
	<!--  
	<resultMap type="MyHewon" id="myHewonDiscriminatorResultMap">
		<id column="hewon_id" property="id"/>
		<result column="hewon_state" property="state"/>
		<discriminator javaType="int" column="hewon_state">
			<case value="2">
				<result column="hewon_name" property="name"/>
			</case>
			<case value="3">
				<result column="hewon_name" property="name"/>
				<result column="hewon_phone" property="phone"/>
			</case>
			<case value="4">
				<result column="hewon_name" property="name"/>
				<result column="hewon_phone" property="phone"/>
				<result column="hewon_email" property="email"/>
			</case>
		</discriminator>
	</resultMap> 
	-->
	
	<resultMap type="MyHewon" id="myHewonOneResultMap">
		<id column="hewon_id" property="id"/>
		<result column="hewon_state" property="state"/>
	</resultMap>
	
	<!-- extends 속성 : resultMap 엘리먼트의 식별자를 속성값으로 설정 -->
	<!-- => 다른 resultMap 엘리먼트의 매핑정보를 상속받아 사용하기 위한 속성 -->
	<resultMap type="MyHewon" id="myHewonTwoResultMap" extends="myHewonOneResultMap">
		<result column="hewon_name" property="name"/>
	</resultMap>
	
	<resultMap type="MyHewon" id="myHewonThreeResultMap" extends="myHewonTwoResultMap">
		<result column="hewon_phone" property="phone"/>
	</resultMap>
	
	<resultMap type="MyHewon" id="myHewonFourResultMap" extends="myHewonThreeResultMap">
		<result column="hewon_email" property="email"/>
	</resultMap>
	
	<resultMap type="MyHewon" id="myHewonDiscriminatorResultMap">
		<discriminator javaType="int" column="hewon_state">
			<!-- resultMap 속성을 사용하여 다른 resultMap 엘리먼트의 매핑정보를 제공받아 사용 가능 -->
			<case value="1" resultMap="myHewonOneResultMap"/>
			<case value="2" resultMap="myHewonTwoResultMap"/>
			<case value="3" resultMap="myHewonThreeResultMap"/>
			<case value="4" resultMap="myHewonFourResultMap"/>
		</discriminator>
	</resultMap>
	
	<select id="selectDiscriminatorHewonList" resultMap="myHewonDiscriminatorResultMap">
		select * from myhewon order by hewon_id
	</select>
	
	<!-- 매퍼에 등록된 SQL 명령에 필요한 값을 전달하는 방법 -->
	<!-- => 전달값은 SQL 명령에서 #{변수명|필드명|맵키} 형식으로 표현하여 사용 -->
	<!-- 1.XML 기반의 매퍼 파일에서 SQL 명령이 등록된 엘리먼트의 parameterType 속성값으로
	Java 자료형(별칭)을 설정하여 값을 전달받아 사용 -->
	<!-- => 단일값을 전달받기 위해 parameterType 속성에 원시형(PrimitiveType - Wrapper 클래스)
	또는 String 클래스를 속성값으로 설정 - SQL 명령에서 #{변수명} 형식으로 전달값 사용  -->
	<!-- => 다수값을 전달받기 위해 parameterType 속성에 JavaBean(DTO) 클래스를 속성값으로 설정
	- SQL 명령에서 #{필드명} 형식으로 전달값(필드값)을 사용 -->
	<!-- => 다수값을 전달받기 위해 parameterType 속성에 HashMap 클래스(Map 인터페이스)를 
	속성값으로 설정 - SQL 명령에서 #{맵키} 형식으로 전달값(맵값)을 사용 -->
	<!-- 2.인터페이스 기반의 매퍼 파일에서 추상메소드의 매개변수에 @Param 어노테이션을
	설정하여 매개변수에 전달값을 SQL 명령에서 사용 -->
	<!-- => 바인딩된 XML 기반의 매퍼 파일의 엘리먼트에 등록된 SQL 명령에서도 전달값 사용 가능 -->
	<!-- => XML 기반의 매퍼 파일에 엘리먼트에서 prarmeterType 속성 생략 -->
	
	<!-- 공개범위를 전달받아 MYHEWON 테이블에 저장된 해당 공개범위의 회원정보를 검색하여
	검색결과를 제공하는 엘리먼트 -->
	<!-- => 값을 하나만 전달받아 SQL 명령에서 사용할 경우 parameterType 속성값으로 원시형
	(Wrapper 클래스) 또는 String 클래스를 설정하고 SQL 명령에서 #{변수명} 형식으로 전달값 사용 -->
	<!-- => 변수명은 아무런 의미가 없으며 식별자 작성 규칙에 맞게 설정 -->
	<!--  
	<select id="selectStateHewonList" parameterType="int" resultMap="myHewonResultMap">
		select * from myhewon where hewon_state=#{state} order by hewon_id
	</select>
	-->
	
	<!-- XML 기반의 매퍼 파일만 설정할 경우 parameterType 속성값으로 원시형(Wrapper 클래스) 
	또는 String 클래스를 설정한 경우 parameterType 속성 생략 가능 -->
	<select id="selectStateHewonList" resultMap="myHewonResultMap">
		select * from myhewon where hewon_state=#{state} order by hewon_id
	</select>
	
	<!-- 이름과 이메일을 전달받아 MYHEWON 테이블에 저장된 해당 이름과 이메일의 회원정보에
	대한 아이디를 검색하여 검색결과를 제공하는 엘리먼트 -->
	<!-- => 값을 여러개 전달받아 SQL 명령에서 사용할 경우 parameterType 속성값으로 JavaBean(DTO)
	클래스를 설정하여 JavaBean(DTO) 객체를 전달받고 SQL 명령에서 #{필드명} 형식으로 필드값 사용 -->
	<!-- 
	<select id="selectBeanHewonId" parameterType="MyHewon" resultType="string">
		select hewon_id from myhewon where hewon_name=#{name} and hewon_email=#{email}
	</select>
	-->
	 
	<!-- Interface 기반의 매퍼 파일과 바인딩된 경우 전달값에 상관없이 parameterType	속성 생략 가능 -->
	<select id="selectBeanHewonId" resultType="string">
		select hewon_id from myhewon where hewon_name=#{name} and hewon_email=#{email}
	</select>
	
	<!-- 이름과 이메일을 전달받아 MYHEWON 테이블에 저장된 해당 이름과 이메일의 회원정보에
	대한 아이디를 검색하여 검색결과를 제공하는 엘리먼트 -->
	<!-- => 값을 여러개 전달받아 SQL 명령에서 사용할 경우 parameterType 속성값으로 HashMap 클래스
	(Map 인터페이스)를 설정하여 Map 객체를 전달받아 SQL 명령에서 #{맵키} 형식으로 맵값 사용 -->
	<select id="selectMapHewonId" parameterType="map" resultType="string">
		select hewon_id from myhewon where hewon_name=#{name} and hewon_email=#{email}
	</select>
	
	<insert id="insertMapHewon" parameterType="map">
		insert into myhewon values(#{id},#{name},#{phone},#{email},#{state})
	</insert>
	
	<!-- select 엘리먼트의 resultType 속성값으로 HashMap 클래스(Map 인터페이스)로 설정하면
	검색행을 Map 객체로 제공 -  하나의 검색행을 Map 객체로 표현 -->
	<!-- => 검색행의 컬럼명을 맵키로 매핑되고 컬럼값이 맵값으로 매핑되어 엔트리로 추가 -->
	<!-- => 검색행의 컬럼명은 대문자로 검색되어 맵키로 매핑 처리 -->
	<select id="selectMapHewonList" resultType="map">
		select * from myhewon order by hewon_id
	</select>
	
	<!-- 이름과 이메일을 전달받아 MYHEWON 테이블에 저장된 해당 이름과 이메일의 회원정보에
	대한 아이디를 검색하여 검색결과를 제공하는 엘리먼트 -->
	<!-- 매퍼 바인딩된 처리된 인터페이스 기반의 매퍼파일에서 추상메소드의 매개변수에 전달된 
	값을 @Param 어노테이션의 value 속성값으로 제공받아 SQL 명령에서 #{속성값}으로 전달값 사용 -->
	<!-- => parameterType 속성을 반드시 생략 -->
	<select id="selectParamHewonId" resultType="string">
		select hewon_id from myhewon where hewon_name=#{name} and hewon_email=#{email}
	</select>
	
	<!-- 검색 컬럼명과 검색 단어를 전달받아 MYHEWON 테이블에 저장된 회원정보 중 검색 컬럼에
	검색 단어가 저장된 회원정보를 검색하여 검색결과를 제공하는 엘리먼트 -->
	<!-- #{변수명|필드명|맵키} : '전달값' - 전달값이 SQL 명령에서 문자값으로 표현 -->
	<!-- ${변수명|필드명|맵키} : 전달값 - 전달값이 SQL 명령에서 문장으로 표현 -->
	<!-- => ibatis 프레임워크에서는 $변수명|필드명|맵키$ 형식으로 표현 -->
	<!-- => $ 표현식은 InSQL 공격에 취약하므로 사용하는 것을 비권장 -->
	<!--  
	<select id="selectSearchHewonList" parameterType="map" resultMap="myHewonResultMap">
		select * from myhewon where ${searchColumn}=#{searchKeyword} order by hewon_id 
	</select>
	-->
	
	<!-- 검색 컬럼명과 검색 단어를 전달받아 MYHEWON 테이블에 저장된 회원정보 중 검색 컬럼에
	검색 단어가 포함된 회원정보를 검색하여 검색결과를 제공하는 엘리먼트 -->
	<!--  
	<select id="selectSearchHewonList" parameterType="map" resultMap="myHewonResultMap">
		select * from myhewon where ${searchColumn} like '%'||#{searchKeyword}||'%' order by hewon_id 
	</select>
	-->
	
	<select id="selectSearchHewonList" parameterType="map" resultMap="myHewonResultMap">
		<!-- bind : SQL 명령에서 사용하기 위한 이름과 값을 설정하는 엘리먼트 - 전달값 변경 -->
		<!-- => bind 엘리먼트로 설정된 값은 SQL 명령에서 #{이름} 형식으로 표현하여 사용 -->
		<!-- name 속성 : SQL 명령에서 사용될 값을 구분하기 위한 식별자를 속성값 설정 -->
		<!-- value 속성 : SQL 명령에서 사용될 값을 속성값으로 설정 -->
		<!-- => parameterType 속성으로 전달된 값을 사용할 있으며 문자값 결합(+ 연산자) 기능 제공 -->
		<bind name="keyword" value="'%'+searchKeyword+'%'"/>
		select * from myhewon where ${searchColumn} like #{keyword} order by hewon_id 
	</select>
	
	<!-- 이름을 전달받아 MYHEWON 테이블에 저장된 해당 이름의 회원정보를 검색하여 검색결과를  
	제공하는 엘리먼트 -->
	<select id="selectNameHewonList" parameterType="string" resultMap="myHewonResultMap">
		select * from myhewon where hewon_name=#{name} order by hewon_id
	</select>
	
	<!-- 동적 SQL(Dynamic SQL) : 전달값에 따라 다른 SQL 명령이 엘리먼트에 등록되는 기능 -->
	<!-- => OGNL(Object Graph Navigation Language) 표현식을 사용하여 구현 -->
	
	<!-- 이름을 전달받지 않을 경우 MYHEWON 테이블에 저장된 모든 회원정보를 검색하고 이름을 전달받은
	경우 MYHEWON 테이블에 저장된 해당 이름의 회원정보를 검색하여 검색결과를 제공하는 엘리먼트 -->
	<!-- => 동적 SQL 관련 엘리먼트를 사용하여 전달값에 따라 SQL 명령이 다르게 등록되도록 설정 -->
	<select id="selectDynamicNameHewonList" parameterType="string" resultMap="myHewonResultMap">
		select * from myhewon
		<!-- if : 조건에 의해 엘리먼트 내용(SQL 명령을 구성하는 문장)의 포함여부를 설정하는 엘리먼트 -->
		<!-- => if 엘리먼트의 조건이 참인 경우 엘리먼트 내용을 SQL 명령에 포함 -->
		<!-- test 속성 : false(엘리먼트 내용 미포함) 또는 true(엘리먼트 내용 포함) 중 하나를 속성값으로 설정 -->
		<!-- => parameterType 속성으로 전달된 값에 대한 조건식을 사용하여 test 속성값으로 제공 -->
		<if test="name!=null and name!=''"><!-- 전달값(이름)이 있는 경우 >> [true] -->
			where hewon_name=#{name}
		</if> 
		order by hewon_id
	</select>
	
	<!-- 아이디 또는 이름을 전달받지 않은 경우 MYHEWON 테이블에 저장된 모든 회원정보를 검색하고
	아이디 또는 이름을 전달받은 경우  MYHEWON 테이블에 저장된 회원정보 중 해당 아이디 또는
	이름의 회원정보를 검색하여 검색결과를 제공하는 엘리먼트 -->
	<!-- 문제점)아이디와 이름이 모두 전달된 경우 에러 발생 -->
	<!-- => 모든 if 엘리먼트의 test 속성값이 [true]이므로 WHERE 문장이 2번 포함 -->
	<!--  
	<select id="selectDynamicHewonList" parameterType="map" resultMap="myHewonResultMap">
		select * from myhewon
		<if test="id!=null and id!=''">
			where hewon_id=#{id}
		</if>
		<if test="name!=null and name!=''">
			where hewon_name=#{name}
		</if>
		order by hewon_id
	</select>
	-->
	
	<!-- 해결법-1)아이디와 이름이 모두 전달돼도 하나의 WHERE 문장만 포함되도록 설정 -->
	<!-- choose : 조건에 맞는 하나의 엘리먼트 내용(SQL 명령을 구성하는 문장)이 포함되도록 설정하는 엘리먼트 -->
	<!-- => 하위 엘리먼트 : when 엘리먼트(1개 이상), otherwise 엘리먼트(0개 또는 1개) -->
	<!-- => 다수의 하위 엘리먼트 중 하나의 엘리먼트 내용만 SQL 명령에 포함 -->
	<!-- when : 조건에 의한 엘리먼트 내용 포함여부를 설정하는 엘리먼트 -->
	<!-- test 속성 : false(엘리먼트 내용 미포함) 또는 true(엘리먼트 내용 포함) 중 하나를 속성값으로 설정 -->
	<!-- otherwise : when 엘리먼트의 모든 조건이 거짓인 경우 엘리먼트 내용을 SQL 명령에 포함하는 엘리먼트 -->
	<!--  
	<select id="selectDynamicHewonList" parameterType="map" resultMap="myHewonResultMap">
		select * from myhewon
		<choose>
			<when test="id!=null and id!=''">
				where hewon_id=#{id}
			</when>
			<when test="name!=null and name!=''">
				where hewon_name=#{name}
			</when>
		</choose>
		order by hewon_id
	</select>
	-->
	
	<!-- 해결법-2)아이디와 이름이 모두 전달된 경우 하나의 WHERE 문장에 포함되도록 설정  -->
	<!-- trim : 엘리먼트 내용에 필요한 값을 추가하거나 삭제하여 SQL 명령에 포함하는 엘리먼트 --> 
	<!-- => 하위 엘리먼트로 다수의 if 엘리먼트 사용 -->
	<!-- prefix 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 앞에 추가될 문장을 속성값으로 설정 -->
	<!-- prefixOverrides 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 앞에 제거될 문장을 속성값으로 설정 -->
	<!-- suffix 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 뒤에 추가될 문장을 속성값으로 설정 -->
	<!-- suffixOverrides 속성 : trim 엘리먼트에 엘리먼트 내용이 존재할 경우 엘리먼트 내용 뒤에 제거될 문장을 속성값으로 설정 -->
	<!--  
	<select id="selectDynamicHewonList" parameterType="map" resultMap="myHewonResultMap">
		select * from myhewon
		<trim prefix="where" prefixOverrides="and|or">
			<if test="id!=null and id!=''">
				hewon_id=#{id}
			</if>
			<if test="name!=null and name!=''">
				${choice} hewon_name=#{name}
			</if>
		</trim>
		order by hewon_id
	</select>
	-->
	
	<!-- where : 엘리먼트 내용이 존재할 경우 엘리먼트 내용 앞에 [and] 또는 [or] 키워드가 
	있으면 삭제하고 [where] 키워드를 추가하여 SQL 명령에 포함하는 엘리먼트 -->
	<!-- => 하위 엘리먼트로 다수의 if 엘리먼트 사용 -->
	<select id="selectDynamicHewonList" parameterType="map" resultMap="myHewonResultMap">
		select * from myhewon
		<where>
			<if test="id!=null and id!=''">
				hewon_id=#{id}
			</if>
			<if test="name!=null and name!=''">
				${choice} hewon_name=#{name}
			</if>
		</where>
		order by hewon_id
	</select>
	
	<!-- 회원정보를 전달받아 MYHEWON 테이블에 저장된 회원정보를 변경하는 엘리먼트 -->
	<!-- => 아이디를 비교하여 아이디를 제외한 모든 회원정보 변경 -->
	<update id="updateHewon" parameterType="MyHewon">
		update myhewon set hewon_name=#{name},hewon_phone=#{phone},hewon_email=#{email}
			,hewon_state=#{state} where hewon_id=#{id}
	</update>
	
	<!-- 회원정보를 전달받아 MYHEWON 테이블에 저장된 회원정보를 변경하는 엘리먼트 -->
	<!-- => 아이디를 비교하여 아이디를 제외한 전달값이 존재하는 회원정보 변경 -->
	<!-- test 속성값에서 관계연산자를 기호(>,<,>=,<=) 대신 문자(gt,lt,gte,lte)로 표현하여 사용  -->
	<!-- => 관계연산자를 기호로 사용한 경우 에러 발생 -->
	<!--  
	<update id="updateDynamicHewon" parameterType="MyHewon">
		update myhewon 
		<trim prefix="set" suffixOverrides=",">
			<if test="name!=null and name!=''">
				hewon_name=#{name},
			</if>
			<if test="phone!=null and phone!=''">
				hewon_phone=#{phone},
			</if>
			<if test="email!=null and email!=''">
				hewon_email=#{email},
			</if>
			<if test="state gte 1 and state lte 4">
				hewon_state=#{state}
			</if>
		</trim>
		where hewon_id=#{id}
	</update>
	-->
	
	<!-- set : 엘리먼트 내용이 존재할 경우 엘리먼트 내용 뒤에 [,]가 있으면 삭제하고 
	엘리먼트 내용 앞에 [set] 키워드를 추가하여 SQL 명령에 포함하는 엘리먼트 -->
	<!-- => 하위 엘리먼트로 다수의 if 엘리먼트 사용 -->
	<update id="updateDynamicHewon" parameterType="MyHewon">
		update myhewon 
		<set>
			<if test="name!=null and name!=''">
				hewon_name=#{name},
			</if>
			<if test="phone!=null and phone!=''">
				hewon_phone=#{phone},
			</if>
			<if test="email!=null and email!=''">
				hewon_email=#{email},
			</if>
			<if test="state gte 1 and state lte 4">
				hewon_state=#{state}
			</if>
		</set>
		where hewon_id=#{id}
	</update>
	
	<!-- 아이디 목록을 전달받아 MYHEWON 테이블에 저장된 해당 아이디의 회원정보를 검색하여
	검색결과를 제공하는 엘리먼트 -->
	<!-- => 아이디 목록을 전달받지 못한 경우 MYHEWON 테이블에 저장된 모든 회원정보 검색 -->
	<!-- parameterType 속성값으로 ArrayList 클래스(List 인터페이스)를 설정하여 아이디 목록을  
	List 객체로 제공받아 사용 -->
	<!-- => parameterType 속성값으로 ArrayList 클래스(List 인터페이스)를 설정한 경우 List 객체를
	전달받아 SQL명령에서 [list] 이름으로 표현하여 사용 -->
	<select id="selectMultiDynamicHewonList" parameterType="list" resultMap="myHewonResultMap">
		select * from myhewon
		<if test="list!=null">
			where hewon_id in
			<!-- foreach : 전달받은 List 객체의 요소값을 반복적으로 제공받아 SQL 명령에 포함하는 엘리먼트 -->
			<!-- collection 속성 : 반복 처리하기 위한 List 객체의 이름을 속성값으로 설정 -->
			<!-- item 속성 : List 객체의 요소값을 저장하기 위한 이름을 속성값으로 설정 -->
			<!-- open 속성 : foreach 엘리먼트의 내용 앞부분에 추가될 문장을 속성값으로 설정 -->
			<!-- close 속성 : foreach 엘리먼트의 내용 뒷부분에 추가될 문장을 속성값으로 설정 -->
			<!-- separator 속성 : List 객체의 요소값을 구분하기 위한 문장을 속성값으로 설정 -->
			<foreach collection="list" item="id" open="(" close=")" separator=",">
				#{id}
			</foreach>
		</if>
		order by hewon_id
	</select>
</mapper>

MyHewonMapper.java (@Param)

package xyz.itwill.mapper;

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

import org.apache.ibatis.annotations.Param;

import xyz.itwill.dto.MyHewon;

public interface MyHewonMapper {
	int insertHewon(MyHewon hewon);
	List<MyHewon> selectHewonList();
	List<MyHewon> selectDiscriminatorHewonList();
	List<MyHewon> selectStateHewonList(int state);
	String selectBeanHewonId(MyHewon hewon);
	//HashMap 클래스(Map 인터페이스)의 제네릭은 맵키를 [String]으로 설정하고 맵값은 [Object]로 설정하여 사용
	String selectMapHewonId(Map<String, Object> map);
	int insertMapHewon(Map<String, Object> map);
	List<Map<String, Object>> selectMapHewonList();
	//@Param : 추상메소드의 매개변수에 저장된 값을 XML 기반의 맵퍼파일에 엘리먼트에게 전달하여
	//등록된 SQL 명령에서 사용할 수 있도록 제공하는 어노테이션
	//value 속성 : 추상메소드의 매개변수에 저장된 값을 XML 기반의 매퍼파일의 엘리먼트에 등록된
	//SQL 명령에서 사용하기 식별자를 속성값으로 설정
	// => 다른 속성이 없는 경우 속성값만 설정 가능
	String selectParamHewonId(@Param(value = "name") String name,@Param("email") String email);
	List<MyHewon> selectSearchHewonList(Map<String, Object> map);
	List<MyHewon> selectNameHewonList(String name);
	List<MyHewon> selectDynamicNameHewonList(String name);
	List<MyHewon> selectDynamicHewonList(Map<String, Object> map);
	int updateHewon(MyHewon hewon);
	int updateDynamicHewon(MyHewon hewon);
	List<MyHewon> selectMultiDynamicHewonList(List<String> idList);
}

MyHewonInterfaceMapper.java(어노테이션 활용)

package xyz.itwill.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectProvider;

import xyz.itwill.dto.MyHewon;

//mybatis 프레임워크는 인터페이스만 이용하여 매퍼 설정 가능
// => 추상메소드에 매퍼 어노테이션(Mapper Annotation)을 사용하여 SQL 명령 등록
public interface MyHewonInterfaceMapper {
	//추상메소드에 등록된 SELECT 명령은 기본적으로 검색결과를 자동 매핑처리하여 제공
	// => 검색결과를 자동 매핑하기 위해서는 검색행의 컬럼명과 Java 클래스의 필드명이 반드시 동일
	// => 검색행의 컬럼명과 Java 클래스의 필드명이 하나도 같지 않으면 Java 객체 대신 NULL 제공
	//@Results : 검색행의 컬럼값을 Java 객체의 필드값으로 저장되도록 매핑 처리하는 정보를 제공하는 어노테이션
	// => XML 기반의 매퍼 파일에서 resultMap 엘리먼트와 유사한 기능을 제공
	// => 매핑 정보에 대한 재사용 불가능 - 유지보수의 효율성 감소
	//value 속성 : 매핑정보를 제공하는 @Result 어노테이션 배열을 속성값으로 설정
	// => 다른 속성이 없는 경우 속성값만 설정 가능
	@Results(value = {
		//@Result : 검색행의 컬럼값이 Java 객체 필드에 저장되도록 설정하는 어노테이션
		// => XML 기반의 매퍼 파일에서 id(result) 엘리먼트와 유사한 기능을 제공
		//column 속성 : 검색행의 컬럼명을 속성값으로 설정
		//property 속성 : 검색행의 컬럼값이 저장될 Java 클래스의 필드명을 속성값으로 설정
		@Result(column = "hewon_id", property = "id")
		,@Result(column = "hewon_name", property = "name")
		,@Result(column = "hewon_phone", property = "phone")
		,@Result(column = "hewon_email", property = "email")
		,@Result(column = "hewon_state", property = "state")
	})
	@Select(value = "select * from myhewon order by hewon_id")
	List<MyHewon> selectHewonList();

	@Results({
		@Result(column = "hewon_id", property = "id")
		,@Result(column = "hewon_name", property = "name")
		,@Result(column = "hewon_phone", property = "phone")
		,@Result(column = "hewon_email", property = "email")
		,@Result(column = "hewon_state", property = "state")
	})
	@Select("select * from myhewon where hewon_name=#{name} order by hewon_id")
	List<MyHewon> selectNameHewonList(String name);
	
	/*
	@Results({
		@Result(column = "hewon_id", property = "id")
		,@Result(column = "hewon_name", property = "name")
		,@Result(column = "hewon_phone", property = "phone")
		,@Result(column = "hewon_email", property = "email")
		,@Result(column = "hewon_state", property = "state")
	})
	//@SelectProvider : SQL Builder 클래스의 메소드를 호출하여 SELECT 명령을 반환받아 등록하는 어노테이션
	// => 동적 SQL 기능을 사용하기 위한 어노테이션
	//SQL Builder 클래스 : SQL 객체를 생성하여 메소드를 호출해 SQL 명령을 작성하고 객체에 저장된 
	//SQL 명령을 반환하는 기능을 제공하는 클래스
	//type 속성 : SQL Builder 관련 클래스(Class 객체 - Clazz)를 속성값으로 설정
	//method 속성 : SQL 객체를 생성하여 SQL 명령을 작성해 반환하는 메소드의 이름을 속성값으로 설정
	@SelectProvider(type = MyHewonProvider.class, method = "selectDynamicName")
	List<MyHewon> selectDynamicHewonList(String name);
	*/
	
	@Results({
		@Result(column = "hewon_id", property = "id")
		,@Result(column = "hewon_name", property = "name")
		,@Result(column = "hewon_phone", property = "phone")
		,@Result(column = "hewon_email", property = "email")
		,@Result(column = "hewon_state", property = "state")
	})
	//@Select 어노테이션의 value 속성값으로 script 엘리먼트를 사용하면 SQL 명령 작성시 동적 
	//SQL 관련 엘리먼트 사용 가능
	// => value 속성값으로 배열을 설정하여 SQL 명령을 순차적으로 작성 가능 
	@Select({"<script>select * from myhewon"
			," <if test=\"name!=null and name!=''\">where hewon_name=#{name}</if>"
			," order by hewon_id</script>"})
	List<MyHewon> selectDynamicHewonList(String name);
}

MyHewonProvider.java (Provider 클래스(SQL Builder 클래스))

package xyz.itwill.mapper;

import org.apache.ibatis.jdbc.SQL;

//Provider 클래스(SQL Builder 클래스) : SQL 명령을 반환하는 메소드가 선언된 클래스
public class MyHewonProvider {
	//Java 명령으로 동적 SQL 기능이 구현된 SQL 명령을 반환하는 메소드
	public String selectDynamicName(String name) {
		//SQL 객체 : SQL 명령 작성에 필요한 메소드를 호출하여 SQL 명령을 저장하기 위한 객체
		//SQL.toString() : SQL 객체에 저장된 SQL 명령을 문자열(String 객체)로 변환하여 반환하는 메소드 
		return new SQL() {{
			SELECT("*");
			FROM("myhewon");
			if(name!=null && !name.equals("")) {
				WHERE("hewon_name=#{name}");
			}
			ORDER_BY("hewon_id");
		}}.toString();
	}
}

0개의 댓글