您好,登錄后才能下訂單哦!
spring boot 本身自帶對(duì)數(shù)據(jù)源的支持。 但在項(xiàng)目開發(fā)過程中,存在這種情況需要用到多數(shù)據(jù)源,用spring boot 自帶的數(shù)據(jù)源就不是那么方便了。這里有個(gè)實(shí)例實(shí)現(xiàn)spring boot 完成多數(shù)據(jù)源的配置。
項(xiàng)目的目錄結(jié)構(gòu)是這樣的。
下面看看數(shù)據(jù)源配置
// 主數(shù)據(jù)源配置
package com.tansun.beanconfig.datasourse;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.alibaba.druid.pool.DruidDataSource;
/**
* 注:主程序使用數(shù)據(jù)源
* @author kangx
*
*/
@Configuration
@EnableAutoConfiguration
@MapperScan(basePackages = MainDSConfig.PACKAGE, sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MainDSConfig {
// 精確到 master 目錄,以便跟其他數(shù)據(jù)源隔離,不同數(shù)據(jù)源掃描的mapper
// 文件地址是不一樣的,如果放到統(tǒng)一路徑啟動(dòng)會(huì)報(bào)生成bean沖突。
static final String PACKAGE = "com.tansun.model.*.mapper";
static final String MAPPER_LOCATION = "classpath:com/tansun/model/*/master/*.xml";
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String user;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driver-class-name}")
private String driverClass;
/**
* 注:主數(shù)據(jù)源加@Primary 注解 表示當(dāng)系統(tǒng)有多個(gè)datasource 滿足條件,
* 默認(rèn)使用@Primary標(biāo)記的數(shù)據(jù)源
* @return
*/
@Bean(name = "masterDataSource")
@Primary
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setDbType("oracle");
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("databaseIdProvider") DatabaseIdProvider databaseIdProvider)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setDatabaseIdProvider(databaseIdProvider);
return sessionFactory.getObject();
}
@Bean(name = "masterSqlSessionTemplate")
public SqlSessionTemplate outerSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean("databaseIdProvider")
public DatabaseIdProvider getDatabaseIdProvider() {
DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties pro = new Properties();
pro.setProperty("Oracle", "oracle");
pro.setProperty("MySQL", "mysql");
databaseIdProvider.setProperties(pro);
return databaseIdProvider;
}
}
// 從數(shù)據(jù)源配置
package com.tansun.beanconfig.datasourse;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.mapping.DatabaseIdProvider;
import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.alibaba.druid.pool.DruidDataSource;
/**
* 注:定時(shí)任務(wù)使用數(shù)據(jù)源
* @author kangx
*/
@Configuration
@EnableAutoConfiguration
// import 表示引用主數(shù)據(jù)源的配置bean
@Import(value = { MainDSConfig.class })
@MapperScan(basePackages = RunTaskDSConfig.PACKAGE, sqlSessionTemplateRef = "runtaskSqlSessionTemplate")
public class RunTaskDSConfig {
// 精確到 master 目錄,以便跟其他數(shù)據(jù)源隔離--這兒掃描的地址和主數(shù)據(jù)地址//不同
static final String PACKAGE = "com.tansun.taskmodel.*.mapper";
static final String MAPPER_LOCATION = "classpath:com/tansun/taskmodel/*/master/*.xml";
@Value("${runtask.datasource.url}")
private String url;
@Value("${runtask.datasource.username}")
private String user;
@Value("${runtask.datasource.password}")
private String password;
@Value("${runtask.datasource.driverClassName}")
private String driverClass;
@Bean(name = "runtaskDataSource")
public DataSource masterDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setDbType("mysql");
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "runtaskTransactionManager")
public DataSourceTransactionManager masterTransactionManager() {
return new DataSourceTransactionManager(masterDataSource());
}
@Bean(name = "runtaskSqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("runtaskDataSource") DataSource masterDataSource,
@Qualifier("databaseIdProvider") DatabaseIdProvider databaseIdProvider)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setDatabaseIdProvider(databaseIdProvider);
return sessionFactory.getObject();
}
@Bean(name = "runtaskSqlSessionTemplate")
public SqlSessionTemplate outerSqlSessionTemplate(@Qualifier("runtaskSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean("runtaskDatabaseIdProvider")
public DatabaseIdProvider getDatabaseIdProvider() {
DatabaseIdProvider databaseIdProvider = new VendorDatabaseIdProvider();
Properties pro = new Properties();
pro.setProperty("Oracle", "oracle");
pro.setProperty("MySQL", "mysql");
databaseIdProvider.setProperties(pro);
return databaseIdProvider;
}
}
注 :
1主數(shù)據(jù)源配置 bean 上加@Primary標(biāo)簽,表示當(dāng)找多個(gè)符合的匹配時(shí),使用由 primary 標(biāo)記的bean。 如果不加Primary標(biāo)簽啟動(dòng)會(huì)報(bào)錯(cuò)。
2 runtaskDatabaseIdProvider -> bean 配置是為了設(shè)置數(shù)據(jù)庫兼容的設(shè)置。該處設(shè)置的值可以在, mapper文件中取到,用于標(biāo)記不同的數(shù)據(jù)庫,這一過程是有spring-mybatis 底層操作完成的。
數(shù)據(jù)源配置屬性文件
所在路徑
#數(shù)據(jù)庫配置
spring.datasource.driver-class-name=
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
spring.jpa.show-sql=true
#定時(shí)任務(wù)數(shù)據(jù)源配置
#runtask.datasource.url=jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8
#runtask.datasource.username=root
#runtask.datasource.password=root
#runtask.datasource.driverClassName=com.mysql.jdbc.Driver
runtask.datasource.driverClassName=
runtask.datasource.url=
runtask.datasource.username=
runtask.datasource.password=
runtask.jpa.show-sql=true
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。