<resultMap id="TestJsonMapper" type="com.huahua.dao.DO.TestJsonDO"> <id column="id" jdbcType="BIGINT" property="id"/> <result column="user_info" property="jsonObject" javaType="com.alibaba.fastjson.JSONObject" typeHandler="com.huahua.dao.jsonHandler.JsonTypeHandler"/></resultMap> <insert id="insert" parameterType="com.huahua.dao.DO.UserDO"> insert into `user` (`id`, `user_info`) values (#{id,jdbcType=BIGINT}, #{jsonObject,typeHandler=com.huahua.dao.jsonHandler.JsonTypeHandler}); </insert> <select id="insert"> select `id`, `user_info` from user </select >
时间: 2025-03-18 10:23:33 浏览: 11
MyBatis 自定义类型处理器 JsonTypeHandler 的实现
在 MyBatis 中,JsonTypeHandler
是一种用于处理复杂数据类型的机制。通过自定义 TypeHandler
,可以将数据库中的 JSON 字段与 Java 对象之间的映射关系进行管理。
1. 配置 TypeHandler
为了支持 com.alibaba.fastjson2.JSONObject
类型的数据绑定,在实体类中可以通过 @TableField
注解指定使用的 TypeHandler
[^1]:
@TableField(value = "param_config", typeHandler = JacksonTypeHandler.class)
private JSONObject paramConfig;
上述代码表示字段 param_config
将会使用 JacksonTypeHandler
进行序列化和反序列化的操作。如果需要切换到 FastJSON,则可以选择替换为 FastjsonTypeHandler
。
2. 实现自定义 TypeHandler
当内置的 TypeHandler
不满足需求时,开发者也可以创建自己的 TypeHandler
来完成特定逻辑。以下是基于 com.alibaba.fastjson2.JSONObject
的示例实现:
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
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 CustomFastjsonTypeHandler extends BaseTypeHandler<JSONObject> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, JSONObject parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, JSON.toJSONString(parameter)); // 序列化为字符串存储
}
@Override
public JSONObject getNullableResult(ResultSet rs, String columnName) throws SQLException {
String jsonStr = rs.getString(columnName);
return (jsonStr == null ? null : JSON.parseObject(jsonStr));
}
@Override
public JSONObject getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String jsonStr = rs.getString(columnIndex);
return (jsonStr == null ? null : JSON.parseObject(jsonStr));
}
@Override
public JSONObject getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String jsonStr = cs.getString(columnIndex);
return (jsonStr == null ? null : JSON.parseObject(jsonStr));
}
}
此代码片段展示了如何扩展 BaseTypeHandler<T>
并覆盖其四个核心方法来适配不同的场景下的读写行为。
3. 数据库表设计
假设有一个名为 users
的表格,其中包含了一个用来保存配置信息的 JSON 列 param_config
:
Column Name | Data Type |
---|---|
id | BIGINT |
name | VARCHAR |
age | INT |
param_config | TEXT |
这里的 param_config
被设置成 TEXT
类型以便能够容纳较大的 JSON 文本内容。
4. 测试用例
下面是一个简单的测试案例展示如何利用该功能:
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void testSaveUserWithParam() {
User user = new User();
user.setId(1L).setName("Alice").setAge(25);
JSONObject config = new JSONObject();
config.put("theme", "dark");
config.put("notificationsEnabled", true);
user.setParamConfig(config); // 设置 JSON 参数
userService.save(user); // 存储至数据库
}
}
在此基础上,还可以借助 Spring 提供的对象拷贝工具简化 Bean 属性赋值过程[^2]。
相关推荐



















