Mybatis-Plus怎么自定义集合类型的类型处理器
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,这篇文章主要讲解了"Mybatis-Plus怎么自定义集合类型的类型处理器",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Mybatis-Plus怎么自
千家信息网最后更新 2025年11月08日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安全错误
数据库的锁怎样保障安全
服务器拓扑图素材
什么软件开发信誉好
信息管理服务器在哪打开
巢湖天气预报软件开发
企业对外直接投资数据库
柯尼卡dr数据库
数据库建立子窗体
昌平旧服务器回收报价
博山财务办公软件开发服务
北京上海广州计算机网络安全
网络安全三审三校内容是什么
北京it软件开发定制
自动驾驶软件开发难吗
张家港选择网络技术排名靠前
从数据库中提取json文件
网络安全及保密培训ppt
西安会员管理软件开发公司
数据库的隐藏方式
如何开发工程结构软件开发
PubMed数据库中的截词符是
电脑本地服务器开了打不开文件
服务器安全的关键是()
软件开发背景怎么写
知识经验数据库建设
数据库中的标志规范是什么意思
服务器用显卡接显示器
软件开发和信息技术
博世创新与软件开发无锡
数据库与电商联系方式
smtp服务器安全提示