Mybatis-Plus怎么自定义集合类型的类型处理器
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"Mybatis-Plus怎么自定义集合类型的类型处理器",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Mybatis-Plus怎么自
千家信息网最后更新 2026年11月02日Mybatis-Plus怎么自定义集合类型的类型处理器
这篇文章主要讲解了"Mybatis-Plus怎么自定义集合类型的类型处理器",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Mybatis-Plus怎么自定义集合类型的类型处理器"吧!
1.配合xml文件
TypeHandler
/** * 描述:fastjson的集合对象类型处理器,将mysql表中的json字段映射到实体类中的{@code List>}属性 * 对照MP自带的FastjsonTypeHandler,自带的类型处理器会把所有的{@code List>}都会解析为{@code List}, * 这样在遍历其中对象时,调用对象属性的get、set方法就会发送类型转换JsonObject->?,这种情况转换错误。 * 该处理器必须配合xml文件使用,不然无法获取要解析的对象类型,同时不能配合MP自带的{@link com.baomidou.mybatisplus.annotation.TableField} * 使用,默认情况下@TableField会将JavaType设置为字段的类型,如果是List>则type = List.class,无法明确其中的泛型,类型转换会变成JsonObject。 * 用法: * {@code * 1.实体类上使用注解@TableName(value = "表名", resultMap = "xml文件中的resultMap的id") * 2.xml文件中自定义resultMap并设置需要JSON转换的字段 * * 3.自定义方法上的用法 * @Mapper * public interface DemoDao extends BaseMapper { * @Select("select * from demo where demo_id = #{demoId}") * @ResultMap(value = "xml文件中的resultMap的id") * List selectListByDemoId(Long demoId); * } * } */@Slf4j@MappedJdbcTypes(value = JdbcType.VARCHAR)public class FastJsonArrayTypeHandler extends AbstractJsonTypeHandler> { private Class> type; public FastJsonArrayTypeHandler(Class> type) { if (log.isTraceEnabled()) { log.trace("FastjsonTypeHandler(" + type + ")"); } Assert.notNull(type, "Type argument cannot be null"); this.type = type; } @Override protected List> parse(String json) { return JSON.parseArray(json, type);// 注意不要使用parseObject方法 } @Override protected String toJson(List> obj) { return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty); } }
xml文件
Dao
@Mapperpublic interface DemoDao extends BaseMapper{ @Select("select * from demo where demo_id = #{demoId}") @ResultMap(value = "demoMap") List selectListByPlanId(Long demoId);}
Entity
@Data@TableName(value = "demo", resultMap = "demoMap")public class DemoEntity implements Serializable { private static final long serialVersionUID = -1L; /** * 主键 */ @TableId private Long id; private Long demoId /** * json字段 */ private List demoInfo;} 2.手动注册
TypeHandler
@Slf4j@MappedJdbcTypes(value = JdbcType.VARCHAR)public class FastJsonArrayTypeHandlerextends AbstractJsonTypeHandler
初始化,剩下的bean和dao都不需要额外配置
/** * 描述:初始化配置 * 手动注册类型处理器 */@Componentpublic class InitConfig implements CommandLineRunner { public static final com.alibaba.fastjson.TypeReference> F_DEMO_INFO = new com.alibaba.fastjson.TypeReference>() { }; public static final TypeReference> M_DEMO_INFO = new TypeReference>() { }; // mp自动装配时注入的factory,可用于获取mybatis的配置属性,这里用来获取类型处理器的注册器 private final SqlSessionFactory factory; public InitConfig(SqlSessionFactory factory) { this.factory = factory; } /** * 注册类型处理器 * {@code * 1.List类型处理器 * ... * } * * @param args incoming main method arguments * @throws Exception on error */ @SuppressWarnings("all") @Override public void run(String... args) throws Exception { TypeHandlerRegistry typeHandlerRegistry = factory.getConfiguration().getTypeHandlerRegistry(); typeHandlerRegistry.register(M_DEMO_INFO, new FastJsonArrayTypeHandler(F_DEMO_INFO)); }}
目前方法二存在的缺陷:虽然新增、查询不存在问题,执行MP自带的更新操作时,parameterMap参数类型都是Object,不会经过自定义的TypeHandler处理,最后会把json对象直接set进去(update demo ..., demo_info = JSON对象 ...)导致报错
感谢各位的阅读,以上就是"Mybatis-Plus怎么自定义集合类型的类型处理器"的内容了,经过本文的学习后,相信大家对Mybatis-Plus怎么自定义集合类型的类型处理器这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
类型
处理
处理器
对象
文件
字段
属性
实体
情况
方法
类名
学习
配置
内容
手动
问题
参数
同时
就是
思路
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中国互联网科技工作委员会毛军
科技信息互联网
美国互联网科技
互联网科技小贷
北京禾田雨橡互联网科技
赫美联合互联网科技
顺玮阁互联网科技
互联网科技大会
四川狮子座互联网科技
互联网科技素材视频竖屏
华夏互联网科技业
燊美集互联网科技有限公司
中国互联网公司排名锤子科技
互联网科技包装股
互联网科技手机排行榜
广西科技产业互联网是什么
长沙渺峰互联网科技有限公司
悟空问答互联网科技
山东蛋芒互联网科技有限公司
网互联网络科技
与互联网科技公司
天下捷融互联网科技
广州善班互联网科技
新华互联网科技2019
互联网在线教育科技创业
群盈汇互联网科技有限公司
互联网方面的科技前沿
江苏苏星互联网科技有限公司
西安左小互联网科技有限公司
安徽零酒互联网科技有限公司