All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zodiac.mybatisplus.extension.MyBatisPlusProcessor Maven / Gradle / Ivy

There is a newer version: 1.6.8
Show newest version
package org.zodiac.mybatisplus.extension;

import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.zodiac.plugin.factory.PluginRegistryInfo;
import org.zodiac.sdk.toolkit.util.lang.ObjUtil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.scripting.LanguageDriver;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.Resource;
import org.zodiac.mybatis.extension.AbstractMyBatisProcessor;
import org.zodiac.mybatis.extension.CommonRegister;
import org.zodiac.mybatis.extension.MapperHandler;
import org.zodiac.mybatis.extension.PluginResourceFinder;
import org.zodiac.mybatisplus.config.MyBatisPlusConfigInfo;

/**
 * springboot-mybatis plus 处理者。
 * 
 */
public class MyBatisPlusProcessor extends AbstractMyBatisProcessor {

    private MyBatisPlusPluginFollowCoreConfig myBatisPlusPluginFollowCoreConfig;

    public MyBatisPlusProcessor() {}

    public MyBatisPlusProcessor(MyBatisPlusPluginFollowCoreConfig myBatisPlusPluginFollowCoreConfig) {
        this.myBatisPlusPluginFollowCoreConfig = myBatisPlusPluginFollowCoreConfig;
    }

    @Override
    public String key() {
        return "MybatisPlusProcessor";
    }

    @Override
    public void registry(PluginRegistryInfo pluginRegistryInfo) throws Exception {
        SpringBootMybatisPlusConfig config = ObjUtil.getObjectByInterfaceClass(
            pluginRegistryInfo.getConfigSingletons(), SpringBootMybatisPlusConfig.class);
        if (config == null) {
            return;
        }
        final MybatisSqlSessionFactoryBean factory = new MybatisSqlSessionFactoryBean();

        if (config.enableOneselfConfig()) {
            config.oneselfConfig(factory);
        } else {
            MyBatisPlusPluginFollowCoreConfig followCoreConfig = null != myBatisPlusPluginFollowCoreConfig ?
                myBatisPlusPluginFollowCoreConfig : new MyBatisPlusPluginFollowCoreConfig(pluginRegistryInfo.getMainApplicationContext());
            MybatisConfiguration mybatisPlusConfiguration = followCoreConfig.getMybatisPlusConfiguration();
            factory.setDataSource(followCoreConfig.getDataSource());
            factory.setConfiguration(mybatisPlusConfiguration);
            Interceptor[] interceptor = followCoreConfig.getInterceptor();
            if (interceptor != null && interceptor.length > 0) {
                factory.setPlugins(interceptor);
            }
            DatabaseIdProvider databaseIdProvider = followCoreConfig.getDatabaseIdProvider();
            if (databaseIdProvider != null) {
                factory.setDatabaseIdProvider(databaseIdProvider);
            }
            LanguageDriver[] languageDriver = followCoreConfig.getLanguageDriver();
            if (languageDriver != null) {
                factory.setScriptingLanguageDrivers(languageDriver);
            }
            /*配置mybatis-plus私有的配置*/
            GlobalConfig globalConfig =
                mybatisPlusFollowCoreConfig(factory, pluginRegistryInfo.getMainApplicationContext());
            config.reSetMainConfig(mybatisPlusConfiguration, globalConfig);
        }

        PluginResourceFinder pluginResourceFinder = new PluginResourceFinder(pluginRegistryInfo);

        Class[] aliasesClasses = pluginResourceFinder.getAliasesClasses(config.entityPackage());
        if (aliasesClasses != null && aliasesClasses.length > 0) {
            factory.setTypeAliases(aliasesClasses);
        }

        Resource[] xmlResource = pluginResourceFinder.getXmlResource(config.xmlLocationsMatch());
        if (xmlResource != null && xmlResource.length > 0) {
            factory.setMapperLocations(xmlResource);
        }
        ClassLoader defaultClassLoader = Resources.getDefaultClassLoader();
        try {
            Resources.setDefaultClassLoader(pluginRegistryInfo.getPluginClassLoader());
            SqlSessionFactory sqlSessionFactory = factory.getObject();
            if (sqlSessionFactory == null) {
                throw new Exception("Get mybatis-plus sqlSessionFactory is null");
            }
            SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
            MapperHandler mapperHandler = new MapperHandler();
            mapperHandler.processMapper(pluginRegistryInfo, (holder, mapperClass) -> {
                mapperHandler.commonProcessMapper(holder, mapperClass, sqlSessionFactory, sqlSessionTemplate);
            });
            CommonRegister.commonRegister(pluginRegistryInfo, sqlSessionFactory, sqlSessionTemplate);
        } finally {
            Resources.setDefaultClassLoader(defaultClassLoader);
        }

    }

    private GlobalConfig mybatisPlusFollowCoreConfig(MybatisSqlSessionFactoryBean factory,
        GenericApplicationContext mainApplicationContext) {
        MyBatisPlusConfigInfo plusProperties = mainApplicationContext.getBean(MyBatisPlusConfigInfo.class);

        GlobalConfig currentGlobalConfig = new GlobalConfig();
        currentGlobalConfig.setBanner(false);
        GlobalConfig globalConfig = plusProperties.getGlobalConfig();
        if (globalConfig != null) {
            currentGlobalConfig.setDbConfig(globalConfig.getDbConfig());
            // currentGlobalConfig.setIdentifierGenerator(globalConfig.getIdentifierGenerator());
            currentGlobalConfig.setMetaObjectHandler(globalConfig.getMetaObjectHandler());
            currentGlobalConfig.setSqlInjector(globalConfig.getSqlInjector());
        }
        factory.setGlobalConfig(currentGlobalConfig);
        return currentGlobalConfig;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy