本篇文章小编给大家分享一下MybatisPlus自定义TypeHandler映射JSON类型为List代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
1. 实体类
这里只展示需要映射的字段,分别在所需映射的字段和实体类上添加注解。
@Data @TableName(value = "report", autoResultMap = true) public class Report { private static final long serialVersionUID = 1L; @ApiModelProperty("id") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty("报名信息") @TableField(typeHandler = ReportUserListTypeHandler.class) private ListreportInfo; }
2. ListTypeHandler
提供一个 JSONArray 转换为 Java List集合的处理器
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.MappedJdbcTypes; import org.apache.ibatis.type.MappedTypes; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @MappedJdbcTypes(JdbcType.VARBINARY) @MappedTypes({List.class}) public abstract class ListTypeHandlerextends BaseTypeHandler > { @Override public void setNonNullParameter(PreparedStatement ps, int i, List
parameter, JdbcType jdbcType) throws SQLException { String content = CollUtil.isEmpty(parameter) ? null : JSON.toJSONString(parameter); ps.setString(i, content); } @Override public List getNullableResult(ResultSet rs, String columnName) throws SQLException { return this.getListByJsonArrayString(rs.getString(columnName)); } @Override public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return this.getListByJsonArrayString(rs.getString(columnIndex)); } @Override public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return this.getListByJsonArrayString(cs.getString(columnIndex)); } private List getListByJsonArrayString(String content) { return StrUtil.isBlank(content) ? new ArrayList<>() : JSON.parseObject(content, this.specificType()); } /** * 具体类型,由子类提供 * * @return 具体类型 */ protected abstract TypeReference > specificType(); }
3. ReportUserListTypeHandler
由具体的子类提供List集合泛型类型
import com.alibaba.fastjson.TypeReference; import com.hanku.business.model.ReportUser; import java.util.List; public class ReportUserListTypeHandler extends ListTypeHandler{ @Override protected TypeReference > specificType() { return new TypeReference
>() { }; } }
4. Java 泛型
如果在 ListTypeHandler 类中直接提供 TypeReference> 这种类型,那就等效于TypeReference
> 这种类型,后续 fastjson 在转换时无法确定具体的 Java 类型,转换后的类型最终就会是 List
自定义TypeHandler的使用笔记
可通过自定义的TypeHandler实现某个属性在插入数据库以及查询时的自动转换,本例中是要将Map类型的属性转化成CLOB,然后存入数据库。由于是复杂的Map,mp自带的json转换器会丢失部分信息。
类型转换器还可以通过注解配置 java类型和jdbc类型
@MappedTypes:注解配置 java 类型
@MappedJdbcTypes:注解配置 jdbc 类型
定义
@Slf4j @MappedTypes({Object.class}) @MappedJdbcTypes(JdbcType.VARCHAR) public class WeightListTypeHandler extends AbstractJsonTypeHandler
使用
注意@TableName 注解 autoResultMap 属性
@Data @NoArgsConstructor @TableName(value = "mix_target",autoResultMap = true) public class MixTarget extends Model{ @TableId(value = "id", type = IdType.AUTO) private Long id; /** *指标描述 */ @TableField("description") private String description; /** * 指标名 */ @TableField("name") private String name; /** * 对应属性名 */ @TableField("property_name") private String propertyName; /** * 起始点类型 */ @TableField("source_type") private String sourceType; /** * 属性对应权值列表 * key 属性名 value指定条件下的权值 */ @TableField(value = "weight_list",typeHandler = WeightListTypeHandler.class,jdbcType = JdbcType.CLOB) private Map > weightList; /** * 运行状态 * 0 新建未运行 * 1 运行中 * 2 已运行 成功 * 3 已运行 失败 */ @TableField("status") private Integer status; /** * 是否可用 * 1 true * 0 false */ @TableField("enable") private Integer enable; @TableField("create_time") private LocalDateTime createTime; }
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整