update 使用 Cglib 重构 BeanCopyUtils 性能优异

This commit is contained in:
疯狂的狮子li 2021-12-06 10:40:57 +08:00
parent 8b9d3541dd
commit 1b752c35cc
3 changed files with 91 additions and 72 deletions

View File

@ -1,6 +1,5 @@
package com.ruoyi.common.core.mybatisplus.core; package com.ruoyi.common.core.mybatisplus.core;
import cn.hutool.core.bean.copier.CopyOptions;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
@ -23,14 +22,9 @@ public interface IServicePlus<T, V> extends IService<T> {
/** /**
* @param id 主键id * @param id 主键id
* @param copyOptions copy条件
* @return V对象 * @return V对象
*/ */
V getVoById(Serializable id, CopyOptions copyOptions); V getVoById(Serializable id);
default V getVoById(Serializable id) {
return getVoById(id, new CopyOptions());
}
/** /**
* @param convertor 自定义转换器 * @param convertor 自定义转换器
@ -41,14 +35,9 @@ public interface IServicePlus<T, V> extends IService<T> {
/** /**
* @param idList id列表 * @param idList id列表
* @param copyOptions copy条件
* @return V对象 * @return V对象
*/ */
List<V> listVoByIds(Collection<? extends Serializable> idList, CopyOptions copyOptions); List<V> listVoByIds(Collection<? extends Serializable> idList);
default List<V> listVoByIds(Collection<? extends Serializable> idList) {
return listVoByIds(idList, new CopyOptions());
}
/** /**
* @param convertor 自定义转换器 * @param convertor 自定义转换器
@ -64,14 +53,9 @@ public interface IServicePlus<T, V> extends IService<T> {
/** /**
* @param columnMap 表字段 map 对象 * @param columnMap 表字段 map 对象
* @param copyOptions copy条件
* @return V对象 * @return V对象
*/ */
List<V> listVoByMap(Map<String, Object> columnMap, CopyOptions copyOptions); List<V> listVoByMap(Map<String, Object> columnMap);
default List<V> listVoByMap(Map<String, Object> columnMap) {
return listVoByMap(columnMap, new CopyOptions());
}
/** /**
* @param convertor 自定义转换器 * @param convertor 自定义转换器
@ -87,14 +71,9 @@ public interface IServicePlus<T, V> extends IService<T> {
/** /**
* @param queryWrapper 查询条件 * @param queryWrapper 查询条件
* @param copyOptions copy条件
* @return V对象 * @return V对象
*/ */
V getVoOne(Wrapper<T> queryWrapper, CopyOptions copyOptions); V getVoOne(Wrapper<T> queryWrapper);
default V getVoOne(Wrapper<T> queryWrapper) {
return getVoOne(queryWrapper, new CopyOptions());
}
/** /**
* @param convertor 自定义转换器 * @param convertor 自定义转换器
@ -105,14 +84,9 @@ public interface IServicePlus<T, V> extends IService<T> {
/** /**
* @param queryWrapper 查询条件 * @param queryWrapper 查询条件
* @param copyOptions copy条件
* @return V对象 * @return V对象
*/ */
List<V> listVo(Wrapper<T> queryWrapper, CopyOptions copyOptions); List<V> listVo(Wrapper<T> queryWrapper);
default List<V> listVo(Wrapper<T> queryWrapper) {
return listVo(queryWrapper, new CopyOptions());
}
/** /**
* @param convertor 自定义转换器 * @param convertor 自定义转换器
@ -139,14 +113,9 @@ public interface IServicePlus<T, V> extends IService<T> {
/** /**
* @param page 分页对象 * @param page 分页对象
* @param queryWrapper 查询条件 * @param queryWrapper 查询条件
* @param copyOptions copy条件
* @return V对象 * @return V对象
*/ */
PagePlus<T, V> pageVo(PagePlus<T, V> page, Wrapper<T> queryWrapper, CopyOptions copyOptions); PagePlus<T, V> pageVo(PagePlus<T, V> page, Wrapper<T> queryWrapper);
default PagePlus<T, V> pageVo(PagePlus<T, V> page, Wrapper<T> queryWrapper) {
return pageVo(page, queryWrapper, new CopyOptions());
}
/** /**
* @param convertor 自定义转换器 * @param convertor 自定义转换器

View File

@ -1,6 +1,5 @@
package com.ruoyi.common.core.mybatisplus.core; package com.ruoyi.common.core.mybatisplus.core;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
@ -165,9 +164,9 @@ public class ServicePlusImpl<M extends BaseMapperPlus<T>, T, V> extends ServiceI
* @param id 主键ID * @param id 主键ID
*/ */
@Override @Override
public V getVoById(Serializable id, CopyOptions copyOptions) { public V getVoById(Serializable id) {
T t = getBaseMapper().selectById(id); T t = getBaseMapper().selectById(id);
return BeanCopyUtils.oneCopy(t, copyOptions, voClass); return BeanCopyUtils.copy(t, voClass);
} }
/** /**
@ -176,12 +175,12 @@ public class ServicePlusImpl<M extends BaseMapperPlus<T>, T, V> extends ServiceI
* @param idList 主键ID列表 * @param idList 主键ID列表
*/ */
@Override @Override
public List<V> listVoByIds(Collection<? extends Serializable> idList, CopyOptions copyOptions) { public List<V> listVoByIds(Collection<? extends Serializable> idList) {
List<T> list = getBaseMapper().selectBatchIds(idList); List<T> list = getBaseMapper().selectBatchIds(idList);
if (list == null) { if (list == null) {
return null; return null;
} }
return BeanCopyUtils.listCopy(list, copyOptions, voClass); return BeanCopyUtils.copyList(list, voClass);
} }
/** /**
@ -190,12 +189,12 @@ public class ServicePlusImpl<M extends BaseMapperPlus<T>, T, V> extends ServiceI
* @param columnMap 表字段 map 对象 * @param columnMap 表字段 map 对象
*/ */
@Override @Override
public List<V> listVoByMap(Map<String, Object> columnMap, CopyOptions copyOptions) { public List<V> listVoByMap(Map<String, Object> columnMap) {
List<T> list = getBaseMapper().selectByMap(columnMap); List<T> list = getBaseMapper().selectByMap(columnMap);
if (list == null) { if (list == null) {
return null; return null;
} }
return BeanCopyUtils.listCopy(list, copyOptions, voClass); return BeanCopyUtils.copyList(list, voClass);
} }
/** /**
@ -205,9 +204,9 @@ public class ServicePlusImpl<M extends BaseMapperPlus<T>, T, V> extends ServiceI
* @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
*/ */
@Override @Override
public V getVoOne(Wrapper<T> queryWrapper, CopyOptions copyOptions) { public V getVoOne(Wrapper<T> queryWrapper) {
T t = getOne(queryWrapper, true); T t = getOne(queryWrapper, true);
return BeanCopyUtils.oneCopy(t, copyOptions, voClass); return BeanCopyUtils.copy(t, voClass);
} }
/** /**
@ -216,12 +215,12 @@ public class ServicePlusImpl<M extends BaseMapperPlus<T>, T, V> extends ServiceI
* @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}
*/ */
@Override @Override
public List<V> listVo(Wrapper<T> queryWrapper, CopyOptions copyOptions) { public List<V> listVo(Wrapper<T> queryWrapper) {
List<T> list = getBaseMapper().selectList(queryWrapper); List<T> list = getBaseMapper().selectList(queryWrapper);
if (list == null) { if (list == null) {
return null; return null;
} }
return BeanCopyUtils.listCopy(list, copyOptions, voClass); return BeanCopyUtils.copyList(list, voClass);
} }
/** /**
@ -231,9 +230,9 @@ public class ServicePlusImpl<M extends BaseMapperPlus<T>, T, V> extends ServiceI
* @param queryWrapper 实体对象封装操作类 * @param queryWrapper 实体对象封装操作类
*/ */
@Override @Override
public PagePlus<T, V> pageVo(PagePlus<T, V> page, Wrapper<T> queryWrapper, CopyOptions copyOptions) { public PagePlus<T, V> pageVo(PagePlus<T, V> page, Wrapper<T> queryWrapper) {
PagePlus<T, V> result = getBaseMapper().selectPage(page, queryWrapper); PagePlus<T, V> result = getBaseMapper().selectPage(page, queryWrapper);
List<V> volist = BeanCopyUtils.listCopy(result.getRecords(), copyOptions, voClass); List<V> volist = BeanCopyUtils.copyList(result.getRecords(), voClass);
result.setRecordsVo(volist); result.setRecordsVo(volist);
return result; return result;
} }

View File

@ -1,16 +1,16 @@
package com.ruoyi.common.utils; package com.ruoyi.common.utils;
import cn.hutool.core.bean.copier.BeanCopier;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.ReflectUtil;
import cn.hutool.extra.cglib.CglibUtil;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.Map;
/** /**
* bean深拷贝工具 * bean深拷贝工具(基于 cglib 性能优异)
* *
* @author Lion Li * @author Lion Li
*/ */
@ -20,47 +20,98 @@ public class BeanCopyUtils {
* 单对象基于class创建拷贝 * 单对象基于class创建拷贝
* *
* @param source 数据来源实体 * @param source 数据来源实体
* @param copyOptions copy条件
* @param desc 描述对象 转换后的对象 * @param desc 描述对象 转换后的对象
* @return desc * @return desc
*/ */
public static <T, V> V oneCopy(T source, CopyOptions copyOptions, Class<V> desc) { public static <T, V> V copy(T source, Class<V> desc) {
V v = ReflectUtil.newInstanceIfPossible(desc); if (ObjectUtil.isNull(source)) {
return oneCopy(source, copyOptions, v); return null;
}
if (ObjectUtil.isNull(desc)) {
return null;
}
return CglibUtil.copy(source, desc);
} }
/** /**
* 单对象基于对象创建拷贝 * 单对象基于对象创建拷贝
* *
* @param source 数据来源实体 * @param source 数据来源实体
* @param copyOptions copy条件
* @param desc 转换后的对象 * @param desc 转换后的对象
* @return desc * @return desc
*/ */
public static <T, V> V oneCopy(T source, CopyOptions copyOptions, V desc) { public static <T, V> V copy(T source, V desc) {
if (ObjectUtil.isNull(source)) { if (ObjectUtil.isNull(source)) {
return null; return null;
} }
return BeanCopier.create(source, desc, copyOptions).copy(); if (ObjectUtil.isNull(desc)) {
return null;
}
CglibUtil.copy(source, desc);
return desc;
} }
/** /**
* 列表对象基于class创建拷贝 * 列表对象基于class创建拷贝
* *
* @param sourceList 数据来源实体列表 * @param sourceList 数据来源实体列表
* @param copyOptions copy条件
* @param desc 描述对象 转换后的对象 * @param desc 描述对象 转换后的对象
* @return desc * @return desc
*/ */
public static <T, V> List<V> listCopy(List<T> sourceList, CopyOptions copyOptions, Class<V> desc) { public static <T, V> List<V> copyList(List<T> sourceList, Class<V> desc) {
if (ObjectUtil.isNull(sourceList)) { if (ObjectUtil.isNull(sourceList)) {
return null; return null;
} }
if (CollUtil.isEmpty(sourceList)) { if (CollUtil.isEmpty(sourceList)) {
return CollUtil.newArrayList(); return CollUtil.newArrayList();
} }
return sourceList.stream() return CglibUtil.copyList(sourceList, () -> ReflectUtil.newInstanceIfPossible(desc));
.map(source -> oneCopy(source, copyOptions, desc)) }
.collect(Collectors.toList());
/**
* bean拷贝到map
*
* @param bean 数据来源实体
* @return map对象
*/
public static <T> Map<String, Object> copyToMap(T bean) {
if (ObjectUtil.isNull(bean)) {
return null;
}
return CglibUtil.toMap(bean);
}
/**
* map拷贝到bean
*
* @param map 数据来源
* @param beanClass bean类
* @return bean对象
*/
public static <T> T mapToBean(Map<String, Object> map, Class<T> beanClass) {
if (MapUtil.isEmpty(map)) {
return null;
}
if (ObjectUtil.isNull(beanClass)) {
return null;
}
return CglibUtil.toBean(map, beanClass);
}
/**
* map拷贝到bean
*
* @param map 数据来源
* @param bean bean对象
* @return bean对象
*/
public static <T> T mapToBean(Map<String, Object> map, T bean) {
if (MapUtil.isEmpty(map)) {
return null;
}
if (ObjectUtil.isNull(bean)) {
return null;
}
return CglibUtil.fillBean(map, bean);
} }
} }