首页 > 作文

MybatisPlus如何自定义TypeHandler映射JSON类型为List

更新时间:2023-04-04 16:48:21 阅读: 评论:0

目录
自定义typehandler映射json类型为list1. 实体类2. listtypehandler3. reporturlisttypehandler4. java 泛型自定义typehandler的使用笔记类型转换器还可以通过注解配置 java类型和jdbc类型定义使用

自定义typehandler映射json类型为list

1. 实体类

这里只展示需要映射的字段,分别在所需映射的字段和实体类上添加注解。

@data@tablename(value = "report", autoresultmap = true)public class report {     private static final long rialversionuid = 1l;     @apimodelproperty("id")    @tableid(value = "id", type = idtype.auto)    private int红色经典朗诵作品eger id;     @apimodelproperty("报名信息")    @tablefield(typehandler = reporturlisttypehandler.class)    private list<reportur> reportinfo; }

2. listtypehandler

提供一个 jsonarray 转换为 java list集合的处理器

import cn.hutool.core.collection.collutil;import cn.hutool.core.util.汇报材料格式strutil;import com.alibaba.fastjson.json;import com.alibaba.fastjson.typereference;import org.apache.ibatis.type.batypehandler;import org.apache.ibatis.type.jdbctype;import org.apache.ibatis.type.mappedjdbctypes;import org.apache.ibatis.type.mappedtypes; import java.sql.callablestatement;import java.sql.preparedstatement;import java.sql.resultt;import java.sql.sqlexception;import java.util.arraylist;import java.util.list;  @mappedjdbctypes(jdbctype.varbinary)@mappedtypes({list.class})public abstract class listtypehandler<t> extends batypehandler<list<t>> {     @override    public void tnonnullparameter(preparedstatement ps, int i, list<t> parameter, jdbctype jdbctype) throws sqlexception {        string content = collutil.impty(parameter) ? null : json.tojsonstring(parameter);        ps.tstring(i, content);    }     @override    public list<t> getnullableresult(resultt rs, string columnname) throws sqlexception {        return this.getlistbyjsonarraystring(rs.getstring(columnname));    }     @override    public list<t> getnullableresult(resultt rs, int columnindex) throws sqlexception {        return this.getlistbyjsonarraystring(rs.getstring(columnindex));    }     @override    public list<t> getnullableresult(callablestatement cs, int columnindex) throws sqlexception {        return this.getlistbyjsonarraystring(cs.getstring(columnindex));    }      private list<t> getlistbyjsonarraystring(string content) {        return strutil.isblank(content) ? new arraylist<>() : json.parobject(content, this.specifictype());    }    电商运营专员 /**     * 具体类型,由子类提供     *     * @return 具体类型     */    protected abstract typereference<list<t>> specifictype();  }

3. reporturlisttypehandler

由具体的子类提供list集合泛型类型

import com.alibaba.fastjson.typereference;import com.hanku.business越俎代庖.model.reportur; import java.util.list;  public class reporturlisttypehandler extends listtypehandler<reportur> {     @override    protected typereference<list<reportur>> specifictype() {        return new typereference<list<reportur>>() {        };    }    }

4. java 泛型

如果在 listtypehandler 类中直接提供 typereference<list<t>> 这种类型,那就等效于typereference<list<object>> 这种类型,后续 fastjson 在转换时无法确定具体的 java 类型,转换后的类型最终就会是 list<jsonobject> ;同理,如果使用 jackson 作为 json 转换工具,不确定具体类型时,最总会被转换为linkedhashmap 类型,都需要再使用 typereference 来转换一次。

自定义typehandler的使用笔记

可通过自定义的typehandler实现某个属性在插入数据库以及查询时的自动转换,本例中是要将map类型的属性转化成clob,然后存入数据库。由于是复杂的map,mp自带的json转换器会丢失部分信息。

类型转换器还可以通过注解配置 java类型和jdbc类型

@mappedtypes:注解配置 java 类型@mappedjdbctypes:注解配置 jdbc 类型

定义

@slf4j@mappedtypes({object.class})@mappedjdbctypes(jdbctype.varchar)public class weightlisttypehandler extends abstractjsontypehandler<object> {  private static gson gson = new gson();  private final class<?> type;  public weightlisttypehandler(class<?> type) {    if (log.istraceenabled()) {      log.trace("weightlisttypehandler(" + type + ")");    }    asrt.notnull(type, "type argument cannot be null");    this.type = type;  }  @override  protected object par(string json) {    type type1 = new typetoken<map<string, list<weightitem>>>(){}.gettype();    return gson.fromjson(json, type1);  }  @override  protected string tojson(object obj) {    return gson.tojson(obj);  }  public static void tgson(gson gson) {    asrt.notnull(gson, "gson should not be null");    weightlisttypehandler.gson = gson;  }}

使用

注意@tablename 注解 autoresultmap 属性

@data@noargsconstructor@tablename(value = "mix_target",autoresultmap = true)public class mixtarget extends model<mixtarget> {    @tableid(value = "id", type = idtype.auto)    private long id;    /**     *指标描述     */    @tablefield("description")    private string description;    /**     * 指标名     */    @tablefield("name")    private string name;    /**     * 对应属性名     */    @tablefield("property_name")    priv写桂花的作文ate string propertyname;    /**     * 起始点类型     */    @tablefield("source_type")    private string sourcetype;    /**     * 属性对应权值列表     * key 属性名 value指定条件下的权值     */    @tablefield(value = "weight_list",typehandler = weightlisttypehandler.class,jdbctype = jdbctype.clob)    private map<string, list<weightitem>> weightlist;    /**     * 运行状态     * 0 新建未运行     * 1 运行中     * 2 已运行 成功     * 3 已运行 失败     */    @tablefield("status")    private integer status;    /**     * 是否可用     * 1 true     * 0 fal     */    @tablefield("enable")    private integer enable;    @tablefield("create_time")    private localdatetime createtime;}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。

本文发布于:2023-04-04 16:48:20,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/8424e00a01a7e22536608c89a530a420.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:MybatisPlus如何自定义TypeHandler映射JSON类型为List.doc

本文 PDF 下载地址:MybatisPlus如何自定义TypeHandler映射JSON类型为List.pdf

标签:类型   注解   自定义   属性
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图