Mybatis-Plus怎么自定义集合类型的类型处理器
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要讲解了"Mybatis-Plus怎么自定义集合类型的类型处理器",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Mybatis-Plus怎么自
千家信息网最后更新 2025年01月18日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转换的字段 **/@Slf4j@MappedJdbcTypes(value = JdbcType.VARCHAR)public class FastJsonArrayTypeHandler extends AbstractJsonTypeHandler* 3.自定义方法上的用法 * @Mapper * public interface DemoDao extends BaseMapper { * @Select("select * from demo where demo_id = #{demoId}") * @ResultMap(value = "xml文件中的resultMap的id") * List selectListByDemoId(Long demoId); * } * } > { 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 ListdemoInfo;}
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安全错误
数据库的锁怎样保障安全
网络安全的特性应具有
pc端网易我的世界服务器第九大陆
EDI是网络安全技术吗
网络安全心得体会69字
大学网络安全部怎么样
云原生数据库新闻
备份可以备份软件数据库文件
软件开发师福利和薪资
vb combo 数据库
raid服务器报警
实验四数据库安全性
量化 数据库
测试数据库基础
兰州中和软件开发
奉贤区多功能软件开发销售公司
深圳市运趣互联网科技有限公司
主流数据库是什么东西
mpp数据库面试问题及回答技巧
济南最大的软件开发公司
重庆互联网科技流量周总
奉贤区互联网软件开发服务电话
软件开发监理速成
网络安全检察一般会问什么问题
北京工业网络安全有限公司
爬虫服务器维护
汽车车载网络技术发展论文
学校网络安全法报告
智掌云网络技术有限公司
求带数据库的电影院选座系统
易语言udp服务器