From dfa9baea93b3352bacb563b324e9a0333c5ec24b Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Mon, 27 Mar 2023 19:12:50 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B1=BB=E5=90=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{IAdapter.java => ITableInfoAdapter.java} | 2 +- ...terV33x.java => TableInfoAdapterV33x.java} | 4 +- .../mybatis-plus-join-adapter-v3431/pom.xml | 59 +++++++++++++++++++ .../adapter/v3431/AbstractMethodV3431.java | 17 ++++++ mybatis-plus-join-adapter/pom.xml | 1 + .../MybatisPlusJoinAutoConfiguration.java | 27 ++++++--- .../conditional/MPJSqlInjectorCondition.java | 17 ++++++ .../conditional/OnSqlInjectorCondition.java | 46 +++++++++++++++ mybatis-plus-join-core/pom.xml | 5 ++ .../yulichang/adapter/AdapterHelper.java | 14 +++-- .../{Adapter.java => TableInfoAdapter.java} | 4 +- .../base/mapper/MPJRelationMapper.java | 2 +- .../yulichang/config/ConfigProperties.java | 6 +- .../yulichang/injector/MPJSqlInjector.java | 58 +++++++++++++----- .../yulichang/method/MPJBaseMethod.java | 18 +++--- .../yulichang/query/MPJQueryWrapper.java | 2 +- .../yulichang/toolkit/LogicInfoUtils.java | 4 +- .../toolkit/support/ColumnCache.java | 2 +- .../yulichang/wrapper/MPJLambdaWrapper.java | 2 +- .../wrapper/segments/SelectCache.java | 2 +- .../test/config/MybatisPlusConfig.java | 39 ++++++++++++ .../test/join/mapper/MyBaseMapper.java | 6 +- .../test/join/LambdaWrapperTest.java | 5 ++ 23 files changed, 287 insertions(+), 55 deletions(-) rename mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/{IAdapter.java => ITableInfoAdapter.java} (93%) rename mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/{AdapterV33x.java => TableInfoAdapterV33x.java} (90%) create mode 100644 mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml create mode 100644 mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/AbstractMethodV3431.java create mode 100644 mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/MPJSqlInjectorCondition.java create mode 100644 mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/OnSqlInjectorCondition.java rename mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/{Adapter.java => TableInfoAdapter.java} (88%) diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/IAdapter.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java similarity index 93% rename from mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/IAdapter.java rename to mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java index 7fe6fc5..8fa6d08 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/IAdapter.java +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-base/src/main/java/com/github/yulichang/adapter/base/ITableInfoAdapter.java @@ -8,7 +8,7 @@ import org.apache.ibatis.session.Configuration; * @author yulichang * @since 1.4.3 */ -public interface IAdapter { +public interface ITableInfoAdapter { boolean mpjHasLogic(TableInfo tableInfo); diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/AdapterV33x.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java similarity index 90% rename from mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/AdapterV33x.java rename to mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java index 550b1b5..a2edcde 100644 --- a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/AdapterV33x.java +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v33x/src/main/java/com/github/yulichang/adapter/v33x/TableInfoAdapterV33x.java @@ -3,7 +3,7 @@ package com.github.yulichang.adapter.v33x; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.github.yulichang.adapter.base.IAdapter; +import com.github.yulichang.adapter.base.ITableInfoAdapter; import org.apache.ibatis.session.Configuration; import java.util.Objects; @@ -12,7 +12,7 @@ import java.util.Objects; * @author yulichang * @since 1.4.3 */ -public class AdapterV33x implements IAdapter { +public class TableInfoAdapterV33x implements ITableInfoAdapter { @Override public boolean mpjHasLogic(TableInfo tableInfo) { diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml new file mode 100644 index 0000000..07a6b97 --- /dev/null +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/pom.xml @@ -0,0 +1,59 @@ + + + + 4.0.0 + + com.github.yulichang + mybatis-plus-join-adapter + 1.4.4 + + mybatis-plus-join-adapter-v3431 + 1.4.4 + mybatis-plus-join-adapter-v3431 + + An enhanced toolkit of Mybatis-Plus to simplify development. + https://github.com/yulichang/mybatis-plus-join + + + The Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0.txt + + + + + mybatis-plus-join + yulichang + yu_lichang@qq.com + + + + scm:git:https://github.com/yulichang/mybatis-plus-join.git + scm:git:https://github.com/yulichang/mybatis-plus-join.git + https://github.com/yulichang/mybatis-plus-join + + + + 1.8 + 1.8 + 1.8 + 1.8 + github + UTF-8 + + + + + com.github.yulichang + mybatis-plus-join-adapter-base + 1.4.4 + + + com.baomidou + mybatis-plus-boot-starter + 3.4.3.1 + provided + + + + diff --git a/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/AbstractMethodV3431.java b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/AbstractMethodV3431.java new file mode 100644 index 0000000..e866f96 --- /dev/null +++ b/mybatis-plus-join-adapter/mybatis-plus-join-adapter-v3431/src/main/java/com/github/yulichang/adapter/v3431/AbstractMethodV3431.java @@ -0,0 +1,17 @@ +package com.github.yulichang.adapter.v3431; + +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector; + +import java.util.List; + +/** + * @author yulichang + * @since 1.4.5 + */ +public class AbstractMethodV3431 { + + public static List getMethod(AbstractSqlInjector sqlInjector, Class clazz) { + return sqlInjector.getMethodList(clazz); + } +} diff --git a/mybatis-plus-join-adapter/pom.xml b/mybatis-plus-join-adapter/pom.xml index 3a32a9c..4e57b0f 100644 --- a/mybatis-plus-join-adapter/pom.xml +++ b/mybatis-plus-join-adapter/pom.xml @@ -15,6 +15,7 @@ mybatis-plus-join-adapter-base mybatis-plus-join-adapter-v33x + mybatis-plus-join-adapter-v3431 mybatis-plus-join-adapter-v352 diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java index c1fad5e..76d9c2d 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinAutoConfiguration.java @@ -2,8 +2,8 @@ package com.github.yulichang.autoconfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration; import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector; -import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.injector.ISqlInjector; +import com.github.yulichang.autoconfigure.conditional.MPJSqlInjectorCondition; import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.config.MPJInterceptorConfig; import com.github.yulichang.config.enums.LogicDelTypeEnum; @@ -28,6 +28,7 @@ import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; @@ -86,9 +87,22 @@ public class MybatisPlusJoinAutoConfiguration { * mybatis plus join 自定义方法 */ @Bean + @Primary + @MPJSqlInjectorCondition @Order(Ordered.HIGHEST_PRECEDENCE) - @ConditionalOnMissingBean({DefaultSqlInjector.class, AbstractSqlInjector.class, ISqlInjector.class}) - public MPJSqlInjector mpjSqlInjector() { + @ConditionalOnBean(ISqlInjector.class) + public MPJSqlInjector mpjSqlInjector(AbstractSqlInjector sqlInjector) { + logger.info("MPJSqlInjector init"); + return new MPJSqlInjector(sqlInjector); + } + + /** + * mybatis plus join 自定义方法 + */ + @Bean + @Order(Ordered.HIGHEST_PRECEDENCE) + @ConditionalOnMissingBean(ISqlInjector.class) + public MPJSqlInjector mpjSqlInjectorOnMiss() { logger.info("MPJSqlInjector init"); return new MPJSqlInjector(); } @@ -98,14 +112,14 @@ public class MybatisPlusJoinAutoConfiguration { */ @Bean @Order(Ordered.HIGHEST_PRECEDENCE) - public SpringContentUtils springContentUtils(SpringContext springContext) { + public SpringContentUtils mpjSpringContent(MPJSpringContext springContext) { return new SpringContentUtils(springContext); } @Configuration @Order(Ordered.HIGHEST_PRECEDENCE) @ConditionalOnBean(SqlSessionFactory.class) - public static class MappingConfig implements ApplicationListener { + public static class MPJMappingConfig implements ApplicationListener { @Override @SuppressWarnings("NullableProblems") public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { @@ -115,7 +129,7 @@ public class MybatisPlusJoinAutoConfiguration { @Configuration @ConditionalOnBean(SqlSessionFactory.class) - public static class SpringContext implements SpringContentUtils.SpringContext, ApplicationContextAware { + public static class MPJSpringContext implements SpringContentUtils.SpringContext, ApplicationContextAware { private ApplicationContext applicationContext; @@ -129,5 +143,4 @@ public class MybatisPlusJoinAutoConfiguration { this.applicationContext = applicationContext; } } - } diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/MPJSqlInjectorCondition.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/MPJSqlInjectorCondition.java new file mode 100644 index 0000000..ac24fec --- /dev/null +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/MPJSqlInjectorCondition.java @@ -0,0 +1,17 @@ +package com.github.yulichang.autoconfigure.conditional; + + +import org.springframework.context.annotation.Conditional; + +import java.lang.annotation.*; + +/** + * @author yulichang + * @since 1.4.5 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +@Conditional(OnSqlInjectorCondition.class) +public @interface MPJSqlInjectorCondition { +} diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/OnSqlInjectorCondition.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/OnSqlInjectorCondition.java new file mode 100644 index 0000000..d9b436c --- /dev/null +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/conditional/OnSqlInjectorCondition.java @@ -0,0 +1,46 @@ +package com.github.yulichang.autoconfigure.conditional; + +import com.baomidou.mybatisplus.core.injector.ISqlInjector; +import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Primary; +import org.springframework.core.annotation.MergedAnnotation; +import org.springframework.core.annotation.MergedAnnotations; +import org.springframework.core.type.AnnotatedTypeMetadata; +import org.springframework.core.type.MethodMetadata; + +import java.lang.annotation.Annotation; +import java.util.Objects; + +/** + * @author yulichang + * @since 1.4.5 + */ +public class OnSqlInjectorCondition implements Condition { + + @Override + @SuppressWarnings("NullableProblems") + public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { + if (Objects.nonNull(conditionContext.getBeanFactory())) { + String[] names = conditionContext.getBeanFactory().getBeanNamesForType(ISqlInjector.class); + for (String name : names) { + BeanDefinition definition = conditionContext.getBeanFactory().getBeanDefinition(name); + if (definition instanceof AnnotatedBeanDefinition) { + AnnotatedBeanDefinition annotatedBeanDefinition = (AnnotatedBeanDefinition) definition; + MethodMetadata metadata = annotatedBeanDefinition.getFactoryMethodMetadata(); + if (Objects.nonNull(metadata)) { + MergedAnnotations annotations = metadata.getAnnotations(); + for (MergedAnnotation it : annotations) { + if (Objects.equals(it.getType(), Primary.class)) { + return false; + } + } + } + } + } + } + return true; + } +} diff --git a/mybatis-plus-join-core/pom.xml b/mybatis-plus-join-core/pom.xml index c0a6966..4947dff 100644 --- a/mybatis-plus-join-core/pom.xml +++ b/mybatis-plus-join-core/pom.xml @@ -54,6 +54,11 @@ mybatis-plus-join-adapter-v33x 1.4.4 + + com.github.yulichang + mybatis-plus-join-adapter-v3431 + 1.4.4 + com.github.yulichang mybatis-plus-join-adapter-v352 diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java index d0c032d..5326a56 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/AdapterHelper.java @@ -1,16 +1,20 @@ package com.github.yulichang.adapter; import com.baomidou.mybatisplus.core.MybatisPlusVersion; -import com.github.yulichang.adapter.base.IAdapter; -import com.github.yulichang.adapter.v33x.AdapterV33x; +import com.github.yulichang.adapter.base.ITableInfoAdapter; +import com.github.yulichang.adapter.v33x.TableInfoAdapterV33x; +/** + * @author yulichang + * @since 1.4.3 + */ public class AdapterHelper { - public static IAdapter getAdapter() { + public static ITableInfoAdapter getTableInfoAdapter() { String version = MybatisPlusVersion.getVersion(); if (version.startsWith("3.3.")) { - return new AdapterV33x(); + return new TableInfoAdapterV33x(); } - return new Adapter(); + return new TableInfoAdapter(); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/Adapter.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java similarity index 88% rename from mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/Adapter.java rename to mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java index c40e991..41b66c2 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/Adapter.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/adapter/TableInfoAdapter.java @@ -2,14 +2,14 @@ package com.github.yulichang.adapter; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; -import com.github.yulichang.adapter.base.IAdapter; +import com.github.yulichang.adapter.base.ITableInfoAdapter; import org.apache.ibatis.session.Configuration; /** * @author yulichang * @since 1.4.3 */ -public class Adapter implements IAdapter { +public class TableInfoAdapter implements ITableInfoAdapter { @Override public boolean mpjHasLogic(TableInfo tableInfo) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/base/mapper/MPJRelationMapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/base/mapper/MPJRelationMapper.java index 8d9b5ce..03b8222 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/base/mapper/MPJRelationMapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/base/mapper/MPJRelationMapper.java @@ -19,7 +19,7 @@ import java.util.function.Function; * @author yulichang * @since 1.4.3 */ -public interface MPJRelationMapper extends BaseMapper { +public interface MPJRelationMapper { /** * 通过注解实现单表多次查询 diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java index 2b3cb72..403644f 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java @@ -1,7 +1,7 @@ package com.github.yulichang.config; import com.github.yulichang.adapter.AdapterHelper; -import com.github.yulichang.adapter.base.IAdapter; +import com.github.yulichang.adapter.base.ITableInfoAdapter; import com.github.yulichang.config.enums.LogicDelTypeEnum; /** @@ -31,7 +31,7 @@ public class ConfigProperties { */ public static LogicDelTypeEnum logicDelType = LogicDelTypeEnum.WHERE; /** - * 适配器 + * TableInfo适配器 */ - public static IAdapter adapter = AdapterHelper.getAdapter(); + public static ITableInfoAdapter tableInfoAdapter = AdapterHelper.getTableInfoAdapter(); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java index a6a28ff..a2a009f 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java @@ -2,17 +2,20 @@ package com.github.yulichang.injector; import com.baomidou.mybatisplus.core.MybatisPlusVersion; import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.AbstractSqlInjector; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.injector.methods.*; import com.baomidou.mybatisplus.core.mapper.Mapper; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; import com.baomidou.mybatisplus.core.toolkit.ClassUtils; +import com.github.yulichang.adapter.v3431.AbstractMethodV3431; import com.github.yulichang.mapper.MPJTableMapperHelper; import com.github.yulichang.method.*; import com.github.yulichang.toolkit.TableHelper; import com.github.yulichang.toolkit.VersionUtils; import com.github.yulichang.toolkit.reflect.GenericTypeUtils; +import lombok.Getter; import org.apache.ibatis.builder.MapperBuilderAssistant; import org.mybatis.logging.Logger; import org.mybatis.logging.LoggerFactory; @@ -24,6 +27,7 @@ import java.lang.reflect.WildcardType; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.stream.Stream; import static java.util.stream.Collectors.toList; @@ -38,6 +42,16 @@ public class MPJSqlInjector extends DefaultSqlInjector { private static final Logger logger = LoggerFactory.getLogger(MPJSqlInjector.class); + @Getter + private AbstractSqlInjector sqlInjector; + + public MPJSqlInjector() { + } + + public MPJSqlInjector(AbstractSqlInjector sqlInjector) { + this.sqlInjector = sqlInjector; + } + /** * 升级到 mybatis plus 3.4.3.2 后对之前的版本兼容 */ @@ -48,19 +62,24 @@ public class MPJSqlInjector extends DefaultSqlInjector { logger.error(() -> "DefaultSqlInjector 的 getMethodList(Class mapperClass) 方法已在 3.4.3.2+ 改为" + "getMethodList(Class mapperClass, TableInfo tableInfo)\n"); } - List list = Stream.of( - new Insert(), - new DeleteByMap(), - new DeleteById(), - new DeleteBatchByIds(), - new UpdateById(), - new SelectById(), - new SelectBatchByIds(), - new SelectByMap() - ).collect(toList()); - list.addAll(getJoinMethod()); - list.addAll(getSelectMethod()); - return list; + if (Objects.nonNull(sqlInjector)) { + List methodList = AbstractMethodV3431.getMethod(sqlInjector, mapperClass); + return methodFilter(methodList); + } else { + List list = Stream.of( + new Insert(), + new DeleteByMap(), + new DeleteById(), + new DeleteBatchByIds(), + new UpdateById(), + new SelectById(), + new SelectBatchByIds(), + new SelectByMap() + ).collect(toList()); + list.addAll(getWrapperMethod()); + list.addAll(getJoinMethod()); + return list; + } } /** @@ -68,6 +87,13 @@ public class MPJSqlInjector extends DefaultSqlInjector { */ @Override public List getMethodList(Class mapperClass, TableInfo tableInfo) { + if (Objects.nonNull(sqlInjector)) { + return methodFilter(sqlInjector.getMethodList(mapperClass, tableInfo)); + } + return methodFilter(super.getMethodList(mapperClass, tableInfo)); + } + + private List methodFilter(List list) { List methodList = Arrays.asList( "Update", "Delete", @@ -78,9 +104,8 @@ public class MPJSqlInjector extends DefaultSqlInjector { "SelectObjs", "SelectList", "SelectPage"); - List list = super.getMethodList(mapperClass, tableInfo); list.removeIf(i -> methodList.contains(i.getClass().getSimpleName())); - list.addAll(getSelectMethod()); + list.addAll(getWrapperMethod()); list.addAll(getJoinMethod()); return list; } @@ -107,7 +132,7 @@ public class MPJSqlInjector extends DefaultSqlInjector { return list; } - private List getSelectMethod() { + private List getWrapperMethod() { List list = new ArrayList<>(); list.add(new com.github.yulichang.method.mp.Delete()); list.add(new com.github.yulichang.method.mp.SelectOne()); @@ -134,6 +159,7 @@ public class MPJSqlInjector extends DefaultSqlInjector { return null == typeArguments ? null : typeArguments[index]; } + @SuppressWarnings("IfStatementWithIdenticalBranches") protected Class extractModelClassOld(Class mapperClass) { Type[] types = mapperClass.getGenericInterfaces(); ParameterizedType target = null; diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java index 13d68cf..aff14ec 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/method/MPJBaseMethod.java @@ -24,7 +24,7 @@ import static java.util.stream.Collectors.joining; public interface MPJBaseMethod extends Constants { default String mpjSqlWhereEntityWrapper(boolean newLine, TableInfo table) { - if (ConfigProperties.adapter.mpjHasLogic(table)) { + if (ConfigProperties.tableInfoAdapter.mpjHasLogic(table)) { String sqlScript = getAllSqlWhere(table, true, true, WRAPPER_ENTITY_DOT); sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", WRAPPER_ENTITY), true); sqlScript += NEWLINE; @@ -69,7 +69,7 @@ public interface MPJBaseMethod extends Constants { String filedSqlScript = tableInfo.getFieldList().stream() .filter(i -> { if (ignoreLogicDelFiled) { - return !(ConfigProperties.adapter.mpjHasLogic(tableInfo) && i.isLogicDelete()); + return !(ConfigProperties.tableInfoAdapter.mpjHasLogic(tableInfo) && i.isLogicDelete()); } return true; }) @@ -98,7 +98,7 @@ public interface MPJBaseMethod extends Constants { if (fieldStrategy == FieldStrategy.NEVER) { return null; } - if (ConfigProperties.adapter.mpjIsPrimitive(tableFieldInfo) || fieldStrategy == FieldStrategy.IGNORED) { + if (ConfigProperties.tableInfoAdapter.mpjIsPrimitive(tableFieldInfo) || fieldStrategy == FieldStrategy.IGNORED) { return sqlScript; } if (fieldStrategy == FieldStrategy.NOT_EMPTY && tableFieldInfo.isCharSequence()) { @@ -114,7 +114,7 @@ public interface MPJBaseMethod extends Constants { default String getLogicDeleteSql(TableInfo tableInfo, boolean startWithAnd, boolean isWhere) { - if (ConfigProperties.adapter.mpjHasLogic(tableInfo)) { + if (ConfigProperties.tableInfoAdapter.mpjHasLogic(tableInfo)) { String logicDeleteSql = formatLogicDeleteSql(tableInfo, isWhere); if (startWithAnd) { logicDeleteSql = " AND " + logicDeleteSql; @@ -126,15 +126,15 @@ public interface MPJBaseMethod extends Constants { default String formatLogicDeleteSql(TableInfo tableInfo, boolean isWhere) { - final String value = isWhere ? ConfigProperties.adapter.mpjGetLogicField(tableInfo).getLogicNotDeleteValue() : - ConfigProperties.adapter.mpjGetLogicField(tableInfo).getLogicDeleteValue(); + final String value = isWhere ? ConfigProperties.tableInfoAdapter.mpjGetLogicField(tableInfo).getLogicNotDeleteValue() : + ConfigProperties.tableInfoAdapter.mpjGetLogicField(tableInfo).getLogicDeleteValue(); if (isWhere) { if (NULL.equalsIgnoreCase(value)) { - return "${ew.alias}." + ConfigProperties.adapter.mpjGetLogicField(tableInfo).getColumn() + + return "${ew.alias}." + ConfigProperties.tableInfoAdapter.mpjGetLogicField(tableInfo).getColumn() + " IS NULL"; } else { - return "${ew.alias}." + ConfigProperties.adapter.mpjGetLogicField(tableInfo).getColumn() + - EQUALS + String.format(ConfigProperties.adapter.mpjGetLogicField(tableInfo).isCharSequence() ? + return "${ew.alias}." + ConfigProperties.tableInfoAdapter.mpjGetLogicField(tableInfo).getColumn() + + EQUALS + String.format(ConfigProperties.tableInfoAdapter.mpjGetLogicField(tableInfo).isCharSequence() ? "'%s'" : "%s", value); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java index a3bc982..a4007f2 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java @@ -179,7 +179,7 @@ public class MPJQueryWrapper extends AbstractWrapper selectAll(Class clazz, String as) { TableInfo info = TableHelper.get(clazz); Assert.notNull(info, "table not find by class <%s>", clazz); - if (ConfigProperties.adapter.mpjHasPK(info)) { + if (ConfigProperties.tableInfoAdapter.mpjHasPK(info)) { selectColumns.add(as + StringPool.DOT + info.getKeySqlSelect()); } selectColumns.addAll(info.getFieldList().stream().map(i -> diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LogicInfoUtils.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LogicInfoUtils.java index aa20e73..87556f3 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LogicInfoUtils.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/LogicInfoUtils.java @@ -46,8 +46,8 @@ public class LogicInfoUtils implements Constants { String logicStr; TableInfo tableInfo = TableHelper.get(clazz); Assert.notNull(tableInfo, "table not find by class <%s>", clazz.getSimpleName()); - TableFieldInfo logicField = ConfigProperties.adapter.mpjGetLogicField(tableInfo); - if (ConfigProperties.adapter.mpjHasLogic(tableInfo) && Objects.nonNull(logicField)) { + TableFieldInfo logicField = ConfigProperties.tableInfoAdapter.mpjGetLogicField(tableInfo); + if (ConfigProperties.tableInfoAdapter.mpjHasLogic(tableInfo) && Objects.nonNull(logicField)) { final String value = logicField.getLogicNotDeleteValue(); if (NULL.equalsIgnoreCase(value)) { logicStr = (and ? " AND " : EMPTY) + prefix + DOT + logicField.getColumn() + " IS NULL"; diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java index 992d6b6..f7a5056 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/support/ColumnCache.java @@ -30,7 +30,7 @@ public class ColumnCache { TableInfo tableInfo = TableHelper.get(clazz); Assert.notNull(tableInfo, "table not find by class <%s>", c.getSimpleName()); List list = new ArrayList<>(); - if (ConfigProperties.adapter.mpjHasPK(tableInfo)) { + if (ConfigProperties.tableInfoAdapter.mpjHasPK(tableInfo)) { list.add(new SelectCache(clazz, true, tableInfo.getKeyColumn(), tableInfo.getKeyType(), tableInfo.getKeyProperty(), null)); } list.addAll(tableInfo.getFieldList().stream().map(f -> new SelectCache(clazz, false, f.getColumn(), f.getPropertyType(), f.getProperty(), f)).collect(Collectors.toList())); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index 1cef1c2..2b22e8e 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -273,7 +273,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper wrapper : onWrappers) { if (wrapper.subLogicSql && this.logicDelType == LogicDelTypeEnum.ON) { TableInfo tableInfo = TableHelper.get(wrapper.getJoinClass()); - if (ConfigProperties.adapter.mpjHasLogic(tableInfo)) { + if (ConfigProperties.tableInfoAdapter.mpjHasLogic(tableInfo)) { wrapper.appendSqlSegments(APPLY, () -> LogicInfoUtils.getLogicInfoNoAnd( wrapper.getIndex(), wrapper.getJoinClass(), wrapper.isHasAlias(), wrapper.getAlias() )); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectCache.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectCache.java index cd086c1..8e10837 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectCache.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectCache.java @@ -57,7 +57,7 @@ public class SelectCache { if (this.hasTypeHandle) { TableInfo info = TableHelper.get(clazz); Assert.notNull(info, "table not find by class <%s>", clazz.getSimpleName()); - this.typeHandler = getTypeHandler(ConfigProperties.adapter.mpjGetConfiguration(info), tableFieldInfo); + this.typeHandler = getTypeHandler(ConfigProperties.tableInfoAdapter.mpjGetConfiguration(info), tableFieldInfo); } else { this.typeHandler = null; } diff --git a/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java b/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java index c300ca4..3327acf 100644 --- a/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java +++ b/mybatis-plus-join-test/test-base/src/main/java/com/github/yulichang/test/config/MybatisPlusConfig.java @@ -1,11 +1,16 @@ package com.github.yulichang.test.config; import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.ISqlInjector; +import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.github.yulichang.injector.MPJSqlInjector; import com.github.yulichang.test.util.ThreadLocalUtils; import lombok.SneakyThrows; import org.apache.ibatis.builder.SqlSourceBuilder; @@ -17,6 +22,9 @@ import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; import java.sql.Connection; import java.util.List; @@ -41,6 +49,37 @@ public class MybatisPlusConfig { return interceptor; } + @Bean + @Primary + @Order(Ordered.HIGHEST_PRECEDENCE) + public ISqlInjector sqlInjector() { + return new MPJSqlInjector() { + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + List list = super.getMethodList(mapperClass, tableInfo); + //添加你的方法 + list.add(new InsertBatchSomeColumn()); + return list; + } + }; + } + +// @Bean +// @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") +// public SqlSessionFactory sqlSessionFactory(DataSource dataSource, +// MybatisPlusInterceptor interceptor) throws Exception { +// MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean(); +// factory.setDataSource(dataSource); +// GlobalConfig.DbConfig config = new GlobalConfig.DbConfig(); +// config.setLogicDeleteField("del"); +// config.setLogicDeleteValue("true"); +// config.setLogicNotDeleteValue("false"); +// factory.setGlobalConfig(new GlobalConfig().setSqlInjector(new MPJSqlInjector()) +// .setDbConfig(config)); +// factory.setPlugins(interceptor); +// return factory.getObject(); +// } + /** * 校验sql */ diff --git a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/mapper/MyBaseMapper.java b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/mapper/MyBaseMapper.java index 96475e5..e992c2f 100644 --- a/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/mapper/MyBaseMapper.java +++ b/mybatis-plus-join-test/test-join/src/main/java/com/github/yulichang/test/join/mapper/MyBaseMapper.java @@ -1,14 +1,14 @@ package com.github.yulichang.test.join.mapper; import com.github.yulichang.base.MPJBaseMapper; +import com.github.yulichang.base.mapper.MPJDeepMapper; import org.apache.ibatis.annotations.Mapper; -import java.io.Serializable; import java.util.List; @Mapper -@SuppressWarnings("unused") -public interface MyBaseMapper extends MPJBaseMapper { +public interface MyBaseMapper extends MPJBaseMapper, MPJDeepMapper { + @SuppressWarnings("UnusedReturnValue") int insertBatchSomeColumn(List entityList); } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index 6b53937..54b56c2 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -23,6 +23,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.jdbc.BadSqlGrammarException; import java.sql.Timestamp; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -654,6 +655,10 @@ class LambdaWrapperTest { .select(UserDO::getName) .eq(UserDO::getName, "ref"); userMapper.selectList(wrapper); + try { + userMapper.insertBatchSomeColumn(new ArrayList<>()); + } catch (BadSqlGrammarException ignored) { + } }