Selaa lähdekoodia

增加Db对多数据源的支持.

https://github.com/baomidou/mybatis-plus/issues/6577
nieqiurong 3 kuukautta sitten
vanhempi
commit
b2082354c6

+ 11 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/spi/CompatibleSet.java

@@ -39,4 +39,15 @@ public interface CompatibleSet {
     @Deprecated
     InputStream getInputStream(String path) throws Exception;
 
+    /**
+     * 获取容器bean实例
+     *
+     * @param clz 类型
+     * @return bean实例 (当无实例时返回null)
+     * @since 3.5.12
+     */
+    default <T> T getBean(Class<T> clz) {
+        return null;
+    }
+
 }

+ 8 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SqlHelper.java

@@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
 import com.baomidou.mybatisplus.core.toolkit.*;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.baomidou.mybatisplus.extension.spi.CompatibleHelper;
+import com.baomidou.mybatisplus.extension.spi.CompatibleSet;
 import org.apache.ibatis.executor.BatchResult;
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.session.ExecutorType;
@@ -296,6 +297,13 @@ public final class SqlHelper {
         Assert.notNull(entityClass, "entityClass can't be null!");
         TableInfo tableInfo = Optional.ofNullable(TableInfoHelper.getTableInfo(entityClass)).orElseThrow(() -> ExceptionUtils.mpe("Can not find TableInfo from Class: \"%s\".", entityClass.getName()));
         Class<?> mapperClass = ClassUtils.toClassConfident(tableInfo.getCurrentNamespace());
+        if (CompatibleHelper.hasCompatibleSet()) {
+            CompatibleSet compatibleSet = CompatibleHelper.getCompatibleSet();
+            Object bean = compatibleSet.getBean(mapperClass);
+            if (bean != null) {
+                return (M) bean;
+            }
+        }
         return (M) tableInfo.getConfiguration().getMapper(mapperClass, sqlSession);
     }
 

+ 18 - 0
mybatis-plus-spring/src/main/java/com/baomidou/mybatisplus/extension/spi/SpringCompatibleSet.java

@@ -16,9 +16,11 @@
 package com.baomidou.mybatisplus.extension.spi;
 
 import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
+import com.baomidou.mybatisplus.extension.spring.MybatisPlusApplicationContextAware;
 import lombok.SneakyThrows;
 import org.apache.ibatis.exceptions.PersistenceException;
 import org.apache.ibatis.logging.Log;
+import org.apache.ibatis.logging.LogFactory;
 import org.apache.ibatis.reflection.ExceptionUtil;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
@@ -26,6 +28,8 @@ import org.apache.ibatis.session.SqlSessionFactory;
 import org.mybatis.spring.MyBatisExceptionTranslator;
 import org.mybatis.spring.SqlSessionHolder;
 import org.mybatis.spring.SqlSessionUtils;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.context.ApplicationContext;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.transaction.support.TransactionSynchronizationManager;
 
@@ -37,6 +41,8 @@ import java.util.function.Consumer;
  */
 public class SpringCompatibleSet implements CompatibleSet {
 
+    private static final Log LOG = LogFactory.getLog(SpringCompatibleSet.class);
+
     @Override
     public SqlSession getSqlSession(SqlSessionFactory sessionFactory) {
         return SqlSessionUtils.getSqlSession(sessionFactory);
@@ -88,4 +94,16 @@ public class SpringCompatibleSet implements CompatibleSet {
     public InputStream getInputStream(String path) throws Exception {
         return new ClassPathResource(path).getInputStream();
     }
+
+    @Override
+    public <T> T getBean(Class<T> clz) {
+        if (MybatisPlusApplicationContextAware.hasApplicationContext()) {
+            ApplicationContext applicationContext = MybatisPlusApplicationContextAware.getApplicationContext();
+            ObjectProvider<T> provider = applicationContext.getBeanProvider(clz);
+            return provider.getIfAvailable();
+        }
+        LOG.warn("MybatisPlusApplicationContextAware is not initialized. Please ensure that MybatisPlusApplicationContextAware is properly registered as a Spring Bean in the application context.");
+        return null;
+    }
+
 }

+ 53 - 0
mybatis-plus-spring/src/main/java/com/baomidou/mybatisplus/extension/spring/MybatisPlusApplicationContextAware.java

@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2011-2025, baomidou (jobob@qq.com).
+ *
+ * Licensed 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 com.baomidou.mybatisplus.extension.spring;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeansException;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+/**
+ * Spring容器访问
+ *
+ * @author nieqiurong
+ * @since 3.5.12
+ */
+public class MybatisPlusApplicationContextAware implements ApplicationContextAware {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(MybatisPlusApplicationContextAware.class);
+
+    private static ApplicationContext applicationContext;
+
+    @Override
+    public void setApplicationContext(@NotNull ApplicationContext applicationContext) throws BeansException {
+        LOGGER.info("Register ApplicationContext instances {}", applicationContext.getDisplayName());
+        MybatisPlusApplicationContextAware.applicationContext = applicationContext;
+    }
+
+    public static boolean hasApplicationContext() {
+        return applicationContext != null;
+    }
+
+    public static ApplicationContext getApplicationContext() {
+        Assert.isTrue(hasApplicationContext(), "applicationContext is null");
+        return applicationContext;
+    }
+
+}

+ 7 - 0
spring-boot-starter/mybatis-plus-spring-boot-autoconfigure/src/main/java/com/baomidou/mybatisplus/autoconfigure/MybatisPlusAutoConfiguration.java

@@ -24,6 +24,7 @@ import com.baomidou.mybatisplus.core.handlers.PostInitTableInfoHandler;
 import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
 import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
 import com.baomidou.mybatisplus.core.injector.ISqlInjector;
+import com.baomidou.mybatisplus.extension.spring.MybatisPlusApplicationContextAware;
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.mapping.DatabaseIdProvider;
@@ -375,4 +376,10 @@ public class MybatisPlusAutoConfiguration implements InitializingBean {
         }
     }
 
+    @Bean
+    @ConditionalOnMissingBean(MybatisPlusApplicationContextAware.class)
+    public MybatisPlusApplicationContextAware mybatisPlusSpringApplicationContextAware() {
+        return new MybatisPlusApplicationContextAware();
+    }
+
 }