> 技术文档 > MybatisPlus-17.扩展功能-JSON处理器

MybatisPlus-17.扩展功能-JSON处理器


一.JSON处理器

数据库中有的字段会以JSON格式来进行存储。类型为json类型。但是在java中我们没有这样的数据类型,一般会以字符串接收,这样就会导致如果想要从数据库中获取json格式中的key和value的话会比较麻烦,还要进行字符串操作。那么有没有简单的方法呢?当然有,MybatisPlus提供了很多特殊类型字段的类型处理器,解决特殊字段类型与数据库类型转换的问题。例如处理JSON就可以使用JacksonTypeHandler处理器。

二.定义实体

首先,我们定义一个单独实体类来与info字段的属性匹配:

代码如下:

package com.itheima.mp.domain.po;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructor(staticName = \"of\")public class UserInfo { private Integer age; private String intro; private String gender;}

我们在有参构造中提供of方法,方便一会儿使用of静态方法创建实例化对象。 

三.使用类型处理器

接下来,将User类的info字段修改为UserInfo类型,并声明类型处理器:

同时,在User类上添加一个注解,声明自动映射:

package com.itheima.mp.domain.po;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.JacksonTypeHandler;import com.itheima.mp.enums.UserStatus;import lombok.Data;import java.time.LocalDateTime;@Data@TableName(value = \"tb_user\", autoResultMap = true) // 开启自动映射public class User { /** * 用户id */ @TableId(type = IdType.AUTO) private Long id; /** * 用户名 */ @TableField(\"`username`\") private String username; /** * 密码 */ private String password; /** * 注册手机号 */ private String phone; /** * 详细信息 */ @TableField(typeHandler = JacksonTypeHandler.class) private UserInfo info; /** * 使用状态(1正常 2冻结) */ private UserStatus status; /** * 账户余额 */ private Integer balance; /** * 创建时间 */ private LocalDateTime createTime; /** * 更新时间 */ private LocalDateTime updateTime;}

因为User对象中又包含了UserInfo对象,因此为了保证读取和写入数据库的正确性,保证字段和属性之间的映射关系,要将自动映射autoResultMap设为true。

测试可以发现,所有数据都正确封装到UserInfo当中了:

同时,为了让页面返回的结果也以对象格式返回,我们要修改UserVO中的info字段:

package com.itheima.mp.domain.vo;import com.baomidou.mybatisplus.annotation.TableField;import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;import com.itheima.mp.domain.po.UserInfo;import com.itheima.mp.enums.UserStatus;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.Data;import java.util.List;@Data@ApiModel(description = \"用户VO实体\")public class UserVO { @ApiModelProperty(\"用户id\") private Long id; @ApiModelProperty(\"用户名\") private String username; @ApiModelProperty(\"详细信息\") @TableField(typeHandler = JacksonTypeHandler.class) private UserInfo info; @ApiModelProperty(\"使用状态(1正常 2冻结)\") private UserStatus status; @ApiModelProperty(\"账户余额\") private Integer balance; @ApiModelProperty(\"用户收货地址\") private List addresses;}

此时,在页面查询结果如下: