From b9f861685aab17be5d5d544ae65aa7cfa6da6155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Mon, 6 Jan 2025 03:25:53 +0000 Subject: [PATCH 1/4] =?UTF-8?q?update=20MapstructPlus=E5=A2=9E=E5=BC=BA?= =?UTF-8?q?=EF=BC=8Cbean=E8=BD=AC=E6=8D=A2=E8=BF=87=E7=A8=8B=E6=94=AF?= =?UTF-8?q?=E6=8C=81Consumer=E6=B6=88=E8=B4=B9=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋辞未寒 <545073804@qq.com> --- .../linpeilie/BaseCycleAvoidingMapper.java | 66 +++++++++ .../io/github/linpeilie/BaseMapMapper.java | 19 +++ .../java/io/github/linpeilie/BaseMapper.java | 53 +++++++ .../java/io/github/linpeilie/Converter.java | 130 ++++++++++++++++++ .../common/core/utils/MapstructUtils.java | 116 +++++++++++----- 5 files changed, 350 insertions(+), 34 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapMapper.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapper.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/Converter.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java new file mode 100644 index 000000000..d18d67fd4 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java @@ -0,0 +1,66 @@ +package io.github.linpeilie; + +import org.mapstruct.Context; +import org.mapstruct.MappingTarget; + +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +public interface BaseCycleAvoidingMapper extends BaseMapper { + + T convert(S source, @Context CycleAvoidingMappingContext context); + + default T convert(S source, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { + T bean = convert(source,context); + if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { + beanConsumer.accept(bean); + } + return bean; + } + + T convert(S source, @MappingTarget T target, @Context CycleAvoidingMappingContext context); + + default T convert(S source, @MappingTarget T target, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { + T bean = convert(source,target,context); + if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { + beanConsumer.accept(bean); + } + return bean; + } + + default List convert(List sourceList, @Context CycleAvoidingMappingContext context) { + return sourceList.stream() + .map(item -> convert(item, context)) + .collect(Collectors.toList()); + } + + default List convert(List sourceList, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { + // 如果 beanConsumer 本来就为 null,则不再调用带 Consumer 参数的 convert 方法,避免在循环中进行不必要的非空判断 + if (Objects.nonNull(beanConsumer)) { + return sourceList.stream() + .map(source -> convert(source, beanConsumer)) + .collect(Collectors.toList()); + } + return sourceList.stream() + .map(item -> convert(item, context)) + .collect(Collectors.toList()); + } + + @Override + default T convert(S source) { + return convert(source, new CycleAvoidingMappingContext()); + } + + @Override + default T convert(S source, @MappingTarget T target) { + return convert(source, new CycleAvoidingMappingContext()); + } + + @Override + default List convert(List sourceList) { + return convert(sourceList, new CycleAvoidingMappingContext()); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapMapper.java b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapMapper.java new file mode 100644 index 000000000..2c2511ae3 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapMapper.java @@ -0,0 +1,19 @@ +package io.github.linpeilie; + +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; + +public interface BaseMapMapper { + + T convert(Map map); + + default T convert(Map map, Consumer beanConsumer) { + T bean = convert(map); + if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { + beanConsumer.accept(bean); + } + return bean; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapper.java b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapper.java new file mode 100644 index 000000000..3172bea71 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapper.java @@ -0,0 +1,53 @@ +package io.github.linpeilie; + +import io.github.linpeilie.utils.CollectionUtils; +import org.mapstruct.MappingTarget; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +public interface BaseMapper { + + T convert(S source); + + default T convert(S source, Consumer beanConsumer) { + T bean = convert(source); + if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { + beanConsumer.accept(bean); + } + return bean; + } + + T convert(S source, @MappingTarget T target); + + default T convert(S source, @MappingTarget T target, Consumer beanConsumer) { + T bean = convert(source,target); + if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { + beanConsumer.accept(bean); + } + return bean; + } + + default List convert(List sourceList) { + return convert(sourceList, null); + } + + default List convert(List sourceList, Consumer beanConsumer) { + if (CollectionUtils.isEmpty(sourceList)) { + return new ArrayList<>(); + } + // 如果 beanConsumer 本来就为 null,则不再调用带 Consumer 参数的 convert 方法,避免在循环中进行不必要的非空判断 + if (Objects.nonNull(beanConsumer)) { + return sourceList.stream() + .map(source -> convert(source, beanConsumer)) + .collect(Collectors.toList()); + } + return sourceList.stream() + .map(this::convert) + .collect(Collectors.toList()); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/Converter.java b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/Converter.java new file mode 100644 index 000000000..aa7b86145 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/Converter.java @@ -0,0 +1,130 @@ +package io.github.linpeilie; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Consumer; + +public class Converter { + + private final ConverterFactory converterFactory; + + public Converter() { + this.converterFactory = new DefaultConverterFactory(); + } + + public Converter(final ConverterFactory converterFactory) { + this.converterFactory = converterFactory; + } + + public T convert(S source, Class targetType) { + return convert(source, targetType, (Consumer) null); + } + + @SuppressWarnings("unchecked") + public T convert(S source, Class targetType, Consumer beanConsumer) { + if (source == null) { + return null; + } + BaseMapper mapper = (BaseMapper) converterFactory.getMapper(source.getClass(), targetType); + if (mapper != null) { + return mapper.convert(source, beanConsumer); + } + throw new ConvertException( + "cannot find converter from " + source.getClass().getSimpleName() + " to " + targetType.getSimpleName()); + } + + public T convert(S source, T target) { + return convert(source, target, null); + } + + @SuppressWarnings("unchecked") + public T convert(S source, T target, Consumer beanConsumer) { + if (source == null) { + return null; + } + if (target == null) { + return null; + } + Class sourceClass = source.getClass(); + BaseMapper mapper = (BaseMapper) converterFactory.getMapper(sourceClass, target.getClass()); + if (mapper != null) { + return mapper.convert(source, target, beanConsumer); + } + throw new ConvertException("cannot find converter from " + sourceClass.getSimpleName() + " to " + + target.getClass().getSimpleName()); + } + + public List convert(List sourceList, Class targetType) { + return convert(sourceList, targetType, (Consumer) null); + } + + @SuppressWarnings("unchecked") + public List convert(List sourceList, Class targetType, Consumer beanConsumer) { + if (sourceList == null || sourceList.isEmpty()) { + return new ArrayList<>(); + } + Class sourceType = sourceList.getFirst().getClass(); + BaseMapper mapper = (BaseMapper) converterFactory.getMapper(sourceType, targetType); + if (mapper != null) { + return mapper.convert(sourceList, beanConsumer); + } + throw new ConvertException("cannot find converter from " + sourceType.getSimpleName() + " to " + + targetType.getSimpleName()); + } + + public T convert(S source, Class target, CycleAvoidingMappingContext context) { + return convert(source, target, context, null); + } + + @SuppressWarnings("unchecked") + public T convert(S source, Class targetType, CycleAvoidingMappingContext context, Consumer beanConsumer) { + if (source == null) { + return null; + } + BaseCycleAvoidingMapper mapper = (BaseCycleAvoidingMapper) converterFactory.getCycleAvoidingMapper(source.getClass(), targetType); + if (mapper != null) { + return mapper.convert(source, context, beanConsumer); + } + throw new ConvertException("cannot find converter from " + source.getClass().getSimpleName() + " to " + + targetType.getSimpleName()); + } + + public List convert(List sourceList, Class targetType, CycleAvoidingMappingContext context) { + return convert(sourceList, targetType, context, null); + } + + @SuppressWarnings("unchecked") + public List convert(List sourceList, Class targetType, CycleAvoidingMappingContext context, Consumer beanConsumer) { + if (sourceList == null || sourceList.isEmpty()) { + return new ArrayList<>(); + } + Class sourceType = sourceList.getFirst().getClass(); + BaseCycleAvoidingMapper mapper = (BaseCycleAvoidingMapper) converterFactory.getCycleAvoidingMapper(sourceType, targetType); + if (mapper != null) { + return mapper.convert(sourceList, context, beanConsumer); + } + throw new ConvertException("cannot find converter from " + sourceType.getSimpleName() + " to " + targetType.getSimpleName()); + } + + public T convert(Map map, Class targetType) { + return convert(map, targetType, (Consumer) null); + } + + public T convert(Map map, Class targetType, Consumer beanConsumer) { + if (map == null || map.isEmpty()) { + return null; + } + if (map.values().stream().allMatch(Objects::isNull)) { + return null; + } + final BaseMapMapper mapper = converterFactory.getMapMapper(targetType); + if (mapper != null) { + return mapper.convert(map, beanConsumer); + } + throw new ConvertException("cannot find converter from " + map.getClass().getName() + " to " + + targetType.getSimpleName()); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java index b6acff7b8..07357d819 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java @@ -9,12 +9,12 @@ import lombok.NoArgsConstructor; import java.util.List; import java.util.Map; +import java.util.function.Consumer; /** * Mapstruct 工具类 *

参考文档:mapstruct-plus

* - * * @author Michelle.Chung */ @NoArgsConstructor(access = AccessLevel.PRIVATE) @@ -23,54 +23,90 @@ public class MapstructUtils { private final static Converter CONVERTER = SpringUtils.getBean(Converter.class); /** - * 将 T 类型对象,转换为 desc 类型的对象并返回 + * 将 T 类型对象,转换为 target 类型的对象并返回 * - * @param source 数据来源实体 - * @param desc 描述对象 转换后的对象 - * @return desc + * @param source 数据来源实体 + * @param targetType 目标类型 转换后的对象类型 + * @return target */ - public static V convert(T source, Class desc) { - if (ObjectUtil.isNull(source)) { + public static V convert(T source, Class targetType) { + if (ObjectUtil.hasNull(source, targetType)) { return null; } - if (ObjectUtil.isNull(desc)) { - return null; - } - return CONVERTER.convert(source, desc); + return CONVERTER.convert(source, targetType); } /** - * 将 T 类型对象,按照配置的映射字段规则,给 desc 类型的对象赋值并返回 desc 对象 + * 将 T 类型对象,转换为 target 类型的对象并返回 * - * @param source 数据来源实体 - * @param desc 转换后的对象 - * @return desc + * @param source 数据来源实体 + * @param targetType 目标类型 转换后的对象类型 + * @param beanConsumer bean消费者 对象转换后进行一些属性设置 + * @return target */ - public static V convert(T source, V desc) { - if (ObjectUtil.isNull(source)) { + public static V convert(T source, Class targetType, Consumer beanConsumer) { + if (ObjectUtil.hasNull(source, targetType)) { return null; } - if (ObjectUtil.isNull(desc)) { - return null; - } - return CONVERTER.convert(source, desc); + return CONVERTER.convert(source, targetType, beanConsumer); } /** - * 将 T 类型的集合,转换为 desc 类型的集合并返回 + * 将 T 类型对象,按照配置的映射字段规则,给 target 类型的对象赋值并返回 target 对象 + * + * @param source 数据来源实体 + * @param target 目标对象 转换后的对象 + * @return target + */ + public static V convert(T source, V target) { + if (ObjectUtil.hasNull(source)) { + return null; + } + return CONVERTER.convert(source, target); + } + + /** + * 将 T 类型对象,转换为 target 类型的对象并返回 + * + * @param source 数据来源实体 + * @param target 目标对象 转换后的对象 + * @param beanConsumer bean消费者 对象转换后进行一些属性设置 + * @return target + */ + public static V convert(T source, V target, Consumer beanConsumer) { + if (ObjectUtil.hasNull(source)) { + return null; + } + return CONVERTER.convert(source, target, beanConsumer); + } + + /** + * 将 T 类型的集合,转换为 target 类型的集合并返回 * * @param sourceList 数据来源实体列表 - * @param desc 描述对象 转换后的对象 - * @return desc + * @param targetType 目标类型 转换后的对象类型 + * @return targetType */ - public static List convert(List sourceList, Class desc) { - if (ObjectUtil.isNull(sourceList)) { - return null; - } + public static List convert(List sourceList, Class targetType) { if (CollUtil.isEmpty(sourceList)) { return CollUtil.newArrayList(); } - return CONVERTER.convert(sourceList, desc); + return CONVERTER.convert(sourceList, targetType); + } + + /** + * 将 T 类型的集合,转换为 target 类型的集合并返回 + * + * @param sourceList 数据来源实体列表 + * @param targetType 目标类型 转换后的对象类型 + * @param beanConsumer bean消费者 对象转换后进行一些属性设置 + * @return targetType + */ + public static List convert(List sourceList, Class targetType, Consumer beanConsumer) { + if (CollUtil.isEmpty(sourceList)) { + return CollUtil.newArrayList(); + } + return CONVERTER.convert(sourceList, targetType, beanConsumer); } /** @@ -81,13 +117,25 @@ public class MapstructUtils { * @return bean对象 */ public static T convert(Map map, Class beanClass) { - if (MapUtil.isEmpty(map)) { - return null; - } - if (ObjectUtil.isNull(beanClass)) { + if (MapUtil.isEmpty(map) || ObjectUtil.isNull(beanClass)) { return null; } return CONVERTER.convert(map, beanClass); } -} + /** + * 将 Map 转换为 beanClass 类型的集合并返回 + * + * @param map 数据来源 + * @param beanClass bean类 + * @param beanConsumer bean消费者 对象转换后进行一些属性设置 + * @return bean对象 + */ + public static T convert(Map map, Class beanClass, Consumer beanConsumer) { + if (MapUtil.isEmpty(map) || ObjectUtil.isNull(beanClass)) { + return null; + } + return CONVERTER.convert(map, beanClass, beanConsumer); + } + +} \ No newline at end of file From bab860e1a027513f6c04ed31c1942f496acba6a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Mon, 6 Jan 2025 03:35:13 +0000 Subject: [PATCH 2/4] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96MapstructUtils?= =?UTF-8?q?=E7=A9=BA=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋辞未寒 <545073804@qq.com> --- .../org/dromara/common/core/utils/MapstructUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java index 07357d819..a3add4391 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java @@ -59,7 +59,7 @@ public class MapstructUtils { * @return target */ public static V convert(T source, V target) { - if (ObjectUtil.hasNull(source)) { + if (ObjectUtil.hasNull(source, target)) { return null; } return CONVERTER.convert(source, target); @@ -74,7 +74,7 @@ public class MapstructUtils { * @return target */ public static V convert(T source, V target, Consumer beanConsumer) { - if (ObjectUtil.hasNull(source)) { + if (ObjectUtil.hasNull(source, target)) { return null; } return CONVERTER.convert(source, target, beanConsumer); @@ -88,7 +88,7 @@ public class MapstructUtils { * @return targetType */ public static List convert(List sourceList, Class targetType) { - if (CollUtil.isEmpty(sourceList)) { + if (CollUtil.isEmpty(sourceList) || ObjectUtil.isNull(targetType)) { return CollUtil.newArrayList(); } return CONVERTER.convert(sourceList, targetType); @@ -103,7 +103,7 @@ public class MapstructUtils { * @return targetType */ public static List convert(List sourceList, Class targetType, Consumer beanConsumer) { - if (CollUtil.isEmpty(sourceList)) { + if (CollUtil.isEmpty(sourceList) || ObjectUtil.isNull(targetType)) { return CollUtil.newArrayList(); } return CONVERTER.convert(sourceList, targetType, beanConsumer); From bd9e581e01fa1c8fcd2294532e22802ce50ccad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Mon, 6 Jan 2025 03:39:38 +0000 Subject: [PATCH 3/4] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋辞未寒 <545073804@qq.com> --- .../java/io/github/linpeilie/BaseCycleAvoidingMapper.java | 6 +++--- .../src/main/java/io/github/linpeilie/BaseMapper.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java index d18d67fd4..6db55bf18 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseCycleAvoidingMapper.java @@ -13,7 +13,7 @@ public interface BaseCycleAvoidingMapper extends BaseMapper { T convert(S source, @Context CycleAvoidingMappingContext context); default T convert(S source, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { - T bean = convert(source,context); + T bean = convert(source, context); if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { beanConsumer.accept(bean); } @@ -23,7 +23,7 @@ public interface BaseCycleAvoidingMapper extends BaseMapper { T convert(S source, @MappingTarget T target, @Context CycleAvoidingMappingContext context); default T convert(S source, @MappingTarget T target, @Context CycleAvoidingMappingContext context, Consumer beanConsumer) { - T bean = convert(source,target,context); + T bean = convert(source, target, context); if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { beanConsumer.accept(bean); } @@ -40,7 +40,7 @@ public interface BaseCycleAvoidingMapper extends BaseMapper { // 如果 beanConsumer 本来就为 null,则不再调用带 Consumer 参数的 convert 方法,避免在循环中进行不必要的非空判断 if (Objects.nonNull(beanConsumer)) { return sourceList.stream() - .map(source -> convert(source, beanConsumer)) + .map(source -> convert(source, context, beanConsumer)) .collect(Collectors.toList()); } return sourceList.stream() diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapper.java b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapper.java index 3172bea71..5ab079661 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapper.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/io/github/linpeilie/BaseMapper.java @@ -24,7 +24,7 @@ public interface BaseMapper { T convert(S source, @MappingTarget T target); default T convert(S source, @MappingTarget T target, Consumer beanConsumer) { - T bean = convert(source,target); + T bean = convert(source, target); if (Objects.nonNull(bean) && Objects.nonNull(beanConsumer)) { beanConsumer.accept(bean); } From b493e456179b88260ebb1bd3e7cc16062cb1f2d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E8=BE=9E=E6=9C=AA=E5=AF=92?= <545073804@qq.com> Date: Mon, 6 Jan 2025 06:01:10 +0000 Subject: [PATCH 4/4] =?UTF-8?q?update=20BaseMapperPlus=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=92=8C=E5=88=86=E9=A1=B5=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E6=94=AF=E6=8C=81VO=E8=BD=AC=E6=8D=A2=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 秋辞未寒 <545073804@qq.com> --- .../mybatis/core/mapper/BaseMapperPlus.java | 125 +++++++++++++++++- 1 file changed, 118 insertions(+), 7 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java index 24557edb6..4ee2b485b 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java @@ -18,6 +18,7 @@ import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.function.Function; /** @@ -156,7 +157,18 @@ public interface BaseMapperPlus extends BaseMapper { * @return 查询到的VO对象列表 */ default List selectVoByIds(Collection idList) { - return selectVoByIds(idList, this.currentVoClass()); + return selectVoByIds(idList, (Consumer) null); + } + + /** + * 根据ID集合批量查询VO对象列表 + * + * @param idList 主键ID集合 + * @param beanConsumer 转换后的VO对象消费函数 + * @return 查询到的VO对象列表 + */ + default List selectVoByIds(Collection idList, Consumer beanConsumer) { + return selectVoByIds(idList, this.currentVoClass(), beanConsumer); } /** @@ -168,11 +180,24 @@ public interface BaseMapperPlus extends BaseMapper { * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 */ default List selectVoByIds(Collection idList, Class voClass) { + return selectVoByIds(idList, voClass, null); + } + + /** + * 根据ID集合批量查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param idList 主键ID集合 + * @param voClass 要转换的VO类的Class对象 + * @param beanConsumer 转换后的VO对象消费函数 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 + */ + default List selectVoByIds(Collection idList, Class voClass, Consumer beanConsumer) { List list = this.selectByIds(idList); if (CollUtil.isEmpty(list)) { return CollUtil.newArrayList(); } - return MapstructUtils.convert(list, voClass); + return MapstructUtils.convert(list, voClass, beanConsumer); } /** @@ -182,7 +207,18 @@ public interface BaseMapperPlus extends BaseMapper { * @return 查询到的VO对象列表 */ default List selectVoByMap(Map map) { - return selectVoByMap(map, this.currentVoClass()); + return selectVoByMap(map, (Consumer) null); + } + + /** + * 根据查询条件Map查询VO对象列表 + * + * @param map 查询条件Map + * @param beanConsumer 转换后的VO对象消费函数 + * @return 查询到的VO对象列表 + */ + default List selectVoByMap(Map map, Consumer beanConsumer) { + return selectVoByMap(map, this.currentVoClass(), beanConsumer); } /** @@ -194,11 +230,24 @@ public interface BaseMapperPlus extends BaseMapper { * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 */ default List selectVoByMap(Map map, Class voClass) { + return selectVoByMap(map, voClass, null); + } + + /** + * 根据查询条件Map查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param map 查询条件Map + * @param voClass 要转换的VO类的Class对象 + * @param beanConsumer 转换后的VO对象消费函数 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 + */ + default List selectVoByMap(Map map, Class voClass, Consumer beanConsumer) { List list = this.selectByMap(map); if (CollUtil.isEmpty(list)) { return CollUtil.newArrayList(); } - return MapstructUtils.convert(list, voClass); + return MapstructUtils.convert(list, voClass, beanConsumer); } /** @@ -260,6 +309,16 @@ public interface BaseMapperPlus extends BaseMapper { return selectVoList(new QueryWrapper<>(), this.currentVoClass()); } + /** + * 查询所有VO对象列表 + * + * @param beanConsumer 转换后的VO对象消费函数 + * @return 查询到的VO对象列表 + */ + default List selectVoList(Consumer beanConsumer) { + return selectVoList(new QueryWrapper<>(), beanConsumer); + } + /** * 根据条件查询VO对象列表 * @@ -270,6 +329,18 @@ public interface BaseMapperPlus extends BaseMapper { return selectVoList(wrapper, this.currentVoClass()); } + /** + * 根据条件查询VO对象列表 + * + * @param wrapper 查询条件Wrapper + * @param beanConsumer 转换后的VO对象消费函数 + * @return 查询到的VO对象列表 + */ + default List selectVoList(Wrapper wrapper, Consumer beanConsumer) { + return selectVoList(wrapper, this.currentVoClass(), beanConsumer); + } + + /** * 根据条件查询实体对象列表,并将其转换为指定的VO对象列表 * @@ -279,11 +350,24 @@ public interface BaseMapperPlus extends BaseMapper { * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 */ default List selectVoList(Wrapper wrapper, Class voClass) { + return selectVoList(wrapper, voClass, null); + } + + /** + * 根据条件查询实体对象列表,并将其转换为指定的VO对象列表 + * + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param beanConsumer 转换后的VO对象消费函数 + * @param VO类的类型 + * @return 查询到的VO对象列表,经过转换为指定的VO类后返回 + */ + default List selectVoList(Wrapper wrapper, Class voClass, Consumer beanConsumer) { List list = this.selectList(wrapper); if (CollUtil.isEmpty(list)) { return CollUtil.newArrayList(); } - return MapstructUtils.convert(list, voClass); + return MapstructUtils.convert(list, voClass, beanConsumer); } /** @@ -297,6 +381,18 @@ public interface BaseMapperPlus extends BaseMapper { return selectVoPage(page, wrapper, this.currentVoClass()); } + /** + * 根据条件分页查询VO对象列表 + * + * @param page 分页信息 + * @param wrapper 查询条件Wrapper + * @param beanConsumer 转换后的VO对象消费函数 + * @return 查询到的VO对象分页列表 + */ + default

> P selectVoPage(IPage page, Wrapper wrapper, Consumer beanConsumer) { + return selectVoPage(page, wrapper, this.currentVoClass(), beanConsumer); + } + /** * 根据条件分页查询实体对象列表,并将其转换为指定的VO对象分页列表 * @@ -308,6 +404,21 @@ public interface BaseMapperPlus extends BaseMapper { * @return 查询到的VO对象分页列表,经过转换为指定的VO类后返回 */ default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass) { + return selectVoPage(page, wrapper, voClass, null); + } + + /** + * 根据条件分页查询实体对象列表,并将其转换为指定的VO对象分页列表 + * + * @param page 分页信息 + * @param wrapper 查询条件Wrapper + * @param voClass 要转换的VO类的Class对象 + * @param beanConsumer 转换后的VO对象消费函数 + * @param VO类的类型 + * @param

VO对象分页列表的类型 + * @return 查询到的VO对象分页列表,经过转换为指定的VO类后返回 + */ + default > P selectVoPage(IPage page, Wrapper wrapper, Class voClass, Consumer beanConsumer) { // 根据条件分页查询实体对象列表 List list = this.selectList(page, wrapper); // 创建一个新的VO对象分页列表,并设置分页信息 @@ -315,7 +426,7 @@ public interface BaseMapperPlus extends BaseMapper { if (CollUtil.isEmpty(list)) { return (P) voPage; } - voPage.setRecords(MapstructUtils.convert(list, voClass)); + voPage.setRecords(MapstructUtils.convert(list, voClass, beanConsumer)); return (P) voPage; } @@ -331,4 +442,4 @@ public interface BaseMapperPlus extends BaseMapper { return StreamUtils.toList(this.selectObjs(wrapper), mapper); } -} +} \ No newline at end of file