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参数示例
运行结果:
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。