SpringBoot项目中同时操作多个数据库的实现方法

网友投稿 1801 2022-10-21

SpringBoot项目中同时操作多个数据库的实现方法

SpringBoot项目中同时操作多个数据库的实现方法

目录1、导入相关pom文件二、application.yml配置文件编写三、数据库连接配置文件四、主启动类注解修改五、测试

在实际项目开发中可能存在需要同时操作两个数据库的场景,比如从A库读取数据,进行操作后往B库中写入数据,此时就需要进行多数据库配置。本文以操作本地和线上的mysql数据库为例:

1、导入相关pom文件

mysql

mysql-connector-java

runtime

org.springframework.boot

spring-boot-starter-jdbc

org.mybatis

mybatis

3.5.5

com.alibaba

druid

1.2.3

org.mybatis

mybatis-spring

2.0.7

org.projectlombok

lombok

true

二、application.yml配置文件编写

单数据源的配置如下:

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

多数据源的配置如下:

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

经过对比可以发现:1、多数据源的配置中需要指定具体的名称来区分不同的数据库(上述配置中的dev和local,名称可以根据具体需求自定义)2、需要使用jdbcUrl代替url

三、数据库连接配置文件

dev数据源配置文件:

@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数据源配置文件:

@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注解的内容来区分不同数据库下的mapper文件,通过@ConfigurationProperties注解来加载指定的数据源

以DevDataSourceConfig为例

四、主启动类注解修改

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})

目录结构如下:

五、测试

从dev库中查询数据,取出字段插入local库中:

public interface DevMapper {

@Select("select * from test")

List 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 testList = devMapper.getAllTest();

for(com.multiple.pojo.Test test : testList){

localMapper.insertMessage(test.getAa());

}

}

}

运行测试代码,从dev库中查出的数据可以成功添加至local库该方法也适用需要使用多种不同的数据库的场景,比如MySQL和Oracle,修改数据源配置文件即可

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:把二叉树打印成多行
下一篇:两个链表的第一个公共结点
相关文章

 发表评论

暂时没有评论,来抢沙发吧~