Mybatisplusデータロード方式の動的データソース実現


前情提要


前にhttps://blog.csdn.net/z357904947/article/details/89157281このブロガーのブログは、データベースの動的ロードデータの実装を完了しました.
このブロガーは彼のコードリンクを送っているので、ブログと結びつけてすぐに実現しました.
しかし、その後、コードが少しlowになったような気がして、このブロガーは私のコメントにmybatis-plusに変更したと答えて、mybatis-plusが動的データソースを実現したと言った.私たちも人に迷惑をかけるのが耻ずかしくて、自分でドキュメントを見に行きました.主にどのようにデータベースから構成情報をロードするか、この部分は公式にインタフェースを予約して、後で主に私がどのように公式インタフェースを実現するかを書きます.

関連資料


公式文書の基礎項目:https://mp.baomidou.com/guide/dynamic-datasource.html動的な追加削除については、公式ドキュメントがあります.https://github.com/baomidou/dynamic-datasource-spring-boot-starter/wiki/Manual-Add-Remove-DataSource
注記の使用:https://github.com/baomidou/dynamic-datasource-spring-boot-starter/wiki/Dynamic-Analysis-DataSource
バージョンはあまり影響しないはずです.ここに私の依存関係を貼ってください.
        
            com.alibaba
            druid-spring-boot-starter
            1.1.21
        
        
            com.baomidou
            mybatis-plus-boot-starter
            3.1.0
        
        
            com.baomidou
            dynamic-datasource-spring-boot-starter
            2.5.4
        

これが私が使っているdruidとmybatis-plusの依存バージョンです.
1つ目のクラスは、構成情報クラスです.主にページングプラグインと自分で書いたデータベースのロード方式クラスを構成します.
package com.bonc.ioc.config;

import com.bonc.ioc.base.page.PagePlugin;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

/**
 * Created by wo on 2018-04-03.
 */
@Configuration
public class DataSourceConfig {

    @Value("${spring.datasource.dynamic.datasource.mysql.driverClassName}")
    private String driverClassName;
    @Value("${spring.datasource.dynamic.datasource.mysql.url}")
    private String url;
    @Value("${spring.datasource.dynamic.datasource.mysql.username}")
    private String username;
    @Value("${spring.datasource.dynamic.datasource.mysql.password}")
    private String password;

    @Bean
    public MysqlDynamicDataSourceProvider mysqlDynamicDataSourceProvider(){
        MysqlDynamicDataSourceProvider mysqlDynamicDataSourceProvider =
                new     
        MysqlDynamicDataSourceProvider(driverClassName,url,username,password);
        return mysqlDynamicDataSourceProvider;
    }

    @Bean(name="pagePlugin")
    @Primary
    public PagePlugin pagePlugin(){
        return new PagePlugin();
    }

}

別のクラスは、起動時に実行できるように提供された抽象クラスを継承します. 
package com.bonc.ioc.config;

import com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties;
import org.springframework.beans.factory.annotation.Autowired;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

/**
 *  Mysql 
 */

public class MysqlDynamicDataSourceProvider extends AbstractJdbcDataSourceProvider{

    public static final String mysqlDriver = "net.sf.log4jdbc.sql.jdbcapi.DriverSpy"; // mysql 
    public static final String oracleDriver = "oracle.jdbc.OracleDriver"; // oracles 
    public static final String sql2005Driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; // sqlserver 
    public static final String sql2000driver = "net.sourceforge.jtds.jdbc.Driver"; // sqlserver 

    public MysqlDynamicDataSourceProvider(String driverClassName, String url, String username, String password) {
        super(driverClassName, url, username, password);
    }

    @Override
    protected Map executeStmt(Statement statement) throws SQLException {
        Map map = new HashMap<>();
        ResultSet rs = statement.executeQuery("select * from facts_dbconnection");
        /**
         *  
         */
        while(rs.next()){

            String databaseType = rs.getString("db_type");

            String driverClassName = null;
            if (databaseType.equals("MYSQL")) {
                driverClassName = mysqlDriver;
            } else if (databaseType.equals("ORACLE")) {
                driverClassName = oracleDriver;
            } else if (databaseType.equals("SQLServer2000")) {
                driverClassName = sql2005Driver;
            } else if(databaseType.equals("SQLServer")) {
                driverClassName = sql2000driver;
            }

            String url = rs.getString("db_url");
            String username = rs.getString("db_username");
            String password = rs.getString("db_password");
            String key = rs.getString("db_name");

            DataSourceProperty dataSourceProperty = new DataSourceProperty();
            dataSourceProperty.setPollName(key);
            dataSourceProperty.setDriverClassName(driverClassName);
            dataSourceProperty.setUrl(url);
            dataSourceProperty.setUsername(username);
            dataSourceProperty.setPassword(password);

            map.put(key,dataSourceProperty);
        }
        return map;
    }
}

コードは簡単に関連情報をロードしてDataSourcePropertyクラスに配置し、切り替え時の名前を付けてkey-valueでmapコンテナに入れ、コンテナに戻ります.
実装を書き終わったら、原理を簡単に説明します.
私たちが継承したクラスのloadData Sourcesメソッドは、私が実装したexecuteStmtメソッドを呼び出して、私が返すデータソース情報を取得し、springコンテナにロードします.
なぜそれを実行するのかについては、まずmybatis-plusでspringが提供するインタフェースを実現し、関連する方法を書き換えるには、springクラスがorgであることが重要です.springframework.jdbc.datasource.AbstractDataSourceの後mybatis-plusには抽象クラス(com.baomidou.dynamic.datasource.AbstractRoutingDataSource)が継承するクラスcomがある.baomidou.dynamic.datasource.DynamicRoutingDataSourceはこの抽象クラスを継承し、InitializingBean、DisposableBeanの2つのインタフェースを実現し、afterPropertiesSetインタフェースを書き換えるときにloadDataSource()メソッドを呼び出してdataSourceMapコンテナの内容を構成します.
DataSourceMapコンテナはmybatis-plusが実現したデータソースコンテナです.簡単に言えばdataSourceMapにspringコンテナに入れ終わったら、あなたが入れたデータソースを見つけることができます(n多原理を省略しすぎて、私は大体理解できますが、本当に言えません.タイプするのがおっくうです...).
ネット上の多くはすべて多データのソースで、配置のファイルの中で配置して、ひっくり返して、感じはすべてコピーして貼り付けたので、ここはmybatis-plusに感謝して、そして私の文章の冒頭のブロガー、さもなくば私自身はきっと決められないで、結局料理~~~~