Mybatis 实现自定义Java对象存储读取 mysql的json属性字段(超简版本,超级好用,兼容多层嵌套对象)

125 阅读1分钟

1.首先是新建一个JsonTypeHandler.class

import com.alibaba.fastjson.JSON;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JsonTypeHandler<T> extends BaseTypeHandler<T> {
    private Class<T> clazz;
    //构造函数 --- >接收一个 Class 对象作为参数,用于指定处理的数据类型。
    public JsonTypeHandler(Class<T> clazz) {
        this.clazz = clazz;
    }
    public JsonTypeHandler() {
    }

    //插入数据将任何类型转换为json
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, JSON.toJSONString(parameter));
    }

    //获取数据json转换类型
    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return JSON.parseObject(rs.getString(columnName), clazz);
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return null;
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return null;
    }
}

2. 对应字段指定该 typeHandle

   mybatis-plus 实现(代码片段)
   
配置点一:
@TableName(value = "hz_font_course", autoResultMap = true)
public class XXXXXXTable

配置二:
   @ApiModelProperty(value = "课程字库")
   @TableField(value = "course_chapters", typeHandler = JsonTypeHandler.class)
   private List<HzFontChapterBo> courseChapters;
Mapper.xml 主要使用是在xml中配置类型 typeHandler=“com.by.config.JsonTypeHandler”

<?xml version="1.0" encoding="UTF-8" ?>
           <!DOCTYPE mapper
                   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                   "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
   <-- -->
   <mapper namespace="com.by.dao.UserDao">
    <resultMap id="UserMap" type="com.by.moder.User">
       <result property="id" column="id"/>
       <result property="addressBook" column="addressBook" typeHandler="com.by.config.JsonTypeHandler"/>
       <result property="friendAddress" column="friendAddress" typeHandler="com.by.config.JsonTypeHandler"/>
       <result property="pet" column="pet" typeHandler="com.by.config.JsonTypeHandler"/>
    </resultMap>

    <insert id="add">
        insert into user2 (name, addressBook, friendAddress,pet)
        values (#{name}, #{addressBook,typeHandler=com.by.config.JsonTypeHandler}, #{friendAddress,typeHandler=com.by.config.JsonTypeHandler},#{pet,typeHandler=com.by.config.JsonTypeHandler})
    </insert>
    <select id="select" resultMap="UserMap">
        select * from user2
    </select>
   </mapper>

3.效果

新增 image.png 查询

image.png