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

com.github.jun1st.datasource.MSDataSourceCreator Maven / Gradle / Ivy

package com.github.jun1st.datasource;

import com.github.jun1st.datasource.spring.boot.autoconfigure.hikari.MSHikariConfig;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import javax.sql.DataSource;
import java.lang.reflect.Method;

@Slf4j
public class MSDataSourceCreator {

    private static final String HIKARI_DATASOURCE = "com.zaxxer.hikari.HikariDataSource";


    private Method createMethod;
    private Method typeMethod;
    private Method urlMethod;
    private Method usernameMethod;
    private Method passwordMethod;
    private Method driverClassNameMethod;
    private Method buildMethod;

    private Boolean hikariExists = false;

    @Setter
    private MSHikariConfig msHikariConfig;

    public MSDataSourceCreator() {
        Class builderClass = null;

        try {
            builderClass = Class.forName("org.springframework.boot.jdbc.DataSourceBuilder");
        } catch (Exception ex) {
            try {
                builderClass = Class.forName("org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        try {
            createMethod = builderClass.getDeclaredMethod("create");
            typeMethod = builderClass.getDeclaredMethod("type", Class.class);
            urlMethod = builderClass.getDeclaredMethod("url", String.class);
            usernameMethod = builderClass.getDeclaredMethod("username", String.class);
            passwordMethod = builderClass.getDeclaredMethod("password", String.class);
            driverClassNameMethod = builderClass.getDeclaredMethod("driverClassName", String.class);
            buildMethod = builderClass.getDeclaredMethod("build");
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            Class.forName(HIKARI_DATASOURCE);
            hikariExists = true;
        } catch (ClassNotFoundException e) {
        }
    }

    public DataSource create(DataSourceProperty dataSourceProperty) {
        if (hikariExists) {
            return createHikariDataSource(dataSourceProperty);
        }

        return createBasicDataSource(dataSourceProperty);
    }

    private DataSource createBasicDataSource(DataSourceProperty dataSourceProperty) {
        try {
            Object o1 = createMethod.invoke(null);
            Object o2 = typeMethod.invoke(o1, dataSourceProperty.getType());
            Object o3 = urlMethod.invoke(o1, dataSourceProperty.getUrl());
            Object o4 = usernameMethod.invoke(o3, dataSourceProperty.getUsername());
            Object o5 = passwordMethod.invoke(o4, dataSourceProperty.getPassword());
            Object o6 = driverClassNameMethod.invoke(o5, dataSourceProperty.getDriverClassName());
            return (DataSource) buildMethod.invoke(o6);
        } catch (Exception e) {
            throw new RuntimeException("多数据源创建数据源失败");
        }
    }

    private DataSource createHikariDataSource(DataSourceProperty dataSourceProperty) {
        MSHikariConfig msHikariConfig = dataSourceProperty.getHikari();
        HikariConfig config = msHikariConfig.toHikariConfig(msHikariConfig);

        config.setUsername(dataSourceProperty.getUsername());
        config.setPassword(dataSourceProperty.getPassword());
        config.setJdbcUrl(dataSourceProperty.getUrl());
        config.setDriverClassName(dataSourceProperty.getDriverClassName());

        return new HikariDataSource(config);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy