我是靠谱客的博主 长情小丸子,最近开发中收集的这篇文章主要介绍mybatis通用typeHandler(将mysql的json类型转换为java对象),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

背景:订单快照信息(收货地址、商品信息、优惠券信息等)存储,使用Mysql的json类型字段存放一个java对象的json,但是mybatis不支持json类型,所以通过扩展typeHandler来实现mysql的json字段与java对象的自动转换,以下为通用typeHandler源码,可以用来自动转换java类型。

直接上源码:

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

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.shikuai.domain.json.CommodityJson;
import com.shikuai.domain.json.CouponJson;
import com.shikuai.domain.json.CustomerAddressJson;


/**
 * <b>Description:用以mysql中json格式的字段,进行转换的自定义转换器,转换为实体类的T类型 属性</b>
 * <br><b>ClassName:</b> GenericTypeHandler
 * <br><b>Date:</b> 2019年2月17日 下午4:25:07
 * <br>@author <b>jianb.jiang</b>
 */
@MappedTypes(value = {JSONObject.class, CustomerAddressJson.class, CouponJson.class, CommodityJson.class})
@MappedJdbcTypes(value = {JdbcType.VARCHAR}, includeNullJdbcType = true)
public class GenericTypeHandler<T extends Object> extends BaseTypeHandler<T> {

    private Class<T> clazz;
    
    public GenericTypeHandler(Class<T> clazz) {
        if (clazz == null) throw new IllegalArgumentException("Type argument cannot be null");
        this.clazz = clazz;
    }
    
    /**
     * 设置非空参数
     * @param ps
     * @param i
     * @param parameter
     * @param jdbcType
     * @throws SQLException
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, JSON.toJSONString(parameter));
    }

    /**
     * 根据列名,获取可以为空的结果
     * @param rs
     * @param columnName
     * @return
     * @throws SQLException
     */
    @Override
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String sqlJson = rs.getString(columnName);
        if (null != sqlJson) {
            return JSONObject.parseObject(sqlJson, clazz);
        }
        return null;
    }

    /**
     * 根据列索引,获取可以为空的结果
     * @param rs
     * @param columnIndex
     * @return
     * @throws SQLException
     */
    @Override
    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String sqlJson = rs.getString(columnIndex);
        if (null != sqlJson) {
            return JSONObject.parseObject(sqlJson, clazz);
        }
        return null;
    }

    @Override
    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String sqlJson = cs.getString(columnIndex);
        if (null != sqlJson) {
            return JSONObject.parseObject(sqlJson, clazz);
        }
        return null;
    }
}

注意:

1、@MappedTypes注解中的类代表此转换器可以自动转换为的java对象,@MappedJdbcTypes注解中设置的是对应的jdbctype,mysql的json对象对应的jdbctype为VARCHAR。

2、spring boot配置中开启typeHandler包路径的自动扫描配置:

mybatis.type-handlers-package=com.shikuai.dao.handler

3、使用上,只需在pojo的属性中定义需要自动转换的java对象属性,如@MappedTypes注解中的CustomerAddressJson,在订单的pojo中有一个属性:


    /**
     * 收货地址快照json
     */
    private CustomerAddressJson reAddressJson;

 

操作和其他pojo的属性完全一样,如果像对json对象中的某个属性进行操作,可以使用mysql支持的json相关函数,具体可以参考这篇文章:https://www.cnblogs.com/ooo0/p/9309277.html

遗留和扩展:如果pojo对象有一个集合属性呢?这种如何处理?是否可以自定义一个ArrayTypeHandler?pojo中存在集合属性是否本身就不合理是个伪需求?对于集合属性的情况,有一篇文章可以参考:https://www.cnblogs.com/kylindai/p/3563818.html

参考文档:http://www.mybatis.org/mybatis-3/zh/configuration.html#typeHandlers

 

最后

以上就是长情小丸子为你收集整理的mybatis通用typeHandler(将mysql的json类型转换为java对象)的全部内容,希望文章能够帮你解决mybatis通用typeHandler(将mysql的json类型转换为java对象)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(97)

评论列表共有 0 条评论

立即
投稿
返回
顶部