千家信息网

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转换的字段 *  * 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 FastJsonArrayTypeHandler extends AbstractJsonTypeHandler {     private TypeReference> type;     public FastJsonArrayTypeHandler(TypeReference> type) {        this.type = type;    }     @Override    protected Object parse(String json) {        return JSON.parseObject(json, type);    }     @Override    protected String toJson(Object obj) {        return JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty);    } }

初始化,剩下的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怎么自定义集合类型的类型处理器这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0