2017-05-16 39 views

回答

0

您必須爲此創建自己的TypeHandler。它在官方文檔中解釋如何去做:type handler

爲什麼?

每當MyBatis的設置上一個PreparedStatement的參數或檢索 從結果的值,一個類型處理器用於檢索在適當的Java類型的裝置的值 。下表描述了默認的TypeHandlers 。

一般來說,常見的類型處理程序是實現的,但在像下一個特殊情況下,你需要這樣做。

怎麼樣?

可以重寫類型處理器或創建自己的應對 不支持的或非標準的類型。爲此,請實現接口 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(); 
     } 
    } 
} 
相關問題