Mybatis-Plus怎么自定义集合类型的类型处理器
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,这篇文章主要讲解了"Mybatis-Plus怎么自定义集合类型的类型处理器",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Mybatis-Plus怎么自
千家信息网最后更新 2025年02月23日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安全错误
数据库的锁怎样保障安全
延安网络安全法
使命召唤17服务器正在维修
数据库储存方案
网络安全维护合同
时序数据库流式数据库
萝岗软件开发哪家靠谱
潜渊症搜不到服务器列表
数据库一直显示正在恢复
未发生网络安全责任事件
网络安全智能化市场
上海综合软件开发定制报价表
qq软件开发的过程
你知道哪些网络安全小
初学软件开发的心得
极路由插件不能连接云服务器
网络安全法律的作用
数据库中某个列索引数据重复
nexis数据库如何注册
广州市好商汇网络技术有限公司
天趣网络安全教育
网络安全切片
数据库该怎么学
保障网络安全的书籍
圣诺网络技术上海
服务器内存可以插在台式机上吗
科浪软件开发培训官网
常用数据库软件有哪些
能科科技卫星互联网
网络安全法要求实名制的范围
网络安全需要人参与吗