java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > mybatisplus JSON类型处理器

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;


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

完整代码

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);
    }

}
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> {

}
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);
}
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);
    }
}
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;
}
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参数示例

运行结果:

总结

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

您可能感兴趣的文章:
阅读全文