mybatisplus JSON类型处理器详解
作者: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;
}
- 首先需要在@TableName中配置属性autoResultMap = true
- 然后在需要进行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参数示例

运行结果:


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