mybatis-plus 将 Java 对象保存为 json 类型数据。使用 typeHandler
类型处理器处理 JavaType 与 JdbcType 之间的转换
借助 TableField
注解快速注入 typeHandler
到 mybatis 容器中。这种注解的方式需要开启类型映射注解 @TableName(autoResultMap = true)
实际测试发现 mybatis-plus BaseMapper 接口定义的方法会自动使用 typeHandler
处理 JavaType 与 JdbcType 的转换。
@TableName(value = "user", autoResultMap = true)
@Data
public User {
private Long id;
// com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
@TableField(typeHandler = JacksonTypeHandler.class)
private Object userInfo;
}
Mybatis 动态 SQL 语句不会自动应用 typeHandler
,需要 Java 类型中单独指定 typeHandler
,这种方式不需要开启自动映射注解。比如在批量插入中,将 Object 对象值插入到类型为 json 的字段中。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.UserMapper">
<insert id="batchInsert" >
INSERT INTO user (username, userinfo)
VALUES
<foreach collection="userList" item="user" separator=",">
(#{user.username},
#{user.userinfo, typeHandler = com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler})
</foreach>
</insert>
</mapper>
// com.example.demo.dao.UserMapper
@Mapper
public interface UserMapper extends BaseMapper<User> {
void batchInsert(@Param("userList") List<User> userList);
}
@TableName(value = 'user')
@Data
public User {
private Long id;
private String username;
private Object userinfo;
}
如果没有指定 typeHandler 会报错: org.apache.ibatis.type.TypeException: Error setting non null for parameter with JdbcType null. Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Invalid argument value: java.io.NotSerializableException