Mysql 中的 josnb 类型的字段跟 mybatis 或 mybatis-plus 交互

188 阅读1分钟

mybatis 和 jsonb 字段交互直接配置自定义映射,如果是 mybatis-plus 直接在实体类中使用注解

mybatis交互实现

  1. mybatis配置自定义映射(设置当前 msg_info 查出来以后映射成json格式的数据)
  2. 实体类关联自定义映射
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.wang.mapper.TestMapper">
  <resultMap id="ListenInfoMap" type="com.wang.entity.ListenInfo">
      
      //这里配置查询的时候 msg_info 字段的映射
    <result column="msg_info" javaType="com.alibaba.fastjson.JSONObject" property="msgInfo" typeHandler = "com.amap.klun.handler.JacksonTypeHandler"></result>
  </resultMap>
</mapper>

package com.amap.klun.entity;

import com.alibaba.fastjson.JSONObject;
import com.amap.qinling.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotEmpty;
import java.io.Serializable;

/**
 */
@Data
@Accessors(chain = true)
@TableName(resultMap = "ListenInfoMap")
public class ListenInfo  implements Serializable {

    private static final long serialVersionUID = 1L;


    @ApiModelProperty(value = "消息内容", required = true)
    
    //这里配置了,新增的时候直接以JOSN数据插入到数据库
    @TableField(value = "msg_info",el = "msgInfo,typeHandler = com.amap.klun.handler.JacksonTypeHandler")
    @NotEmpty(message = "消息内容不能为空")
    private JSONObject msgInfo;


}

mybatis-plus 的实现,只需要配置实体类,注意mybatis-plus版本过低,会导致有的注解的属性可能会不存在



import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
主要配置
    autoResultMap = true
    implements Serializable
    @TableField(typeHandler = FastjsonTypeHandler.class)
*/
@Data

//配置自动映射 autoResultMap = true
@TableName(value = "history",autoResultMap = true)
public class History implements Serializable {

    @TableId(type = IdType.AUTO)
    @TableField("id")
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;


    /**
     * 旧值
     *这里跟autoResultMap配合实现直接查询出JSON数据,而这个typeHandler配置直接可以让当前字段以JSON格式插入
     */
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private JSONObject oldValue;

    /**
     * 新值
     */
    @TableField(typeHandler = FastjsonTypeHandler.class)
    private JSONObject newValue;

}