SSISO Community

시소당

ibatis에서 oracle 데이타타입 clob 저장 문제 해결

ibatis에서 oracle 데이타타입 clob 저장 문제 해결

오늘 oracle 사이트에서 Oracle Database 10g Releage 2(10.2.0.3) JDBC Drivers 중 ojdbc14.jar(1,540,457 bytes)를 다운받았다. 기존에 쓰던게 ojdbc14-g.jar였는데 1,352KB였다.

[ 테스트 환경 ]
oracle ver. : 8.1.7.4

data source type : DBCP

ibatis ver. : 2.3.0

1. 아래와 같이 TempClob DO를 만든다.

public class TempClob
{
    private String userName;
    private String userDesc;

    public String getUserDesc()
    {
        return userDesc;
    }
    public void setUserDesc(String userDesc)
    {
        this.userDesc = userDesc;
    }
    public String getUserName()
    {
        return userName;
    }
    public void setUserName(String userName)
    {
        this.userName = userName;
    }
}

2. sql을 아래와 같이 만든다. insert할때는 parameterMap을 사용하지 않고 class를 그대로 사용한다.(update도 마찬가지다)

<insert id="insert" parameterClass="TempClob">
    <![CDATA[
    INSERT INTO TEMP_CLOB
        (USER_NM, USER_DESC)
    VALUES
        (#userName#, #userDesc#)
    ]]>
</insert>

<resultMap id="result-temp" class="TempClob">
    <result property="userName" column="USER_NM" />
    <result property="userDesc" column="USER_DESC" typeHandler="oracleClobTypeHandler" />
</resultMap>
<select id="getInfo" parameterClass="String" resultMap="result-temp">
    <![CDATA[
    SELECT
        USER_NM,
        USER_DESC
    FROM
        TEMP_CLOB
    WHERE
        USER_NM = #userName#
    ]]>
</select>

3. 사용자 정의 typeHandler  oracleClobTypeHandler 는 http://openframework.or.kr/JSPWiki/Wiki.jsp?page=IbatisOracleclobtypehandler 를 참조해서 만들면 된다.

 

참고) ojdbc14-g.jar 를 사용했을 때 아래와 같은 에러 메시지가 나왔습니다.Caused by: java.sql.SQLException: 데이터 크기가 해당 유형의 최대 크기보다 큽니다: 6400



덧) 테스트 결과 select도 resultMap을 사용하지 않고 resultClass에다 바로 담아도 된다.

 

 


http://cafe.naver.com/deve/1046

public class OracleCLOBTypeHandler implements TypeHandlerCallback {

    public void setParameter(ParameterSetter setter, Object paramthrows SQLException {

        try {
            setter.setClob((Clobparam);
        catch (SQLException e) {
            if (log.isErrorEnabled())
                log.error("Failed to set CLOB parameter");
            throw e;
        }
    }


    public Object getResult(ResultGetter getterthrows SQLException {

        Clob clob = null;
        try {
            clob = getter.getClob();
        catch (SQLException e) {
            if (log.isErrorEnabled())
                log.error("Failed to set CLOB result property");
            throw e;
        }

        return clob;
    }

    public Object valueOf(String arg0) {

        return arg0;
    }

}

====> SQLMap (essay 빈의 content 속성이 CLOB 타입으로 정하고...)

<resultMap id="xmlRslt" class="essay">
    <result property="content" column="content" typeHandler="OracleCLOBTypeHandler"/>
</resultMap>

<statement id="getXMLData" resultMap="xmlRslt">
    select content from essay
</statement>

====> CLOB의 데이터를 문자열로 변환하는 메소드.

public static String getStringForCLOB(CLOB clob) {
        String str = "";
        StringBuffer sbf = new StringBuffer();
        Reader br = null;
        char[] buf = new char[1024];
        int readcnt;

        try {
            br = clob.getCharacterStream(0L);

            while ((readcnt=br.read(buf,0,1024))!=-1) {
                sbf.append(buf,0,readcnt);
            }

        catch (Exception e) {
            if (log.isErrorEnabled())
                 log.error("Failed to create String object from CLOB", e);

        }finally{
            if(br!=null)
                try {
                    br.close();
                catch (IOException e) {
                    if (log.isErrorEnabled())
                        log.error("Failed to close BufferedReader object", e);

               }
        }
        return sbf.toString();
    

6129 view

4.0 stars