Mybatisplusデータロード方式の動的データソース実現
6591 ワード
前情提要
前に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に感謝して、そして私の文章の冒頭のブロガー、さもなくば私自身はきっと決められないで、結局料理~~~~
公式文書の基礎項目: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に感謝して、そして私の文章の冒頭のブロガー、さもなくば私自身はきっと決められないで、結局料理~~~~