diff --git a/pom.xml b/pom.xml index f426cea523e7502d2bd180a5c5896b2bdef498c8..e26276f7ab04315bf9836a3f378b47ed290c9236 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,7 @@ 5.9.0 1.35 2.14.1 + 0.10.2 stream-query diff --git a/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Lists.java b/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Lists.java index 7fffeebe32a2d654907ae06b5ac73832991e617f..ee411a4b15bcc6a3cb9cdd98bc011b6ca4c07450 100644 --- a/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Lists.java +++ b/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Lists.java @@ -60,6 +60,17 @@ public class Lists { return new ArrayList<>(values); } + /** + * ofSize. + * + * @param initialCapacity initialCapacity + * @param a T class + * @return List + */ + public static List ofSize(int initialCapacity) { + return new ArrayList<>(initialCapacity); + } + /** * first. * diff --git a/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Maps.java b/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Maps.java index 9c752da7b635f651d954d39e3551dfeda79a3218..cb7546ef5df6e51ab7bd549543a71b0e66e7695c 100644 --- a/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Maps.java +++ b/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Maps.java @@ -34,6 +34,17 @@ public class Maps { /* Do not new me! */ } + /** + * of. + * + * @param a K class + * @param a V class + * @return a {@link java.util.Map} object + */ + public static Map of() { + return new HashMap<>(); + } + /** * of. * @@ -42,7 +53,7 @@ public class Maps { * @param a V class * @return a {@link java.util.Map} object */ - public static Map of(int initialCapacity) { + public static Map ofSize(int initialCapacity) { return new HashMap<>(initialCapacity); } @@ -55,8 +66,8 @@ public class Maps { * @param a V class * @return a {@link java.util.Map} object */ - public static Map of(K k, V v) { - final Map map = of(1); + public static Map ofSize(K k, V v) { + final Map map = ofSize(1); map.put(k, v); return map; } @@ -72,8 +83,8 @@ public class Maps { * @param a V class * @return a {@link java.util.Map} object */ - public static Map of(K k, V v, K k1, V v1) { - final Map map = of(1 << 1); + public static Map ofSize(K k, V v, K k1, V v1) { + final Map map = ofSize(1 << 1); map.put(k, v); map.put(k1, v1); return map; @@ -92,8 +103,8 @@ public class Maps { * @param a V class * @return a {@link java.util.Map} object */ - public static Map of(K k, V v, K k1, V v1, K k2, V v2) { - final Map map = of(1 << 2); + public static Map ofSize(K k, V v, K k1, V v1, K k2, V v2) { + final Map map = ofSize(1 << 2); map.put(k, v); map.put(k1, v1); map.put(k2, v2); diff --git a/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Sets.java b/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Sets.java index ca99426fecc4ee5b7860172bf6e216223976e31c..cd5fecff51ec860cb60a9b7adddccd3b4ba95fe1 100644 --- a/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Sets.java +++ b/stream-core/src/main/java/org/dromara/streamquery/stream/core/collection/Sets.java @@ -59,6 +59,17 @@ public class Sets { return new HashSet<>(values); } + /** + * ofSize. + * + * @param initialCapacity initialCapacity + * @param a T class + * @return Set + */ + public static Set ofSize(int initialCapacity) { + return new HashSet<>(initialCapacity); + } + /** * 获取一个空的Set * diff --git a/stream-core/src/test/java/org/dromara/streamquery/stream/core/collection/MapsTest.java b/stream-core/src/test/java/org/dromara/streamquery/stream/core/collection/MapsTest.java index da2c61cc63123150094db6b0f3ef2c0e589c889e..ade5c4f80e92a73404d94b59f88a0819000e3488 100644 --- a/stream-core/src/test/java/org/dromara/streamquery/stream/core/collection/MapsTest.java +++ b/stream-core/src/test/java/org/dromara/streamquery/stream/core/collection/MapsTest.java @@ -31,10 +31,10 @@ class MapsTest { @Test void testOf() { - Assertions.assertEquals("value", Maps.of("key", "value").get("key")); - Assertions.assertEquals("value1", Maps.of("key", "value", "key1", "value1").get("key1")); + Assertions.assertEquals("value", Maps.ofSize("key", "value").get("key")); + Assertions.assertEquals("value1", Maps.ofSize("key", "value", "key1", "value1").get("key1")); Assertions.assertEquals( - "value2", Maps.of("key", "value", "key1", "value1", "key2", "value2").get("key2")); + "value2", Maps.ofSize("key", "value", "key1", "value1", "key2", "value2").get("key2")); } @Test diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/Database.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/Database.java index 10656a9868116b992dc4471d3f3f5ea2bcbe9e6f..c2248ce8f6231b79c3969a4a52cfcacae11e0445 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/Database.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/Database.java @@ -43,7 +43,6 @@ import org.apache.ibatis.reflection.property.PropertyNamer; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.type.SimpleTypeRegistry; -import org.dromara.streamquery.stream.core.bean.BeanHelper; import org.dromara.streamquery.stream.core.collection.Lists; import org.dromara.streamquery.stream.core.lambda.LambdaHelper; import org.dromara.streamquery.stream.core.lambda.function.SerBiCons; @@ -58,7 +57,6 @@ import org.dromara.streamquery.stream.plugin.mybatisplus.engine.mapper.IMapper; import org.mybatis.spring.SqlSessionUtils; import java.io.Serializable; -import java.lang.reflect.Method; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; @@ -80,9 +78,6 @@ public class Database { private static final Map, Class> ENTITY_MAPPER_CLASS_CACHE = new ConcurrentHashMap<>(); - private static final Map> LAMBDA_GETTER_CACHE = new WeakHashMap<>(); - - /** */ private Database() { /* Do not new me! */ } @@ -1235,7 +1230,7 @@ public class Database { * @param entityList 实体集合 * @return 实体类型 */ - private static Class getEntityClass(Collection entityList) { + protected static Class getEntityClass(Collection entityList) { Class entityClass = null; for (T entity : entityList) { if (entity != null && entity.getClass() != null) { @@ -1255,7 +1250,7 @@ public class Database { * @param queryWrapper 条件构造器 * @return 实体类型 */ - private static Class getEntityClass(AbstractWrapper queryWrapper) { + protected static Class getEntityClass(AbstractWrapper queryWrapper) { Class entityClass = queryWrapper.getEntityClass(); if (entityClass == null) { T entity = queryWrapper.getEntity(); @@ -1281,52 +1276,6 @@ public class Database { "error: can not find TableInfo from Class: \"%s\".", entityClass.getName())); } - /** - * in查询 - * - * @param wrapper 条件构造器 - * @param dataList 数据 - * @param 类型 - * @return 条件构造器 - */ - @SuppressWarnings("unchecked") - public static LambdaQueryWrapper inList(LambdaQueryWrapper wrapper, List dataList) { - if (Lists.isEmpty(dataList)) { - return wrapper; - } - final Class entityClass = getEntityClass(dataList); - final List fieldList = TableInfoHelper.getTableInfo(entityClass).getFieldList(); - wrapper.nested( - w -> - Steam.of(fieldList) - .forEachIdx( - (tableField, idx) -> { - SFunction getterFunction = - (SFunction) - LAMBDA_GETTER_CACHE.computeIfAbsent( - entityClass + StringPool.AT + tableField.getProperty(), - property -> { - Method getter = - ReflectHelper.getMethod( - entityClass, - BeanHelper.GETTER_PREFIX - + tableField - .getProperty() - .substring(0, 1) - .toUpperCase(Locale.ROOT) - + tableField.getProperty().substring(1)); - return LambdaHelper.revert(SFunction.class, getter); - }); - final List list = - Steam.of(dataList).map(getterFunction).nonNull().toList(); - if (idx != 0) { - w.or(); - } - w.in(Lists.isNotEmpty(list), getterFunction, list); - })); - return wrapper; - } - /** * 判断是否动态mapper * diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/WrapperHelper.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/WrapperHelper.java new file mode 100644 index 0000000000000000000000000000000000000000..1a0d5b82ba67c61be627cf99464870f1424ca403 --- /dev/null +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/WrapperHelper.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.streamquery.stream.plugin.mybatisplus; + +import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import org.dromara.streamquery.stream.core.bean.BeanHelper; +import org.dromara.streamquery.stream.core.collection.Lists; +import org.dromara.streamquery.stream.core.lambda.LambdaHelper; +import org.dromara.streamquery.stream.core.reflect.ReflectHelper; +import org.dromara.streamquery.stream.core.stream.Steam; + +import java.lang.reflect.Method; +import java.util.*; +import java.util.function.BiConsumer; + +/** + * @author VampireAchao + * @since 2023/4/13 17:54 + */ +public class WrapperHelper { + + private static final Map> LAMBDA_GETTER_CACHE = new WeakHashMap<>(); + + private WrapperHelper() { + /* Do not new me! */ + } + + /** + * in查询 + * + * @param wrapper 条件构造器 + * @param dataList 数据 + * @param 类型 + * @return 条件构造器 + */ + @SuppressWarnings("unchecked") + public static LambdaQueryWrapper multiIn(LambdaQueryWrapper wrapper, List dataList) { + if (Lists.isEmpty(dataList)) { + return wrapper; + } + final Class entityClass = Database.getEntityClass(dataList); + final List fieldList = TableInfoHelper.getTableInfo(entityClass).getFieldList(); + multiOr( + wrapper, + fieldList, + (w, tableField) -> { + SFunction getterFunction = + (SFunction) + LAMBDA_GETTER_CACHE.computeIfAbsent( + entityClass + StringPool.AT + tableField.getProperty(), + property -> { + Method getter = + ReflectHelper.getMethod( + entityClass, + BeanHelper.GETTER_PREFIX + + tableField + .getProperty() + .substring(0, 1) + .toUpperCase(Locale.ROOT) + + tableField.getProperty().substring(1)); + return LambdaHelper.revert(SFunction.class, getter); + }); + final List list = Steam.of(dataList).map(getterFunction).nonNull().toList(); + w.in(Lists.isNotEmpty(list), getterFunction, list); + }); + return wrapper; + } + + /** + * or 查询 + * + * @param wrapper 条件构造器 + * @param dataList 数据 + * @param biConsumer 逻辑处理 + * @param 条件构造器 + * @param 实体类型 + * @param 数据类型 + * @return 条件构造器 + */ + public static , T, R> W multiOr( + W wrapper, Collection dataList, BiConsumer biConsumer) { + if (Lists.isEmpty(dataList)) { + return Database.notActive(wrapper); + } + return wrapper.nested(w -> dataList.forEach(data -> biConsumer.accept(w.or(), data))); + } +} diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/annotation/EnableMybatisPlusPlugin.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/annotation/EnableMybatisPlusPlugin.java index 8d125ac0ab10a3034c09ebc64af6654820013b55..07ea557bba3a53212e1e8c24cb66f3486bb42fbc 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/annotation/EnableMybatisPlusPlugin.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/annotation/EnableMybatisPlusPlugin.java @@ -33,9 +33,46 @@ import java.lang.annotation.*; @Import({StreamConfigurationSelector.class}) public @interface EnableMybatisPlusPlugin { + /** + * Alias for {@link #basePackages()} + * + * @return base packages + */ String[] value() default {}; + /** + * Base packages + * + * @return base packages + */ String[] basePackages() default {}; + /** + * Alias for {@link #basePackages()}. scan base package classes + * + * @return base package classes for scanning + */ Class[] basePackageClasses() default {}; + + /** + * Specify classes + * + * @return classes + */ + Class[] classes() default {}; + + /** + * Base on {@link #basePackages()}. scan annotation classes + * + * @return annotation class for scanning + */ + Class annotation() default Annotation.class; + + /** + * Base on {@link #basePackages()}. scan interface classes + * + * @return interface class for scanning + */ + Class interfaceClass() default Class.class; + } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamClassPathScanner.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamClassPathScanner.java new file mode 100644 index 0000000000000000000000000000000000000000..eed848777fbc791643a49ad5485632731b471d75 --- /dev/null +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamClassPathScanner.java @@ -0,0 +1,110 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.streamquery.stream.plugin.mybatisplus.engine.configuration; + +import org.apache.ibatis.logging.Log; +import org.apache.ibatis.logging.LogFactory; +import org.dromara.streamquery.stream.core.reflect.ReflectHelper; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.core.type.filter.AnnotationTypeFilter; +import org.springframework.core.type.filter.AssignableTypeFilter; +import org.springframework.util.CollectionUtils; + +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.Collections; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * @author KamTo Hung + */ +public class StreamClassPathScanner extends ClassPathScanningCandidateComponentProvider { + + private static final Log LOG = LogFactory.getLog(StreamClassPathScanner.class); + + /** + * annotation + */ + private Class annotation; + + /** + * scan interface + */ + private Class interfaceClass; + + public StreamClassPathScanner(boolean useDefaultFilters) { + super(useDefaultFilters); + } + + public void setAnnotation(Class annotation) { + this.annotation = annotation; + } + + + public void setInterfaceClass(Class interfaceClass) { + this.interfaceClass = interfaceClass; + } + + public void registerFilters() { + boolean acceptAllInterfaces = true; + + if (this.annotation != null) { + addIncludeFilter(new AnnotationTypeFilter(this.annotation)); + acceptAllInterfaces = false; + } + + if (this.interfaceClass != null) { + addIncludeFilter(new AssignableTypeFilter(this.interfaceClass) { + // remove parent entity + @Override + protected boolean matchClassName(String className) { + return false; + } + }); + acceptAllInterfaces = false; + } + + if (acceptAllInterfaces) { + // default include filter that accepts all classes + addIncludeFilter((metadataReader, metadataReaderFactory) -> true); + } + + // exclude package-info.java + addExcludeFilter((metadataReader, metadataReaderFactory) -> { + String className = metadataReader.getClassMetadata().getClassName(); + return className.endsWith("package-info"); + }); + } + + public Set> scan(Set basePackages) { + if (CollectionUtils.isEmpty(basePackages)) { + LOG.warn("basePackages is empty"); + return Collections.emptySet(); + } + return basePackages.stream() + .map(this::findCandidateComponents) + .flatMap(Collection::stream) + .map(BeanDefinition::getBeanClassName) + .filter(Objects::nonNull) + .map(ReflectHelper::forClassName) + .collect(Collectors.toSet()); + } + +} diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamPluginConfiguration.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamPluginConfiguration.java index b9fc5384ce4e21041e967d7527b9b7ffb9aa6fb4..4e5bf9bf9d1b06bfb3de9ece23320dab92164039 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamPluginConfiguration.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamPluginConfiguration.java @@ -24,7 +24,6 @@ import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import org.apache.ibatis.builder.MapperBuilderAssistant; import org.apache.ibatis.session.SqlSessionFactory; -import org.dromara.streamquery.stream.core.clazz.ClassHelper; import org.dromara.streamquery.stream.core.lambda.LambdaHelper; import org.dromara.streamquery.stream.core.reflect.ReflectHelper; import org.dromara.streamquery.stream.plugin.mybatisplus.Database; @@ -36,9 +35,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.context.annotation.Bean; import org.springframework.core.annotation.Order; -import java.util.ArrayList; import java.util.List; -import java.util.Set; /** * MPSql注入 @@ -92,12 +89,6 @@ public class StreamPluginConfiguration { @ConditionalOnMissingBean(DynamicMapperHandler.class) public DynamicMapperHandler dynamicMapperHandler( SqlSessionFactory sqlSessionFactory, StreamScannerConfigurer streamScannerConfigurer) { - /// 扫描po包下的所有类,作为entity - Set basePackages = streamScannerConfigurer.getBasePackages(); - List> entityClassList = new ArrayList<>(); - for (String basePackage : basePackages) { - entityClassList.addAll(ClassHelper.scanClasses(basePackage)); - } - return new DynamicMapperHandler(sqlSessionFactory, entityClassList); + return new DynamicMapperHandler(sqlSessionFactory, streamScannerConfigurer.getEntityClasses()); } } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerConfigurer.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerConfigurer.java index 69bda878b187bf98022f8094d26a816dcbabda5b..313fd78966e6bd8cc123fe13fd23d7f309e5cd3c 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerConfigurer.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerConfigurer.java @@ -16,23 +16,89 @@ */ package org.dromara.streamquery.stream.plugin.mybatisplus.engine.configuration; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.util.CollectionUtils; + +import java.lang.annotation.Annotation; +import java.util.Collection; +import java.util.HashSet; import java.util.Set; /** + *
  * stream scanner configurer
+ * from {@link StreamScannerRegistrar}
+ * 
* - * @author KamTo Hung from {@link StreamScannerRegistrar} + * @author KamTo Hung */ -public class StreamScannerConfigurer { +public class StreamScannerConfigurer implements BeanFactoryPostProcessor { - /** base package */ + /** + * base package + */ private Set basePackages; - public Set getBasePackages() { - return basePackages; - } + /** + * specify classes + */ + private Set> classes; + + /** + * annotation + */ + private Class annotation; + + /** + * scan interface + */ + private Class interfaceClass; + + + /** + * entity class list + */ + private final Set> entityClassList = new HashSet<>(); public void setBasePackages(Set basePackages) { this.basePackages = basePackages; } + + public void setClasses(Set> classes) { + this.classes = classes; + } + + public void setAnnotation(Class annotation) { + this.annotation = annotation; + } + + public void setInterfaceClass(Class interfaceClass) { + this.interfaceClass = interfaceClass; + } + + private void registerEntityClasses(Collection> entityClasses) { + if (!CollectionUtils.isEmpty(entityClasses)) { + this.entityClassList.addAll(entityClasses); + } + } + + public Collection> getEntityClasses() { + return entityClassList; + } + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + // 指定类 + registerEntityClasses(this.classes); + StreamClassPathScanner scanner = new StreamClassPathScanner(false); + scanner.setAnnotation(this.annotation); + scanner.setInterfaceClass(this.interfaceClass); + scanner.registerFilters(); + Set> classSet = scanner.scan(this.basePackages); + registerEntityClasses(classSet); + } + } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerRegistrar.java b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerRegistrar.java index 43719a306835b990854013f4f3f8da2dc195304e..ba8f9c24f339e343228430d795f95c0c43b521ca 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerRegistrar.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/main/java/org/dromara/streamquery/stream/plugin/mybatisplus/engine/configuration/StreamScannerRegistrar.java @@ -25,42 +25,64 @@ import org.springframework.core.type.AnnotationMetadata; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; +import java.lang.annotation.Annotation; import java.util.Arrays; import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; -/** @author KamTo Hung */ +/** + * Bean definition registrar for {@link StreamScannerConfigurer}. + * + * @author KamTo Hung + */ public class StreamScannerRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions( - AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { + AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { AnnotationAttributes annotationAttributes = - AnnotationAttributes.fromMap( - importingClassMetadata.getAnnotationAttributes( - EnableMybatisPlusPlugin.class.getName())); + AnnotationAttributes.fromMap( + importingClassMetadata.getAnnotationAttributes( + EnableMybatisPlusPlugin.class.getName())); if (Objects.isNull(annotationAttributes)) { return; } BeanDefinitionBuilder builder = - BeanDefinitionBuilder.genericBeanDefinition(StreamScannerConfigurer.class); + BeanDefinitionBuilder.genericBeanDefinition(StreamScannerConfigurer.class); Set basePackages = new HashSet<>(); basePackages.addAll( - Arrays.stream(annotationAttributes.getStringArray("value")) - .filter(StringUtils::hasText) - .collect(Collectors.toList())); + Arrays.stream(annotationAttributes.getStringArray("value")) + .filter(StringUtils::hasText) + .collect(Collectors.toSet())); basePackages.addAll( - Arrays.stream(annotationAttributes.getStringArray("basePackages")) - .filter(StringUtils::hasText) - .collect(Collectors.toList())); + Arrays.stream(annotationAttributes.getStringArray("basePackages")) + .filter(StringUtils::hasText) + .collect(Collectors.toSet())); basePackages.addAll( - Arrays.stream(annotationAttributes.getClassArray("basePackageClasses")) - .filter(Objects::nonNull) - .map(ClassUtils::getPackageName) - .collect(Collectors.toList())); + Arrays.stream(annotationAttributes.getClassArray("basePackageClasses")) + .filter(Objects::nonNull) + .map(ClassUtils::getPackageName) + .collect(Collectors.toSet())); builder.addPropertyValue("basePackages", basePackages); + + Set> classes = Arrays.stream(annotationAttributes.getClassArray("classes")) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + builder.addPropertyValue("classes", classes); + + Class annotation = annotationAttributes.getClass("annotation"); + if (!Annotation.class.equals(annotation)) { + builder.addPropertyValue("annotation", annotation); + } + + Class scanInterface = annotationAttributes.getClass("interfaceClass"); + if (!Class.class.equals(scanInterface)) { + builder.addPropertyValue("interfaceClass", scanInterface); + } + registry.registerBeanDefinition("streamScannerConfigurer", builder.getBeanDefinition()); } + } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/DatabaseTest.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/DatabaseTest.java index 36154306fde9569c84405d124d080b561e4def4e..fc34d8f0f46f2ca75549eb7bde176b0edf992d7e 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/DatabaseTest.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/DatabaseTest.java @@ -462,31 +462,4 @@ class DatabaseTest { Assertions.assertTrue(Database.isDynamicMapper(roleMapperClass.getName())); } } - - @Test - void testWhereRelation() { - LambdaQueryWrapper wrapper = - Database.inList( - Wrappers.lambdaQuery(UserInfo.class), - Lists.of( - new UserInfo() { - { - setName("Jon"); - } - }, - new UserInfo() { - { - setEmail("test2@baomidou.com"); - } - }, - new UserInfo() { - { - setName("Tom"); - } - })); - List userInfos = Database.list(wrapper); - Assertions.assertEquals("Jon", userInfos.get(0).getName()); - Assertions.assertEquals("test2@baomidou.com", userInfos.get(1).getEmail()); - Assertions.assertEquals("Tom", userInfos.get(2).getName()); - } } diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/MybatisPlusTestApplication.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/MybatisPlusTestApplication.java index a50af7c5eebd1029a9dff1cb0db4943518681546..f0af5afccfcaa96fca685687f80f1fd2eff4b104 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/MybatisPlusTestApplication.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/MybatisPlusTestApplication.java @@ -21,6 +21,8 @@ import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.dromara.streamquery.stream.plugin.mybatisplus.engine.annotation.EnableMybatisPlusPlugin; +import org.dromara.streamquery.stream.plugin.mybatisplus.annotation.Entity; +import org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po.ParentScan; import org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po.RoleInfo; import org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po.UserInfo; import org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po.UserRole; @@ -34,11 +36,12 @@ import org.springframework.context.annotation.Bean; * @since 2022/5/21 */ @EnableMybatisPlusPlugin( - value = "org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po", - basePackages = "org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po", +// value = "org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po", + basePackages = "org.dromara.streamquery.stream.plugin.*.pojo.po", basePackageClasses = {RoleInfo.class, UserInfo.class, UserRole.class}, - classes = {RoleInfo.class, UserInfo.class, UserRole.class} -) + annotation = Entity.class, + interfaceClass = ParentScan.class, + classes = {RoleInfo.class}) @SpringBootApplication public class MybatisPlusTestApplication { /** diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/WrapperHelperTest.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/WrapperHelperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..475b5b2054fcfb5bd218c0d12aa96eaaa904f1e9 --- /dev/null +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/WrapperHelperTest.java @@ -0,0 +1,88 @@ +package org.dromara.streamquery.stream.plugin.mybatisplus; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.test.autoconfigure.MybatisPlusTest; +import lombok.val; +import org.dromara.streamquery.stream.core.collection.Lists; +import org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po.UserInfo; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Objects; + +/** + * @author VampireAchao + * @since 2023/4/13 18:02 + */ +@MybatisPlusTest +class WrapperHelperTest { + + @Test + void testMultiIn() { + LambdaQueryWrapper wrapper = + WrapperHelper.multiIn( + Wrappers.lambdaQuery(UserInfo.class), + Lists.of( + new UserInfo() { + { + setName("Jon"); + } + }, + new UserInfo() { + { + setEmail("test2@baomidou.com"); + } + }, + new UserInfo() { + { + setName("Tom"); + } + })); + // ==> Preparing: SELECT id,name,age,email,version,gmt_deleted FROM user_info WHERE + // gmt_deleted='2001-01-01 00:00:00' AND ((name IN (?,?) OR email IN (?))) + // ==> Parameters: Jon(String), Tom(String), test2@baomidou.com(String) + List userInfos = Database.list(wrapper); + Assertions.assertEquals("Jon", userInfos.get(0).getName()); + Assertions.assertEquals("test2@baomidou.com", userInfos.get(1).getEmail()); + Assertions.assertEquals("Tom", userInfos.get(2).getName()); + } + + @Test + void testMultiOr() { + val dataList = + Lists.of( + new UserInfo() { + { + setName("Jon"); + } + }, + new UserInfo() { + { + setEmail("test2@baomidou.com"); + } + }, + new UserInfo() { + { + setName("Tom"); + } + }); + val wrapper = + WrapperHelper.multiOr( + Wrappers.lambdaQuery(UserInfo.class), + dataList, + (w, data) -> { + w.eq(Objects.nonNull(data.getEmail()), UserInfo::getEmail, data.getEmail()) + .eq(StringUtils.isNotBlank(data.getName()), UserInfo::getName, data.getName()); + }); + // ==> Preparing: SELECT id,name,age,email,version,gmt_deleted FROM user_info WHERE + // gmt_deleted='2001-01-01 00:00:00' AND ((name = ? OR email = ? OR name = ?)) + // ==> Parameters: Jon(String), test2@baomidou.com(String), Tom(String) + List userInfos = Database.list(wrapper); + Assertions.assertEquals("Jon", userInfos.get(0).getName()); + Assertions.assertEquals("test2@baomidou.com", userInfos.get(1).getEmail()); + Assertions.assertEquals("Tom", userInfos.get(2).getName()); + } +} diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/Entity.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/Entity.java new file mode 100644 index 0000000000000000000000000000000000000000..79bd87518d834f33add0a7b440a03499d7c02e1d --- /dev/null +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/annotation/Entity.java @@ -0,0 +1,34 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.streamquery.stream.plugin.mybatisplus.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author KamTo Hung + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE}) +@Documented +@Inherited +public @interface Entity { +} diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/ParentScan.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/ParentScan.java new file mode 100644 index 0000000000000000000000000000000000000000..4d7a5a66e11494a97529788bdd22c578ec4ffbdf --- /dev/null +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/ParentScan.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po; + +/** + * @author KamTo Hung + */ +public interface ParentScan { +} diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/RoleInfo.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/RoleInfo.java index 82283036d2d0da93cba0e1a7eb69cd71175a669f..b5feb3a276c418053541d85421fc4ec2eb2d6958 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/RoleInfo.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/RoleInfo.java @@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; +import org.dromara.streamquery.stream.plugin.mybatisplus.annotation.Entity; /** * RoleInfo @@ -29,6 +30,7 @@ import lombok.Data; * @since 2022/5/23 */ @Data +@Entity @KeySequence(dbType = DbType.H2) public class RoleInfo { diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/UserInfo.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/UserInfo.java index 44bb68c81d91055b4373ca9252699f1fc31a6fd8..8b47d0744ecfb398c3b606696bc367d26c3133f4 100644 --- a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/UserInfo.java +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/UserInfo.java @@ -31,7 +31,7 @@ import java.time.LocalDateTime; * @since 2022/5/21 */ @Data -public class UserInfo { +public class UserInfo implements ParentScan { private static final long serialVersionUID = -7219188882388819210L; @@ -41,7 +41,8 @@ public class UserInfo { private String name; private Integer age; private String email; - @Version private Integer version; + @Version + private Integer version; @TableLogic(value = "'2001-01-01 00:00:00'", delval = "NOW()") private LocalDateTime gmtDeleted; diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/inner/AddressInfo.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/inner/AddressInfo.java new file mode 100644 index 0000000000000000000000000000000000000000..927f2ec7180c0f25cd45bc30e8c90fe25dbfda26 --- /dev/null +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/inner/AddressInfo.java @@ -0,0 +1,20 @@ +package org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po.inner; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.dromara.streamquery.stream.plugin.mybatisplus.annotation.Entity; + +/** + * @author KamTo Hung + */ +@Data +@Entity +public class AddressInfo { + + @TableId(type = IdType.ASSIGN_ID) + private String id; + + private String address; + +} diff --git a/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/package-info.java b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..adf5fdf908375d1abe3a376a15ec350f60809bf7 --- /dev/null +++ b/stream-plugin/stream-plugin-mybatis-plus/src/test/java/org/dromara/streamquery/stream/plugin/mybatisplus/pojo/po/package-info.java @@ -0,0 +1,17 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.dromara.streamquery.stream.plugin.mybatisplus.pojo.po; \ No newline at end of file