반응형
### 파일수정 ###
파일명 : mybatis-config.xml
아래 사항을 추가합니다.
<setting name="mapUnderscoreToCamelCase" value="true"/>
데이터베이스 칼럼명 형태인 A_COLUMN을 CamelCase 형태의 자바 프로퍼티명 형태인 aColumn으로 자동으로 매핑하도록 함 (default false)
<?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>
<settings>
<setting name="cacheEnabled" value="false" /> <!-- 설정에서 각 매퍼에 설정된 캐시를 전역적으로 사용할지 말지에 대한 여부 (default true)-->
<!-- <setting name="lazyLoadingEnabled" value="true" /> --> <!-- 지연로딩을 사용할지에 대한 여부. 사용하지 않는다면 모두 즉시 로딩 (default true) -->
<!-- <setting name="multipleResultSetsEnabled" value="true" /> --> <!-- 한개의 구문에서 여러개의 ResultSet을 허용할지의 여부 (default true) -->
<setting name="defaultExecutorType" value="SIMPLE" /> <!-- 디폴트 실행자(executor) 설정. PreparedStatement를 재사용 하고 수정을 배치 처리 (default SIMPLE)-->
<setting name="defaultStatementTimeout" value="600" /> <!-- 데이터베이스로의 응답을 얼마나 오래 기다릴지를 판단하는 타임아웃(초)를 설정 -->
<setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 데이터베이스 칼럼명 형태인 A_COLUMN을 CamelCase 형태의 자바 프로퍼티명 형태인 aColumn으로 자동으로 매핑하도록 함 (default false) -->
<setting name="logImpl" value="NO_LOGGING" /> <!-- 마이바티스가 사용할 로깅 구현체를 명시. 이 설정을 사용하지 않으면 마이바티스가 사용할 로깅 구현체를 자동으로 찾는다. -->
<setting name="jdbcTypeForNull" value="NULL"/> <!-- JDBC 타입을 파라미터에 제공하지 않을 때 null 값을 처리한 JDBC 타입을 명시 -->
<setting name="callSettersOnNulls" value="true"/> <!-- 가져온 값이 null일때 setter나 맵의 put 메소드를 호출할지를 명시 (default false) -->
</settings>
<typeAliases>
<typeAlias alias="hsMap" type="com.mall.batch.biz.persistence.domain.shop.HsMap" />
</typeAliases>
</configuration>
위 hsMap의 클래스 입니다. 물론 위치도 맞춰주셔야합니다.!!
package mallAdmin.framework.dataaccess.util;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.LinkedHashMap;
public class HsMap extends LinkedHashMap {
/**
* DB에서 resultSet을 구성시 AA_BB_CC등의 컬럼명을 카멜 표기법(aaBbCc)에 맞게 변환한다.
*/
@Override
public Object put(Object key, Object value) {
return super.put(DataUtil.convert2CamelCase((String) key), value);
}
public String getString(Object key) {
Object obj = super.get(key);
return obj == null ? "" : obj.toString();
}
public int getInt(Object key) {
Object obj = super.get(key);
if (obj == null) {
return 0;
} else {
Class<? extends Object> classType = obj.getClass();
if (classType != Integer.class && classType != BigInteger.class) {
if (classType == Short.class) {
return (Short) obj;
} else {
if (classType == String.class || classType == BigDecimal.class) {
try {
return Integer.parseInt(obj.toString());
} catch (NumberFormatException var5) {
System.out.println("GagaMap key(" + key + ")"
+ "'s type(int) does not match : It's type is not double.");
}
}
System.out.println("GagaMap value's type(int) does not match : It's type is not int.");
return 0;
}
} else {
return (Integer) obj;
}
}
}
}
DateUtil.java
위 hsmap을 이용하기 위한 클래스를 추가합니다.
package com.wivismall.batch.biz.persistence.domain.shop;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class DataUtil {
/**
* underscore ('_') 가 포함되어 있는 문자열을 Camel Case ( 낙타등
* 표기법 - 단어의 변경시에 대문자로 시작하는 형태. 시작은 소문자) 로 변환해주는
* utility 메서드 ('_' 가 나타나지 않고 첫문자가 대문자인 경우도 변환 처리
* 함.)
* @param underScore
* - '_' 가 포함된 변수명
* @return Camel 표기법 변수명
*/
public static String convert2CamelCase(String underScore) {
// '_' 가 나타나지 않으면 이미 camel case 로 가정함.
// 단 첫째문자가 대문자이면 camel case 변환 (전체를 소문자로) 처리가
// 필요하다고 가정함. --> 아래 로직을 수행하면 바뀜
if (underScore.indexOf('_') < 0 && Character.isLowerCase(underScore.charAt(0))) {
return underScore;
}
StringBuilder result = new StringBuilder();
boolean nextUpper = false;
int len = underScore.length();
for (int i = 0; i < len; i++) {
char currentChar = underScore.charAt(i);
if (currentChar == '_') {
nextUpper = true;
} else {
if (nextUpper) {
result.append(Character.toUpperCase(currentChar));
nextUpper = false;
} else {
result.append(Character.toLowerCase(currentChar));
}
}
}
return result.toString();
}
public static HsMap convertMap2HsMap(Map map) {
HsMap hsMap = new HsMap();
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
Object value = map.get(key);
hsMap.put(key, value);
}
return hsMap;
}
}
조회시 resultType="hsMap" 으로 수정.
<!-- 조회 -->
<select id="getRefindAddrTgtList" parameterType="hsMap" resultType="hsMap">
<![CDATA[
/* WbaLogen.getRefindAddrTgtList */
SELECT OD.SHPMALL_SITE_CD
, OD.DELV_ADDR_SQ
, DA.RECIP_BASE_ADDR
, DA.RECIP_DTL_ADDR
, REGEXP_REPLACE(REGEXP_REPLACE(FN_GET_ADDRESS(DA.RECIP_BASE_ADDR || ' ' || DA.RECIP_DTL_ADDR, 'BASE'), '[_ㅡ&]', ' '),' +',' ') AS BASE_ADDR
, REGEXP_REPLACE(REGEXP_REPLACE(FN_GET_ADDRESS(DA.RECIP_BASE_ADDR || ' ' || DA.RECIP_DTL_ADDR, 'DETAIL'), '[_ㅡ&]', ' '),' +',' ') AS DTL_ADDR
, REGEXP_REPLACE(REGEXP_REPLACE(FN_GET_ADDRESS(DA.RECIP_BASE_ADDR || ' ' || DA.RECIP_DTL_ADDR, 'BASE') || ' ' || FN_GET_ADDRESS(DA.RECIP_BASE_ADDR || ' ' || DA.RECIP_DTL_ADDR, 'DETAIL'), '[_ㅡ&]', ' '),' +',' ') AS STR_ADDR
, PKG_CRYPTO.FN_DECRYPT(DA.RECIP_PHNNO) AS RECIP_PHNNO
, PKG_CRYPTO.FN_DECRYPT(DA.RECIP_TELNO) AS RECIP_TELNO
, DA.RECIP_VIR_PHNNO
, DA.RECIP_VIR_TELNO
FROM TB_ORDER_DETAIL OD
, TB_ORDER O
, TB_DELIVERY_ADDR DA
, TB_POST_LOGEN PL
WHERE 1=1
AND OD.SHPMALL_SITE_CD = O.SHPMALL_SITE_CD
AND OD.ORD_NO = O.ORD_NO
AND OD.SHPMALL_SITE_CD = DA.SHPMALL_SITE_CD
AND OD.DELV_ADDR_SQ = DA.DELV_ADDR_SQ
AND DA.SHPMALL_SITE_CD = PL.SHPMALL_SITE_CD(+)
AND DA.DELV_ADDR_SQ = PL.DELV_ADDR_SQ(+)
AND O.ORD_DT BETWEEN SYSDATE-10 AND TRUNC(SYSDATE)+0.99999
AND OD.SHPMALL_SITE_CD = #{shpmallSiteCd}
AND NOT EXISTS (
SELECT *
FROM TB_POST_LOGEN PL
WHERE PL.SHPMALL_SITE_CD = OD.SHPMALL_SITE_CD
AND PL.DELV_ADDR_SQ = OD.DELV_ADDR_SQ
)
]]>
</select>
DAO.java 에서는 아래와 같이 HsMap으로 받아줍니다.
Collection<HsMap> getRefindAddrTgtList(Map delv);
끝~
반응형
'Framework > Mybatis' 카테고리의 다른 글
[Mybatis] 오류 처리시 RootCause의 ORA 코드 확인 및 메세지 출력처리. (0) | 2024.10.25 |
---|---|
[Mybatis] 파라미터 foreach + split 처리하기. (0) | 2024.04.30 |