在guns 5.1框架的基础上,扩展了多数据源的集成方法,更方便使用!!!
在此感谢下 guns 的开源作者【https://gitee.com/stylefeng/guns】
1.修改配置:application.yml
#多数据源情况的配置
guns:
muti-datasource:
open: true
dataConnectionPropertiesList:
- dataSourceName: dataSourceBiz1
url: jdbc:mysql://127.0.0.1:3306/testdb2?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT
username: root
password: root
- dataSourceName: dataSourceBiz2
url: jdbc:mysql://127.0.0.1:3306/testdb3?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=CTT
username: root
password: root
2.1.修改类:MultiDataSourceConfig.java,数据源核心配置
package cn.stylefeng.guns.config.datasource; import cn.stylefeng.guns.config.datasource.extra.DataConnectionProperties; import cn.stylefeng.guns.config.datasource.extra.MultiDataSourceExtraProperties; import cn.stylefeng.guns.core.common.constant.DatasourceEnum; import cn.stylefeng.roses.core.config.properties.DruidProperties; import cn.stylefeng.roses.core.config.properties.MutiDataSourceProperties; import cn.stylefeng.roses.core.datascope.DataScopeInterceptor; import cn.stylefeng.roses.core.mutidatasource.DynamicDataSource; import cn.stylefeng.roses.core.mutidatasource.aop.MultiSourceExAop; import com.alibaba.druid.pool.DruidDataSource; import com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor; import com.baomidou.mybatisplus.plugins.PaginationInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; import java.sql.SQLException; import java.util.HashMap; /** * 多数据源配置<br/> * <p> * 注:由于引入多数据源,所以让spring事务的aop要在多数据源切换aop的后面 * * @author stylefeng * @Date 2017/5/20 21:58 */ @Configuration @ConditionalOnProperty(prefix = "guns.muti-datasource", name = "open", havingValue = "true") @EnableTransactionManagement(order = 2, proxyTargetClass = true) @MapperScan(basePackages = {"cn.stylefeng.guns.modular.*.dao", "cn.stylefeng.guns.multi.mapper"}) public class MultiDataSourceConfig { /** * druid配置 */ @Bean @ConfigurationProperties(prefix = "spring.datasource") public DruidProperties druidProperties() { return new DruidProperties(); } /** * 多数据源配置 原配置【只是为兼容MultiSourceExAop】 */ @Bean public MutiDataSourceProperties mutiDataSourceProperties() { MutiDataSourceProperties mutiDataSourceProperties=new MutiDataSourceProperties(); String arr[] = {DatasourceEnum.DATA_SOURCE_GUNS}; mutiDataSourceProperties.setDataSourceNames(arr); return mutiDataSourceProperties; } /** * 多数据源配置 扩展配置 */ @Bean @ConfigurationProperties(prefix = "guns.muti-datasource") public MultiDataSourceExtraProperties multiDataSourceExtraProperties() { return new MultiDataSourceExtraProperties(); } /** * 多数据源切换的aop */ @Bean public MultiSourceExAop multiSourceExAop() { return new MultiSourceExAop(); } /** * guns的数据源 */ private DruidDataSource dataSource(DruidProperties druidProperties) { DruidDataSource dataSource = new DruidDataSource(); druidProperties.config(dataSource); return dataSource; } /** * 多数据源连接池配置 */ @Bean public DynamicDataSource mutiDataSource(DruidProperties druidProperties,MultiDataSourceExtraProperties multiDataSourceExtraProperties) { HashMap<Object, Object> hashMap = new HashMap<>(); DruidDataSource dataSourceGuns = dataSource(druidProperties); try{ dataSourceGuns.init(); hashMap.put(DatasourceEnum.DATA_SOURCE_GUNS,dataSourceGuns); for(DataConnectionProperties dataConnectionProperties:multiDataSourceExtraProperties.getDataConnectionPropertiesList()){ DruidDataSource dataSource = new DruidDataSource(); druidProperties.config(dataSource); dataConnectionProperties.config(dataSource); dataSource.init(); hashMap.put(dataConnectionProperties.getDataSourceName(),dataSource); } }catch (SQLException e){ e.printStackTrace(); } DynamicDataSource dynamicDataSource = new DynamicDataSource(); dynamicDataSource.setTargetDataSources(hashMap); dynamicDataSource.setDefaultTargetDataSource(dataSourceGuns); return dynamicDataSource; } /** * mybatis-plus分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); } /** * 数据范围mybatis插件 */ @Bean public DataScopeInterceptor dataScopeInterceptor() { return new DataScopeInterceptor(); } /** * 乐观锁mybatis插件 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } }
新增两个个类的目录结构图
2.2.新增类:DataConnectionProperties
package cn.stylefeng.guns.config.datasource.extra; import com.alibaba.druid.pool.DruidDataSource; public class DataConnectionProperties { private String dataSourceName = ""; private String url = "jdbc:mysql://127.0.0.1:3306/biz?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"; private String username = "root"; private String password = "root"; private String driverClassName = "com.mysql.cj.jdbc.Driver"; private String validationQuery = "SELECT 'x'"; public void config(DruidDataSource dataSource) { dataSource.setUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); dataSource.setDriverClassName(driverClassName); dataSource.setValidationQuery(validationQuery); } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDriverClassName() { return driverClassName; } public void setDriverClassName(String driverClassName) { this.driverClassName = driverClassName; } public String getValidationQuery() { return validationQuery; } public void setValidationQuery(String validationQuery) { this.validationQuery = validationQuery; } public String getDataSourceName() { return dataSourceName; } public void setDataSourceName(String dataSourceName) { this.dataSourceName = dataSourceName; } }
2.3.新增类:MultiDataSourceExtraProperties
package cn.stylefeng.guns.config.datasource.extra; import com.alibaba.druid.pool.DruidDataSource; import java.util.List; public class MultiDataSourceExtraProperties { private List<DataConnectionProperties> dataConnectionPropertiesList; public List<DataConnectionProperties> getDataConnectionPropertiesList() { return dataConnectionPropertiesList; } public void setDataConnectionPropertiesList(List<DataConnectionProperties> dataConnectionPropertiesList) { this.dataConnectionPropertiesList = dataConnectionPropertiesList; } public void config(DruidDataSource druidDataSource, DataConnectionProperties dataConnectionProperties) { druidDataSource.setUrl(dataConnectionProperties.getUrl()); druidDataSource.setUsername(dataConnectionProperties.getUsername()); druidDataSource.setPassword(dataConnectionProperties.getPassword()); druidDataSource.setDriverClassName(dataConnectionProperties.getDriverClassName()); druidDataSource.setValidationQuery(dataConnectionProperties.getValidationQuery()); } }
使用步骤:
1.启动类排除 MybaitsPlusAutoConfiguration.class
2.注意此处的数据源与application.yml的数据源名称一致
public interface DatasourceEnum { String DATA_SOURCE_GUNS = "dataSourceGuns"; //guns数据源 String DATA_SOURCE_BIZ1 = "dataSourceBiz1"; //其他业务的数据源 String DATA_SOURCE_BIZ2 = "dataSourceBiz2"; //其他业务的数据源 }
3.执行测试,查看你的数据有没有进去