我有一張表,讓我們說User,它有一列作爲Userdetails。 和的UserDetails是CLOB類型,幷包含一個JSON作爲數據 旁邊似MyBatis將JSON Clob選擇爲MAP <String,String>作爲結果集
{name:'ABC', add:'XYZ'......}
所以我想下面的列值ResultSet作爲一個地圖。
select Userdetails from User
我有一張表,讓我們說User,它有一列作爲Userdetails。 和的UserDetails是CLOB類型,幷包含一個JSON作爲數據 旁邊似MyBatis將JSON Clob選擇爲MAP <String,String>作爲結果集
{name:'ABC', add:'XYZ'......}
所以我想下面的列值ResultSet作爲一個地圖。
select Userdetails from User
您必須爲此創建自己的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();
}
}
}