별짓을 해도 안되던 마이바티스 CLOB select

별짓을 해도 안되던 마이바티스 CLOB select

 

어제와 오늘 거의 10시간은 투자한 것 같다. 오라클 11g와 마이바티스3에서는, String을 CLOB으로 Insert하는데는 문제가 없지만, CLOB을 String으로 Select해올 때 null로 받아오는 문제가 있다.

 

구글의 미국/중국인들, 한국 프로그래머들을 통해 방법을 찾았지만 우선 11g를 쓰는 사람이 드물어서 환경이 맞지 않았고, 쿼리 사용시 어노테이션이 아닌 xml을 파싱하는 프로그래머가 대다수라 소스 구하기가 힘들었다.

 

마지막에 찾아낸 바로는

 

<typeHandlers>
    <typeHandler javaType=”java.lang.String” jdbcType=”CLOB” handler=”org.apache.ibatis.type.ClobTypeHandler”/>
</typeHandlers>

 

가 정석이지만 되지가 않고,

 

@Results({

   @Result(column=”content”,property=”content”,jdbcType=JdbcType.CLOB,javaType=HashMap.class,

               typeHandler=org.apache.ibatis.type.ClobTypeHandler.class)

})

 

도 되지 않았다.

 

결국 CLOB째로 받아다가 처리하는걸로 생각을 바꿨다.

 

————————————————————————————

1. Object 형으로 칼럼을 SELECT 해온다.

 

 @Select(“SELECT content FROM mvcBoard WHERE no=#{no}”)
 public Object boardContentData2(@Param(“no”) int no);

 

//content 칼럼을 받는다. 이때 반환형은 Object로 받았다.

 

————————————————————————————-

2. CLOB을 String으로 변환해주는 클래스를 만든다.

 

package com.board.dao;
import java.io.IOException;
import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.SQLException;

import oracle.sql.CLOB;
public class som {

   public static String extractClob(CLOB clob) throws SQLException {

   final int length = (int) ((CLOB)clob).length();
   final char [] buffer = new char [length];
   int charactersRead;
   try {
    charactersRead = clob.getCharacterStream().read(buffer, 0, length);
   } catch (IOException e) {
    throw new RuntimeException(“CLOB를 읽는데 문제가 발생했습니다:”,e);
   }
   return new String(buffer,0,charactersRead);
  }
}

 

——————————————————————————————-

3. DAO에서 처리한다.

 

 public static BoardVO boardContentData(int no){

  BoardVO vo=new BoardVO(); //데이터를 저장할 공간을 확보한다(VO).
  vo = mMapper.boardContentData(no); //게시물 전체를 가져오는 쿼리를 실행한다.
  
  Object obj=mMapper.boardContentData2(no); //Object 형으로 content칼럼을 얻어오는 쿼리를 실행한다.

  String temp=””;
  try {

          temp=som.extractClob((CLOB)obj); //CLOB을 스트링으로 변환해서 temp변수에 담는다.
  }catch (SQLException ex) {System.out.println(ex+”d”);}
  
  vo.setContent(temp); //temp변수를 vo에 싣는다.
  
  return vo; //vo를 되돌려 준다.
 }