<?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>
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);
}
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);
}
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();
}
}