2017-05-16 11 views

답변

0

자신 만의 TypeHandler을 만들어야합니다. 공식 문서에서 설명하는 방법은 type handler입니다.

왜? MyBatis로는 PreparedStatement로 매개 변수를 설정 또는 는 ResultSet으로부터 값을 검색 할 때마다

을하는 TypeHandler 자바 유형에 적합한 수단에 값을 검색하는 데 사용된다. 다음 표는 기본 TypeHandlers 인 을 설명합니다.

일반적으로 일반적인 typeHandler가 구현되지만 특별한 경우 다음과 같이해야합니다.

어떻게?

지원되지 않거나 비표준 유형 인 을 처리하기 위해 유형 핸들러를 재정의하거나 직접 처리 할 수 ​​있습니다. 이렇게하려면 인터페이스 org.apache.ibatis.type.TypeHandler를 구현하거나 편의 클래스 org.apache.ibatis.type.BaseTypeHandler를 확장하고 선택적으로 JDBC 유형에 매핑하십시오.

그리고 마지막으로, 당신은 당신의 구성에 새로운 타입의 핸들러를 추가해야합니다 : 귀하의 경우

<!-- mybatis-config.xml --> 
<typeHandlers> 
    <typeHandler handler="your.pckg.ClobTypeHandler" /> 
</typeHandlers> 

, 당신은 단지 바로 일반적인 Map<String, Object>로 사용하여 기존 핸들러 BaseTypeHandler를 확장 할 수 있습니다. 예 :

import java.io.IOException; 
import java.io.StringReader; 
import java.sql.CallableStatement; 
import java.sql.Clob; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.HashMap; 
import java.util.Map; 

import org.apache.ibatis.type.BaseTypeHandler; 
import org.apache.ibatis.type.JdbcType; 
import org.codehaus.jackson.map.ObjectMapper; 


public class ClobJsonTypeHandler extends BaseTypeHandler<Map<String, Object>> { 


    @Override 
    public void setNonNullParameter(PreparedStatement ps, int i, Map<String, Object> parameter, JdbcType jdbcType) throws SQLException { 
     final String parameterString = mapToJson(parameter); 
     StringReader reader = new StringReader(parameterString); 
     ps.setCharacterStream(i, reader, parameterString.length()); 
    } 

    public Map<String, Object> getNullableResult(ResultSet rs, String columnName) throws SQLException { 
     String value = ""; 
     Clob clob = rs.getClob(columnName); 
     if (clob != null) { 
      int size = (int) clob.length(); 
      value = clob.getSubString(1L, size); 
     } 

     return jsonToMap(value); 
    } 

    public Map<String, Object> getNullableResult(ResultSet rs, int columnIndex) throws SQLException { 
     String value = ""; 
     Clob clob = rs.getClob(columnIndex); 
     if (clob != null) { 
      int size = (int) clob.length(); 
      value = clob.getSubString(1L, size); 
     } 

     return jsonToMap(value); 
    } 

    public Map<String, Object> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { 
     String value = ""; 
     Clob clob = cs.getClob(columnIndex); 
     if (clob != null) { 
      int size = (int) clob.length(); 
      value = clob.getSubString(1L, size); 
     } 

     return jsonToMap(value); 
    } 

    private Map<String, Object> jsonToMap(String from) { 
     ObjectMapper mapper = new ObjectMapper(); 
     try { 
      return mapper.readValue(from, HashMap.class); 
     } catch (IOException e) { 
      throw new Error(); 
     } 
    } 

    private String mapToJson(Map<String, Object> from) { 
     ObjectMapper mapper = new ObjectMapper(); 
     try { 
      return mapper.writeValueAsString(from); 
     } catch (IOException e) { 
      throw new Error(); 
     } 
    } 
}