Mybtais Plus 存取json转为java对象

@Data
@TableName(value = "order", autoResultMap = true)
public class Order implements Serializable {

    private static final long serialVersionUID=1L;

    /**
     * 主键
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    /**
     * 订单属性(JSON),需要自定义TypeHandler,使用JacksonTypeHandler,最后对象会变成linkedHashMap类型,
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<OrderAttribute> orderAttribute;
    
    /**
     * 图片(JSON),可正常转换
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private List<String> images;
}

自定义typeHandler并使用,共有两个步骤

1. 自定义TypeHandler,继承BaseTypeHandler或者实现TypeHandler

import cn.hutool.json.JSONUtil;
/**
	继承BaseTypeHandler,实现一个json转object通用的类
	注意:这里的json工具类使用的时hutool中的JSONUtil,用fastjson或其他json框架的注意替换
*/
public class AbstractObjectTypeHandler<T> extends BaseTypeHandler<T> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, JSONUtil.toJsonStr(parameter));
    }

    @Override
    public T getNullableResult(ResultSet rs, String columnName)
        throws SQLException {
        String data = rs.getString(columnName);
        return StringUtils.isBlank(data) ? null : JSONUtil.toBean(data, (Class<T>) getRawType());
    }

    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String data = rs.getString(columnIndex);
        return StringUtils.isBlank(data) ? null : JSONUtil.toBean(data, (Class<T>) getRawType());
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex)
        throws SQLException {
        String data = cs.getString(columnIndex);
        return StringUtils.isBlank(data) ? null : JSONUtil.toBean(data, (Class<T>) getRawType());
    }
}

@MappedJdbcTypes({JdbcType.VARCHAR})
@MappedTypes({Info.class})
public class UserInfoHandler extends  AbstractObjectTypeHandler<Info>{
    // 继承通用json转Object的AbstractObjectTypeHandler,指定所转class类型
}

public class User{
    private String name;
    private Integer age;
    private Info info;
}

public class Info{
    private String usedName;
    private Integer height;
}

2. 在mapper中配置所需要自定义TypeHandler的地方,如resultMap中指定参数。

我们定义了MyDateTypeHandler,需要在mapper中配置: 查询时我们配置resultMap,插入、修改时,我们有三种配置方式

  1. javaType,jdbcType ,TypeHandler都指定
  2. 指定javaType,jdbcType
  3. 只指定typeHandle
<!--配置resultMap-->
<resultMap id="userResultMap" type="org.sang.bean.User">
        <result typeHandler="com.zyy.handler.UserInfoHandler" column="info" javaType="com.zyy.domain.Info"
                jdbcType="VARCHAR"
                property="info"/>
</resultMap>
<!--查询-->
<select id="getUser" resultMap="userResultMap">
        select * from user
</select>

<!--1. javaType,jdbcType ,TypeHandler都指定-->
<insert id="insertUser" parameterType="org.sang.bean.User">
        INSERT INTO user(name,age,info) VALUES (#{name},#{age},#{info,javaType=com.zyy.domain.Info,jdbcType=VARCHAR,typeHandler=com.zyy.handler.UserInfoHandler})
 </insert>

<!--2. 指定javaType,jdbcType-->
<insert id="insertUser2">
        INSERT INTO user(name,age,info) VALUES (#{name},#{age},#{info,javaType=com.zyy.domain.Info,jdbcType=VARCHAR})
 </insert>

<!--3. 只指定typeHandler-->
<insert id="insertUser3">
        INSERT INTO user(name,age,info)  VALUES (#{name},#{age},#{info,typeHandler=com.zyy.handler.UserInfoHandler})
</insert>