별짓을 해도 안되던 마이바티스 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를 되돌려 준다.
}