我有一个表,让我们说User有一个列为Userdetails。 和Userdetails的类型为Clob,包含一个JSON作为数据 像下一个
{name:'ABC', add:'XYZ'......}
所以我想把下面的列值resultSet作为Map。
select Userdetails from User
答案 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();
}
}
}