前言
当前的一些数据库是是支持Json格式的字段的,我们使用时映射到Java实体也是用JSONObject类型(Json实体类)接收这样就大大减少创建创建实体的繁琐,更方便和灵活数据传输和存储。
在MyabatisPlus中有相应的注解能够实现JSONObject类型字段到数据库json类型字段的映射。但是当我们的查询有联表的需求需要写xml去查询,MyabatisPlus的注解就失效了,我们只能用Mybatis上的功能,这时候我们就需要指定typeHandler。操作如下:
一、具体操作
实体定义:
import cn.hutool.json.JSONObject;
/**
* Description: new java files header..
*
* @author hacah
* @version 1.0
* @date 2024/9/4 15:38
*/
@Data
@ToString
public class StatisticDTO {
private JSONObject plotDefaultOptions;
}
JSONObject使用的是hutool工具包的类。
mapper.xml如下:
<?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.oriseq.mapper.StatisticMapper">
<resultMap id="ExtendResultMap" type="com.oriseq.dtm.dto.StatisticDTO">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="plotDefaultOptions" column="plot_default_options" javaType="cn.hutool.json.JSONObject" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
</resultMap>
<select id="selectExtend" resultMap="ExtendResultMap">
select s.*,spt.name plot_name from statistic s
left join statistic_plot_type spt on s.plot_type_id = spt.id
</select>
</mapper>
重点是我们查询的时候,定义plotDefaultOptions的javaType=“cn.hutool.json.JSONObject”,这是我们绑定在java中的json类。typeHandler=“com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler”,这是mybatisPlus写好的handlers所以我们不用自己写。这样就能实现查询时把数据映射到plotDefaultOptions里。
如果你没有依赖mybatisplus,那就自己实现一个TypeHandler
二、MyabatisPlus上的实现
如果是调用MyabatisPlus的查询(比如:service.getById())直接在实体中添加注解
package com.oriseq.dtm.dto;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.oriseq.dtm.entity.Statistic;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.ToString;
import org.hibernate.validator.constraints.Length;
import java.time.LocalDateTime;
/**
* Description: new java files header..
*
* @author hacah
* @version 1.0
* @date 2024/9/4 15:38
*/
@Data
@ToString
@TableName(value = "statistic", autoResultMap = true)
public class StatisticDTO {
/**
* id
*/
private Integer id;
@NotNull
@TableField(typeHandler = JacksonTypeHandler.class)
private JSONObject plotDefaultOptions;
}
放类上的 @TableName(autoResultMap = true)和放方法上的 @TableField(typeHandler = JacksonTypeHandler.class)
参考或相关文章
- https://blog.csdn.net/weixin_56793669/article/details/128446238