首页 > 其他分享 >MyBatis-Plus 自定义 TypeHandler 映射JSON类型为List

MyBatis-Plus 自定义 TypeHandler 映射JSON类型为List

时间:2023-12-11 09:34:47浏览次数:32  
标签:return 自定义 TypeHandler List class content JSON public

1 在mysql 5.7 支持json类型,那么在表实体是怎么运用的

在mybatis-plus 中有相关的handler

/**
 * Jackson 实现 JSON 字段类型处理器
 *
 * @author hubin
 * @since 2019-08-25
 */
@Slf4j
@MappedTypes({Object.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class JacksonTypeHandler extends AbstractJsonTypeHandler<Object>

2 对象 json类型 List<字符串> json 类型

    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> tag;

    @TableField(typeHandler = JacksonTypeHandler.class)
    private Tag tag;

3 List<对象> json 类型

直接用默认的是不行的,虽然查询没有问题,但是对List操作是会有类型转换异常

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.ruleengine.model.rules.SeriesModel

那么我要自定义handler

1 ListTypeHandler


@MappedJdbcTypes(JdbcType.VARBINARY)
@MappedTypes( {List.class})
public abstract class ListTypeHandler<T> extends BaseTypeHandler<List<T>> {
    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int parameterIndex, List<T> parameter, JdbcType jdbcType)
        throws SQLException {
        String content = CollUtil.isEmpty(parameter) ? null : JSON.toJSONString(parameter);
        preparedStatement.setString(parameterIndex, content);
    }

    @Override
    public List<T> getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        return this.getListByJsonArrayString(resultSet.getString(columnName));
    }

    @Override
    public List<T> getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
        return this.getListByJsonArrayString(resultSet.getString(columnIndex));
    }

    @Override
    public List<T> getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
        return this.getListByJsonArrayString(callableStatement.getString(columnIndex));
    }

    private List<T> getListByJsonArrayString(String content) {
        return StrUtil.isBlank(content) ? new ArrayList<>() : JSON.parseObject(content, this.specificType());
    }

    /**
     * 具体类型,由子类提供
     *
     * @return 具体类型
     */
    protected abstract TypeReference<List<T>> specificType();
}

2 SeriesModelListTypeHandler

public class SeriesModelListTypeHandler extends ListTypeHandler<SeriesModel> {
    @Override
    protected TypeReference<List<SeriesModel>> specificType() {
        return new TypeReference<List<SeriesModel>>() { };
    }
}

3 运用

    @TableField(typeHandler = SeriesModelListTypeHandler.class)
    private List<SeriesModel> series;

标签:return,自定义,TypeHandler,List,class,content,JSON,public
From: https://www.cnblogs.com/linzm14/p/17893677.html

相关文章

  • 实现k8s自定义controller
    创建crdapiVersion:apiextensions.k8s.io/v1kind:CustomResourceDefinitionmetadata:name:fruits.crd.iospec:group:crd.ioversions:-name:v1served:truestorage:trueschema:openAPIV3Schema:type:object......
  • vue3中自定义ref实现防抖
    import{customRef}from"vue";/***@description自定义ref实现防抖*@param{String}value*@param{Number}delay*@returns*/exportconstdebounceRef=(value,delay)=>{lettimer;returncustomRef((track,trigger)=>({......
  • Redis数据结构3:REDIS_LISTNODE
    REDIS_LISTNODEREDIS_LISTNODE本质上与Java的LinkedList一致,NodeList即为链表,是基本的线性结构。C语言原生没有对链表的支持,Redis对链表进行了实现。listNodetypedefstructlistNode{structlistNode*prev;structlistNode*next;void*value;}listNode;l......
  • 面试题大揭秘:怎么使用自定义端口运行Spring应用?
    大家好,我是小米!今天我们要聊的话题是一道常见的面试题:怎么使用自定义端口运行Spring应用?这可是每个Java后端开发者都可能会遇到的问题哦!废话不多说,咱们直接进入主题。Spring应用的默认端口首先,让我们回顾一下Spring应用的默认端口。大多数情况下,当你启动SpringBoot应用时,它会在默......
  • 【Java】删除List中的几行数据
    方法一: list.subList(from,to).clear();(注意不要超出list的长度范围)1List<Integer>list=newArrayList<>();2list.add(1);3list.add(2);4list.add(3);5list.add(4);6list.subList(0,2).clear();7System.out.println("list=>"+list);......
  • MFC CListVtrl 控件简单测试
    ▲样式Demo关联控件变量m_CList,在属性中将视图(View)设置成Report(报表)模式。在BOOLCMFCApplication4LlisBoxDlg::OnInitDialog()初始化函数中添加测试代码://TODO:在此添加额外的初始化代码//m_CList.SetView(1);//视图View要改成Report报表模式//设置风格样......
  • Vue学习之参数传递与事件分发使用this.$emit(‘自定义事件名‘, 参数)自定义事件删除
    ......
  • How to Use Docker and NS-3 to Create Realistic Network Simulations
    https://insights.sei.cmu.edu/blog/how-to-use-docker-and-ns-3-to-create-realistic-network-simulations/ HowtoUseDockerandNS-3toCreateRealisticNetworkSimulationsALEJANDROGOMEZMARCH27,2023Sometimes,researchersanddevelopersneedt......
  • 【JavaSE】集合Collection{List(ArrayList, LinkedList), Set(TreeSet, HashSet, Link
    集合单列集合:Collection接口单列集合:一次添加一个元素;如果集合中添加的是类,要重写equals方法,否则比较的是地址,无法正常删除内容相同的元素。单列集合通用遍历方式1.迭代器遍历2.增强for循环遍历增强for循环底层逻辑还是迭代器,字节码文件反编译为java会发现还是迭代......
  • 利用编码规则生成除单据编码字段以外的字段的自定义编码
    ///<summary>///生成母单号///</summary>///<paramname="billData"></param>///<returns></returns>///<exceptioncref="Exception"></exception>publicvoidCreateMuOrderNo(DynamicObjectb......