MyBatis选择JSON Clob到MAP <string,=“”string =“”>作为结果集

时间:2017-05-16 08:58:09

标签: sql mybatis ibatis

我有一个表,让我们说User有一个列为Userdetails。 和Userdetails的类型为Clob,包含一个JSON作为数据 像下一个

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

所以我想把下面的列值resultSet作为Map。

 select Userdetails from User 

1 个答案:

答案 0 :(得分:1)

您必须为此创建自己的TypeHandler。官方文档中解释了如何执行此操作:type handler

为什么?

  

每当MyBatis在PreparedStatement上设置参数或检索时   ResultSet中的值,TypeHandler用于检索值   在适合Java类型的方法中。下表描述   默认的TypeHandlers。

通常,会实现常见的类型处理程序,但在下一个特殊情况下,您需要执行此操作。

如何?

  

您可以覆盖类型处理程序或创建自己的处理程序   不支持或非标准类型。为此,请实现该接口   org.apache.ibatis.type.TypeHandler或扩展便利类   org.apache.ibatis.type.BaseTypeHandler并可选择将其映射到JDBC   类型。

最后,您需要在配置中添加新类型处理程序:

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

在您的情况下,您可以使用通用BaseTypeHandler直接扩展现有处理程序Map<String, Object>。 例如:

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();
        }
    }
}