[post05] Mapper sample

Updated:

SqlMap

context-mybatis.xml

  • datasource 관련된 내용과 sqlSessionFactory, sqlSessionTemplate 에 관한 설정을 한다.
  • 실제 쿼리가 담겨있는 xml파일의 위치와 typeAlias 로 설정된 model 클래스 정보가 들어있다.
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="configLocation" value="classpath:/META-INF/sqlmap/sql-mapper-config.xml"/><property name="mapperLocation">
                <list>
                       <value> classpath*:/META-INF/sqlmap/mapper/**/*.xml</value>
                </list> 
      </property>
      
      <property name="dataSource" ref="dataSource"/>
      
      <property name="plugins">
                <list>
                       <bean class="yhshin.framework.mybatis.MybatisRowboundsInterceptor">
                             <property name="dbType" value="oracle" />
                       </bean>
                </list>
      </property>
</bean>

1) 쿼리 매핑을 하기 위 XML파일을 검색하여 해서 자동으로 추가하도록 설정하는 역할.

sql-mapper-config.xml

<configuration>
  <settings>
    <setting name="jdbcTypeForNull" value="VARCHAR"/>
    <setting name="mapUnderscoreToCamelCase" value="true" />
    <setting name="cacheEnabled" value="true" />
    <setting name="defaultExecutorType" value="REUSE" />
    <setting name="callSettersOnNulls" value="true" />
  </settings><typeAliases>
     <typeAlias alias="egovMap" type="egovframework.rte.psl.dataaccess.util.EgovMap"/>
     <typeAlias alias="yhshinMap" type="yhshin.framework.mybatis.YhsinMap"/>
  </typeAliases>
</configuration>

1) resultType으로 사용하기 위한 Map의 alias 지정 작업.

선언부

<?xml sersion="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="yhshin.julie.post.projectEx.PgManateMapper">

1) namespace 선언 : 프로젝트 내의 명명규칙에 따라 구성한다.

select 문

<select id="selectPgList"  parameterType="Map"  resultType="yhshinMap" >
        SELECT * 
          FROM DUAL
</select> 

1) queryId는 Service에서 호출하는 명칭과 동일하게 구성되어야 한다.
2) parameterType은 Map 으로 사용 : Service단에서 List 형태를 for문을 사용해서 Map형태로 꺼냈기 때문에.
3) resultType은 EgovMap을 상속받은 YhshinMap을 사용(sql-mapper-config.xml에 typeAlias로 지정해야 가능함)

insert/update/delete 문

<insert id="insertPgManage" parameterType="java.util.Map">
       INSERT 
         INTO TABLE_NAME 
         (  COL1
          , COL2
          , COL3
         )
         VALUES
         (  #{col1}
          , #{col2}
          , #{col3}
         )
</insert>
<update id="updatePgManage" parameterType="java.util.Map">
        UPDATE TABLE_NAME
           SET COL1 = #{col1}
              ,COL2 = #{col2}
         WHERE COL3 = #{col3}
</update>
<delete id="deletePgManage" parameterType="java.util.Map">
        DELETE 
          FROM TABLE_NAME
</delete>

Sql Batch 처리(insert/update/delete Batch 문)

<insert id="insertPgBatch" parameterType="java.util.List"><foreach collection="List" item="item" index="index" separator=" " open="INSERT ALL" close="SELECT * FROM DUAL">
        INTO TABEL_NAME
        (  COL1
          , COL2
          , COL3
         )
         VALUES
         (  #{item.col1}
          , #{item.col2}
          , #{item.col3}
         )
     </foreach>
</insert>

1) foreach 문 구성

  • collection : Service 단에서 전달받은 인자(List OR Array 형태만 가능)
  • item : 전달받은 인자 값을 alias 명 지정
  • index : 반복되는 구문 번호(0부터 오름차순으로 증가)
  • open : 해당 구문이 시작 될 때 삽입 할 문자열
  • close : 해당 구문이 종료될 때 삽일 할 문자열
  • separator : 반복되는 사이에 출력 할 문자열

if 제어문

if test=”조건” 문이 true 이면 태그 안의 쿼리문이 실행된다.

<select id="selectMyPgList" parameterType="Map" resultType="yhshinMap">
         SELECT A.PROGRAM_ID    /*프로그램ID*/
              , A.PROGRAM_NM    /*프로그램NM*/
           FROM T_TABLE_AAA A
              , T_TABLE_BBB B
          WHERE A.PROGRAM_ID = B.PROGRAM_ID
            
            AND A.PROGRAM_SE = '01'
            AND A.PROGRAM_CODE = #{programCode}
            
            AND B.PROGRAM_NO IN ('001', '002')
            
            <if test="programNm != '' and programNm != null">
                AND A.PROGRAM_NM LIKE '%'||#{programNm}||'%' 
            </if>
</select>

choose 제어문

  • when 태그와 otherwise 태그를 제공
  • when 태그 : <when 변수명 == “조건”> 이 true일때 실행 (해당 조건의 쿼리문이 실행되면, 다른 문이나 문은 실행되지 않음)
  • otherwise 태그 : 모든 태그의 조건이 만족하지 않을때 실행
<select id="selectMyPgList parameterType="Map" resultType="java.lang.String">
        SELECT LPAD(MAX(PROGRAM_ID) + #{programCnt}, 6, '0') AS PROGRAM_ID
          FROM T_TABLE_AAA
         WHERE PROGRAM_CODE = #{programCode}
         
         <choose>
                  <when test="programCode != null and programCode == '01'
                         AND PROGRAM_ID = '1'
                  </when>
                  <when test="programCode != null and programCode == '02'
                         AND PROGRAM_ID = '2'
                  </when>
                  <when test="programCode != null and programCode == '03'
                         AND PROGRAM_ID = '3'
                  </when>
                  <otherwise>
                         AND PROGRAM_ID = '99'
                  </otherwise>
         </choose>
</select>

CLOB/BLOB 데이터 처리

  • SELECT 문에서는 프로젝트 내의 Map에서 Byte[]형태로 자동 변경되었음.(어떤 방법인지 알아봐야겠다.)
  • INSERT, UPDATE문에서는 JdbcType을 설정해주어야 한다.

#{clobDesc:CLOB} 또는 #{blobDesc:BLOB}

Categories:

Updated:

Comments