springboot 数据转换 使用和性能分析

系列文章

springboot数据转换 基础篇
springboot数据转换 数据对比
springboot数据转换 v1.2新特性
springboot数据转换 v1.3新特性
springboot数据转换 v1.4特色
springboot数据转换 v1.5特色
springboot数据转换 v1.6特色
springboot数据转换 v1.7特色
springboot数据转换 v1.8特色

前言

springboot数据转换有两个转换方法:dataChange、 dataChangeToBean。
那么它们的使用区别是什么?两者对比,性能又如何?

一、使用区别

1. dataChange

dataChange方法,调用后,以Map<String, Object>类型返回。
key是属性名,value是String类型转换后的值。

Map<String, Object> result = DataChangeUtils.dataChange(data);
System.out.println(result);

2. dataChangeToBean

dataChangeToBean方法,没有返回值,调用后,转换后的数据会保存在入参里面。例:

DataChangeUtils.dataChangeToBean(data);
System.out.println(data);

可以看出,dataChangeToBean还是很符合我们的编码习惯的。

二、性能分析

对两种转换方式做了数据量的耗时测试。结果如下:
在这里插入图片描述

总结

1. dataChange

经过性能分析后,可以看出dataChange的数据转换效率还是比较高的。
不过,它在数据转换后,返回的是一个map,对要以 数据模型(Model) 来做 接口文档(swagger) 功能的朋友来说,不太方便。
如果遇到需要在 数据模型(Model)上标注 日期格式化 或 其他功能等注解 的场景,需要实现自定义兼容模型,把那些注解的功能重写一遍。例:
数据模型标注了日期格式化:
在这里插入图片描述
那么,需要实现以下兼容模型,重写一遍注解的代码逻辑,才能实现日期格式化:
PS:日期格式化 注解,默认已实现,无需用户手动兼容

import com.fasterxml.jackson.annotation.JsonFormat;
import com.stars.datachange.module.Compatible;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.*;

/**
 * 自定义兼容配置
 * @author Hao.
 * @version 1.0
 * @since 2021/12/27 15:46
 */
@Component
public class DataChangeCompatibleConfig implements Compatible {

    @Override
    public void run(Class<?> dataClass, Map<String, Object> result, Collection<Class<? extends Annotation>> annotations) {
        Field[] fields = dataClass.getDeclaredFields();
        for(Field field : fields){
            if(!field.isAccessible()){
                field.setAccessible(true);
            }

            if(annotations.contains(JsonFormat.class)){
                jsonFormat(field, result);
            }

            // 这里加入其它注解的兼容(如:自定义的注解)
            /*if(CollectionUtils.isEmpty(list) || list.contains(...)){
                // ...
            }*/

        }
        if(!dataClass.getSuperclass().equals(Object.class)){
            run(dataClass.getSuperclass(), result, annotations);
        }
    }

    /**
     * 兼容{@link JsonFormat}
     * @param field 字段
     * @param result 数据转换结果集
     * @author zhouhao
     * @since  2021/9/7 10:15
     */
    protected static void jsonFormat(Field field, Map<String, Object> result){
        if (!field.isAnnotationPresent(JsonFormat.class)) {
            return;
        }

        JsonFormat anon = field.getAnnotation(JsonFormat.class);

        String name = field.getName();
        if(Objects.isNull(result.get(name))){
            return;
        }
        result.put(name, DateFormatUtils.format((Date) result.get(name), anon.pattern(), TimeZone.getTimeZone(anon.timezone())));
    }
}

所以,它的应用场景:数据导出接口、大数据量的数据转换接口、对返回值类型没有要求的接口(如无需swagger接口文档查看 等)

2. dataChangeToBean

dataChangeToBean对要以 数据模型(Model) 来做 接口文档(swagger) 功能的朋友来说,还是很友好的。
而且对需要在 数据模型(Model)上标注 日期格式化 或 其他功能等注解 的场景,无缝衔接(无需重写注解实现逻辑)。
不过,经过性能分析后,可以看出,它对于大数据量的数据转换,效率远不如dataChange。
所以,它的应用场景:分页接口、详情接口、小数据量的数据转换接口、需要以数据模型(Model)返回的接口(如swagger接口文档查看、日期格式化 等)

性能分析demo源码

demo获取地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值