一.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<AddressVO> addresses;
}
此時,在頁面查詢結果如下:
