mybatis结果映射到JSON中
时间: 2025-03-20 10:18:26 浏览: 47
### 如何在 MyBatis 中将结果正确映射为 JSON 格式
为了使 MyBatis 将某些字段以 JSON 格式存储到数据库并能够正确读取,可以通过自定义 `TypeHandler` 来完成这一需求。以下是具体方法:
#### 自定义 TypeHandler
可以创建一个继承自 `BaseTypeHandler<T>` 的类来处理 Java 对象与 JSON 字符串之间的转换。例如,在保存时将对象序列化为 JSON 字符串存入数据库;而在查询时则反序列化回原始的对象结构。
```java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
private final ObjectMapper objectMapper = new ObjectMapper();
private final Class<T> type;
public JsonTypeHandler(Class<T> type) {
if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
this.type = type;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
try {
ps.setString(i, objectMapper.writeValueAsString(parameter));
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
@Override
public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
String jsonStr = rs.getString(columnName);
return parse(jsonStr);
}
@Override
public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String jsonStr = rs.getString(columnIndex);
return parse(jsonStr);
}
@Override
public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String jsonStr = cs.getString(columnIndex);
return parse(jsonStr);
}
private T parse(String jsonStr) {
if (jsonStr == null || "".equals(jsonStr.trim())) {
return null;
}
try {
return objectMapper.readValue(jsonStr, type);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
```
此代码片段展示了如何构建一个通用的 `JsonTypeHandler`[^1]。
#### 配置 resultMap
接着需要修改 MyBatis 的 XML 映射文件中的 `<resultMap>` 定义部分,指定该列使用的 `typeHandler` 是上述自定义处理器。如下所示:
```xml
<resultMap id="baseMap" type="com.example.entity.MyEntity">
<id column="id" jdbcType="INTEGER" property="id"/>
<result column="data_column" jdbcType="VARCHAR" property="jsonData" typeHandler="com.example.handler.JsonTypeHandler"/>
</resultMap>
```
这里假设实体类有一个名为 `jsonData` 的属性用于接收来自数据库表中某列为 JSON 数据的内容,并指定了对应的 `typeHandler` 属性指向我们之前编写的 `JsonTypeHandler`[^2]。
对于更复杂的场景比如列表形式的数据,则可扩展类似的逻辑实现专门针对集合类型的 handler[^4]。
另外还有一种较为简单的解决方案即直接采用 TEXT 或 LONGTEXT 类型作为目标字段类型而非原生 JSON 支持的方式,虽然这种方式牺牲了一定程度上的语义表达准确性但在实际应用当中也能满足大部分的需求[^3]。
最终测试确认整个流程无误之后就可以正式投入使用了。
阅读全文
相关推荐




















