SpringBoot項(xiàng)目中同時操作多個數(shù)據(jù)庫的實(shí)現(xiàn)方法
在實(shí)際項(xiàng)目開發(fā)中可能存在需要同時操作兩個數(shù)據(jù)庫的場景,比如從A庫讀取數(shù)據(jù),進(jìn)行操作后往B庫中寫入數(shù)據(jù),此時就需要進(jìn)行多數(shù)據(jù)庫配置。本文以操作本地和線上的MySQL數(shù)據(jù)庫為例:
一、導(dǎo)入相關(guān)pom文件
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
二、application.yml配置文件編寫
單數(shù)據(jù)源的配置如下:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/meal_order?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
多數(shù)據(jù)源的配置如下:
spring:
datasource:
dev:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://xxx.xx.xx.xx:3306/meal_order?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
local:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://127.0.0.1:3306/db2021?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
經(jīng)過對比可以發(fā)現(xiàn):
1、多數(shù)據(jù)源的配置中需要指定具體的名稱來區(qū)分不同的數(shù)據(jù)庫(上述配置中的dev和local,名稱可以根據(jù)具體需求自定義)
2、需要使用jdbcUrl代替url
三、數(shù)據(jù)庫連接配置文件
dev數(shù)據(jù)源配置文件:
@Configuration
@MapperScan(basePackages = "com.multiple.mapper.dev",sqlSessionFactoryRef = "devSqlSessionFactory")
public class DevDataSourceConfig {
@Primary
@Bean(name = "devDataSource")
@ConfigurationProperties("spring.datasource.dev")
public DataSource masterDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "devSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("devDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mapping/dev/*.xml"));
return sessionFactoryBean.getObject();
}
}
local數(shù)據(jù)源配置文件:
@Configuration
@MapperScan(basePackages = "com.multiple.mapper.local",sqlSessionFactoryRef = "localSqlSessionFactory")
public class LocalDataSourceConfig {
@Primary
@Bean(name = "localDataSource")
@ConfigurationProperties("spring.datasource.local")
public DataSource masterDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "localSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("localDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:mapping/local/*.xml"));
return sessionFactoryBean.getObject();
}
}
不同配置文件通過@MapperScan注解的內(nèi)容來區(qū)分不同數(shù)據(jù)庫下的mapper文件,通過@ConfigurationProperties注解來加載指定的數(shù)據(jù)源
以DevDataSourceConfig為例

四、主啟動類注解修改
@SpringBootApplication(exclude={<!--{C}%3C!%2D%2D%20%2D%2D%3E-->DataSourceAutoConfiguration.class})目錄結(jié)構(gòu)如下:

五、測試
從dev庫中查詢數(shù)據(jù),取出字段插入local庫中:
public interface DevMapper {
@Select("select * from test")
List<Test> getAllTest();
}
public interface LocalMapper {
@Insert("insert into payment(serial) values (#{name})")
int insertMessage(String name);
}
@SpringBootTest
class MultipleDatabaseApplicationTests {
@Autowired
private DevMapper devMapper;
@Autowired
private LocalMapper localMapper;
@Test
void contextLoads() {
List<com.multiple.pojo.Test> testList = devMapper.getAllTest();
for(com.multiple.pojo.Test test : testList){
localMapper.insertMessage(test.getAa());
}
}
}
運(yùn)行測試代碼,從dev庫中查出的數(shù)據(jù)可以成功添加至local庫
該方法也適用需要使用多種不同的數(shù)據(jù)庫的場景,比如MySQL和Oracle,修改數(shù)據(jù)源配置文件即可
到此這篇關(guān)于SpringBoot項(xiàng)目中同時操作多個數(shù)據(jù)庫的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)SpringBoot項(xiàng)目操作多個數(shù)據(jù)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入了解Java核心類庫--Date,Calendar,DateFormat類
這篇文章主要為大家詳細(xì)介紹了javaDate,Calendar,DateFormat類定義與使用的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助2021-07-07
java中字符串轉(zhuǎn)整數(shù)及MyAtoi方法的實(shí)現(xiàn)
這篇文章主要介紹了java中字符串轉(zhuǎn)整數(shù)及MyAtoi方法的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-05-05
JAVA使用POI(XSSFWORKBOOK)讀取EXCEL文件過程解析
這篇文章主要介紹了JAVA使用POI(XSSFWORKBOOK)讀取EXCEL文件過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08
一文帶你看懂Java8中的lambda表達(dá)式和方法引用
Lambda 表達(dá)式是 Java 8 引入的一項(xiàng)重要特性,它提供了一種簡潔、清晰且靈活的語法來表示可傳遞的匿名函數(shù),下面就跟隨小編一起學(xué)習(xí)一下Java8中的lambda表達(dá)式和方法引用的相關(guān)知識吧2023-12-12

