From 1b752c35cc0c7f51922351d5bcca88a043002ae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90li?= <15040126243@163.com> Date: Mon, 6 Dec 2021 10:40:57 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BD=BF=E7=94=A8=20Cglib=20=E9=87=8D?= =?UTF-8?q?=E6=9E=84=20BeanCopyUtils=20=E6=80=A7=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=BC=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/mybatisplus/core/IServicePlus.java | 43 ++------- .../mybatisplus/core/ServicePlusImpl.java | 25 +++-- .../com/ruoyi/common/utils/BeanCopyUtils.java | 95 ++++++++++++++----- 3 files changed, 91 insertions(+), 72 deletions(-) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java index 815791bf0..6b373ffcb 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/IServicePlus.java @@ -1,6 +1,5 @@ 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.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.IService; @@ -23,14 +22,9 @@ public interface IServicePlus extends IService { /** * @param id 主键id - * @param copyOptions copy条件 * @return V对象 */ - V getVoById(Serializable id, CopyOptions copyOptions); - - default V getVoById(Serializable id) { - return getVoById(id, new CopyOptions()); - } + V getVoById(Serializable id); /** * @param convertor 自定义转换器 @@ -41,14 +35,9 @@ public interface IServicePlus extends IService { /** * @param idList id列表 - * @param copyOptions copy条件 * @return V对象 */ - List listVoByIds(Collection idList, CopyOptions copyOptions); - - default List listVoByIds(Collection idList) { - return listVoByIds(idList, new CopyOptions()); - } + List listVoByIds(Collection idList); /** * @param convertor 自定义转换器 @@ -64,14 +53,9 @@ public interface IServicePlus extends IService { /** * @param columnMap 表字段 map 对象 - * @param copyOptions copy条件 * @return V对象 */ - List listVoByMap(Map columnMap, CopyOptions copyOptions); - - default List listVoByMap(Map columnMap) { - return listVoByMap(columnMap, new CopyOptions()); - } + List listVoByMap(Map columnMap); /** * @param convertor 自定义转换器 @@ -87,14 +71,9 @@ public interface IServicePlus extends IService { /** * @param queryWrapper 查询条件 - * @param copyOptions copy条件 * @return V对象 */ - V getVoOne(Wrapper queryWrapper, CopyOptions copyOptions); - - default V getVoOne(Wrapper queryWrapper) { - return getVoOne(queryWrapper, new CopyOptions()); - } + V getVoOne(Wrapper queryWrapper); /** * @param convertor 自定义转换器 @@ -105,14 +84,9 @@ public interface IServicePlus extends IService { /** * @param queryWrapper 查询条件 - * @param copyOptions copy条件 * @return V对象 */ - List listVo(Wrapper queryWrapper, CopyOptions copyOptions); - - default List listVo(Wrapper queryWrapper) { - return listVo(queryWrapper, new CopyOptions()); - } + List listVo(Wrapper queryWrapper); /** * @param convertor 自定义转换器 @@ -139,14 +113,9 @@ public interface IServicePlus extends IService { /** * @param page 分页对象 * @param queryWrapper 查询条件 - * @param copyOptions copy条件 * @return V对象 */ - PagePlus pageVo(PagePlus page, Wrapper queryWrapper, CopyOptions copyOptions); - - default PagePlus pageVo(PagePlus page, Wrapper queryWrapper) { - return pageVo(page, queryWrapper, new CopyOptions()); - } + PagePlus pageVo(PagePlus page, Wrapper queryWrapper); /** * @param convertor 自定义转换器 diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java index e9c1f191e..4de5b326d 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/mybatisplus/core/ServicePlusImpl.java @@ -1,6 +1,5 @@ package com.ruoyi.common.core.mybatisplus.core; -import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; @@ -165,9 +164,9 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param id 主键ID */ @Override - public V getVoById(Serializable id, CopyOptions copyOptions) { + public V getVoById(Serializable id) { T t = getBaseMapper().selectById(id); - return BeanCopyUtils.oneCopy(t, copyOptions, voClass); + return BeanCopyUtils.copy(t, voClass); } /** @@ -176,12 +175,12 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param idList 主键ID列表 */ @Override - public List listVoByIds(Collection idList, CopyOptions copyOptions) { + public List listVoByIds(Collection idList) { List list = getBaseMapper().selectBatchIds(idList); if (list == null) { return null; } - return BeanCopyUtils.listCopy(list, copyOptions, voClass); + return BeanCopyUtils.copyList(list, voClass); } /** @@ -190,12 +189,12 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param columnMap 表字段 map 对象 */ @Override - public List listVoByMap(Map columnMap, CopyOptions copyOptions) { + public List listVoByMap(Map columnMap) { List list = getBaseMapper().selectByMap(columnMap); if (list == null) { return null; } - return BeanCopyUtils.listCopy(list, copyOptions, voClass); + return BeanCopyUtils.copyList(list, voClass); } /** @@ -205,9 +204,9 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ @Override - public V getVoOne(Wrapper queryWrapper, CopyOptions copyOptions) { + public V getVoOne(Wrapper queryWrapper) { T t = getOne(queryWrapper, true); - return BeanCopyUtils.oneCopy(t, copyOptions, voClass); + return BeanCopyUtils.copy(t, voClass); } /** @@ -216,12 +215,12 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper} */ @Override - public List listVo(Wrapper queryWrapper, CopyOptions copyOptions) { + public List listVo(Wrapper queryWrapper) { List list = getBaseMapper().selectList(queryWrapper); if (list == null) { return null; } - return BeanCopyUtils.listCopy(list, copyOptions, voClass); + return BeanCopyUtils.copyList(list, voClass); } /** @@ -231,9 +230,9 @@ public class ServicePlusImpl, T, V> extends ServiceI * @param queryWrapper 实体对象封装操作类 */ @Override - public PagePlus pageVo(PagePlus page, Wrapper queryWrapper, CopyOptions copyOptions) { + public PagePlus pageVo(PagePlus page, Wrapper queryWrapper) { PagePlus result = getBaseMapper().selectPage(page, queryWrapper); - List volist = BeanCopyUtils.listCopy(result.getRecords(), copyOptions, voClass); + List volist = BeanCopyUtils.copyList(result.getRecords(), voClass); result.setRecordsVo(volist); return result; } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java index 8bf40d16a..3bc443435 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanCopyUtils.java @@ -1,16 +1,16 @@ 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.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; +import cn.hutool.extra.cglib.CglibUtil; import java.util.List; -import java.util.stream.Collectors; +import java.util.Map; /** - * bean深拷贝工具 + * bean深拷贝工具(基于 cglib 性能优异) * * @author Lion Li */ @@ -19,48 +19,99 @@ public class BeanCopyUtils { /** * 单对象基于class创建拷贝 * - * @param source 数据来源实体 - * @param copyOptions copy条件 - * @param desc 描述对象 转换后的对象 + * @param source 数据来源实体 + * @param desc 描述对象 转换后的对象 * @return desc */ - public static V oneCopy(T source, CopyOptions copyOptions, Class desc) { - V v = ReflectUtil.newInstanceIfPossible(desc); - return oneCopy(source, copyOptions, v); + public static V copy(T source, Class desc) { + if (ObjectUtil.isNull(source)) { + return null; + } + if (ObjectUtil.isNull(desc)) { + return null; + } + return CglibUtil.copy(source, desc); } /** * 单对象基于对象创建拷贝 * - * @param source 数据来源实体 - * @param copyOptions copy条件 - * @param desc 转换后的对象 + * @param source 数据来源实体 + * @param desc 转换后的对象 * @return desc */ - public static V oneCopy(T source, CopyOptions copyOptions, V desc) { + public static V copy(T source, V desc) { if (ObjectUtil.isNull(source)) { return null; } - return BeanCopier.create(source, desc, copyOptions).copy(); + if (ObjectUtil.isNull(desc)) { + return null; + } + CglibUtil.copy(source, desc); + return desc; } /** * 列表对象基于class创建拷贝 * - * @param sourceList 数据来源实体列表 - * @param copyOptions copy条件 - * @param desc 描述对象 转换后的对象 + * @param sourceList 数据来源实体列表 + * @param desc 描述对象 转换后的对象 * @return desc */ - public static List listCopy(List sourceList, CopyOptions copyOptions, Class desc) { + public static List copyList(List sourceList, Class desc) { if (ObjectUtil.isNull(sourceList)) { return null; } if (CollUtil.isEmpty(sourceList)) { return CollUtil.newArrayList(); } - return sourceList.stream() - .map(source -> oneCopy(source, copyOptions, desc)) - .collect(Collectors.toList()); + return CglibUtil.copyList(sourceList, () -> ReflectUtil.newInstanceIfPossible(desc)); + } + + /** + * bean拷贝到map + * + * @param bean 数据来源实体 + * @return map对象 + */ + public static Map 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 mapToBean(Map map, Class 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 mapToBean(Map map, T bean) { + if (MapUtil.isEmpty(map)) { + return null; + } + if (ObjectUtil.isNull(bean)) { + return null; + } + return CglibUtil.fillBean(map, bean); } }