2017-05-16 21 views
1

私はテーブルを持っていますが、Userdetailsとして列を持つUserと言うことができます。次MyBatis ResultSetとしてJSON ClobをMAP <String、String>に選択します。

{name:'ABC', add:'XYZ'......} 

よう とUserdetailsは CLOB型のであり、データとしてJSONが含まれているので、私は地図として以下の列の値の結果セットを取得したいです。

select Userdetails from User 

答えて

0

独自のTypeHandlerを作成する必要があります。それは公式の文書でそれを行う方法:type handler説明されています。

なぜですか? MyBatisのはPreparedStatementの上のパラメータを設定または のResultSetから値を取得するたび

は、TypeHandlerはJava型に適切な手段で値 を取得するために使用されます。次の表は、デフォルトの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(); 
     } 
    } 
} 
関連する問題