系列文章
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接口文档查看、日期格式化 等)