mybatisplus JSON类型处理器详解

 更新时间:2025年10月13日 11:12:37   作者:D_FW  
文章介绍了如何在数据库中使用JSON字段类型及其在Java项目中的自动转换处理,通过设置实体类属性上的注解,使用JacksonTypeHandler自动处理JSON数据的保存和读取,减少手动转换JSON与String格式的需求,这样可以提高数据操作的效率和代码的简洁性

本篇文章参考官方文档:https://baomidou.com/guides/type-handler/

应用场景

当前有一个购物车功能,展示用户所选商品的信息,如:规格、数量、商品名、价格等,其中商品规格存储格式例如:{"尺寸": "xxl", "颜色": "黑色"}。

此处如果使用String类型存入数据库,每次获取数据以及保存数据都需要手动进行json格式和String类型的转换,为了避免这个情况,可以直接在数据库中设置该字段spData为json类型,并且在项目中使用JSON处理器进行自动转换。

数据表结构

如下:

接下来在实体类中配置JSON处理器

package com.zxs.weixinapi.domain.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Map;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 * 
 * </p>
 *
 * @author zxs
 * @since 2025-10-12
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "ums_member_cart", autoResultMap = true)
public class MemberCart implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 商品名称
     */
    private String productName;

    /**
     * 用户Id
     */
    private Integer memberId;

    /**
     * 数量
     */
    private Integer quantity;

    /**
     * 单价
     */
    private BigDecimal price;

    /**
     * 规格属性
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private Map<String, String> spData;


}
  1. 首先需要在@TableName中配置属性autoResultMap = true
  2. 然后在需要进行json处理的属性上添加注解@TableField(typeHandler = JacksonTypeHandler.class)

完整代码

  • controller:
package com.zxs.weixinapi.controller;


import com.zxs.weixinapi.common.R;
import com.zxs.weixinapi.domain.dto.MemberCartDto;
import com.zxs.weixinapi.service.IMemberCartService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author zxs
 * @since 2025-10-12
 */
@RestController
@RequestMapping("/member/cart")
@RequiredArgsConstructor
public class MemberCartController {

    private final IMemberCartService memberCartService;

    /**
     * 添加购物车
     * @param memberCartDto
     * @return
     */
    @PostMapping("/add")
    public R<Void> add(@RequestBody MemberCartDto memberCartDto) {
        memberCartService.add(memberCartDto);
        return R.success(null);
    }

}
  • mapper:
package com.zxs.weixinapi.mapper;

import com.zxs.weixinapi.domain.entity.MemberCart;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author zxs
 * @since 2025-10-12
 */
@Mapper
public interface MemberCartMapper extends BaseMapper<MemberCart> {

}
  • service:
package com.zxs.weixinapi.service;

import com.zxs.weixinapi.domain.dto.MemberCartDto;
import com.zxs.weixinapi.domain.entity.MemberCart;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author zxs
 * @since 2025-10-12
 */
public interface IMemberCartService extends IService<MemberCart> {

    /**
     * 添加购物车
     * @param memberCartDto
     */
    void add(MemberCartDto memberCartDto);
}
  • serviceImpl:
package com.zxs.weixinapi.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.zxs.weixinapi.domain.dto.MemberCartDto;
import com.zxs.weixinapi.domain.entity.MemberCart;
import com.zxs.weixinapi.mapper.MemberCartMapper;
import com.zxs.weixinapi.service.IMemberCartService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author zxs
 * @since 2025-10-12
 */
@Service
public class MemberCartServiceImpl extends ServiceImpl<MemberCartMapper, MemberCart> implements IMemberCartService {

    @Override
    public void add(MemberCartDto memberCartDto) {
        MemberCart memberCart = BeanUtil.toBean(memberCartDto, MemberCart.class);
        memberCart.setMemberId(1);
        this.save(memberCart);
    }
}
  • dto:
package com.zxs.weixinapi.domain.dto;

import lombok.Data;

import java.math.BigDecimal;
import java.util.Map;

@Data
public class MemberCartDto {

    /**
     * 商品名称
     */
    private String productName;

    /**
     * 数量
     */
    private Integer quantity;

    /**
     * 规格属性
     */
    private Map<String, String> spData;

    /**
     * 单价
     */
    private BigDecimal price;
}
  • entity:
package com.zxs.weixinapi.domain.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Map;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * <p>
 * 
 * </p>
 *
 * @author zxs
 * @since 2025-10-12
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(value = "ums_member_cart", autoResultMap = true)
public class MemberCart implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 商品名称
     */
    private String productName;

    /**
     * 用户Id
     */
    private Integer memberId;

    /**
     * 数量
     */
    private Integer quantity;

    /**
     * 单价
     */
    private BigDecimal price;

    /**
     * 规格属性
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private Map<String, String> spData;


}

body参数示例

运行结果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot生成PDF的方法

    SpringBoot生成PDF的方法

    生成PDF是一种常见的需求,本文主要介绍了SpringBoot生成PDF的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • Java实现各种文件类型转换方式(收藏)

    Java实现各种文件类型转换方式(收藏)

    这篇文章主要介绍了Java 各种文件类型转换的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Java导出Excel统计报表合并单元格的方法详解

    Java导出Excel统计报表合并单元格的方法详解

    我们在日常编程过程中,总是会碰见导出相关表格信息的需求,所以就让我们一起来学习一下,这篇文章主要给大家介绍了关于Java导出Excel统计报表合并单元格的相关资料,需要的朋友可以参考下
    2021-10-10
  • java中接口(interface)及使用方法示例

    java中接口(interface)及使用方法示例

    这篇文章主要介绍了java中接口(interface)及使用方法示例,涉及接口定义的简单介绍以及Java语言代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • 解决打开的idea项目maven不生效问题

    解决打开的idea项目maven不生效问题

    这篇文章主要给大家介绍了关于如何解决打开的idea项目maven不生效问题,最近在配置maven时,发现无论配置几遍,IDEA中的maven配置总会还原成默认的,所以这里给大家分享下解决办法,需要的朋友可以参考下
    2023-07-07
  • SVN导入maven项目报错解决方案

    SVN导入maven项目报错解决方案

    这篇文章主要介绍了SVN导入maven项目报错解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • JAVA设计模式之单例模式详解

    JAVA设计模式之单例模式详解

    大家好,本篇文章主要讲的是JAVA设计模式之单例模式详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Java==和equals的区别总结

    Java==和equals的区别总结

    在本文中小编给大家整理了关于Java==和equals的区别以及相关知识点,有兴趣的朋友们学习下。
    2019-03-03
  • SpringSecurity入门使用教程

    SpringSecurity入门使用教程

    ​ Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,它是用于保护基于Spring的应用程序的实际标准,这篇文章主要介绍了如何使用SpringSecurity,需要的朋友可以参考下
    2023-12-12
  • 用StopWatch优雅替代currentTimeMillis计算程序执行耗时

    用StopWatch优雅替代currentTimeMillis计算程序执行耗时

    别再用System.currentTimeMillis()计算程序执行耗时了,拥抱StopWatch优雅来优雅的计算,代码更简洁效率更高,本文带你了解StopWatch的使用
    2021-09-09

最新评论