SpringBoot学习笔记【四】多数据源配置

配置

首先,在application配置文件中添加多个数据数据源,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server:
port: 8803
spring:
datasource:
sys:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring-boot-demo?useSSL=false&useUnicode=true&characterEncoding=utf8
username: root
password:
fin:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/spring-boot-demo-backup?useSSL=false&useUnicode=true&characterEncoding=utf8
username: root
password:

# mybatis映射文件路径
mybatis:
mapper-locations: classpath*:mappers/*Mapper.xml

这里配置了sys和fin两个数据源,分别对应spring-boot-demo和spring-boot-demo-backup数据库。

然后,对这两个数据源进行配置,配置类如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Configuration
@MapperScan(basePackages = "com.greedystar.sample4.fin.dao", sqlSessionTemplateRef = "finSqlSessionTemplate")
public class FinDataSourceConfig {

@Bean(name = "finDataSource")
@ConfigurationProperties(prefix = "spring.datasource.fin")
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
return dataSource;
}

@Bean(name = "finSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("finDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/fin/*Mapper.xml"));
return bean.getObject();
}

@Bean(name = "finTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("finDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}

@Bean(name = "finSqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("finSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Configuration
@MapperScan(basePackages = "com.greedystar.sample4.sys.dao", sqlSessionTemplateRef = "sysSqlSessionTemplate")
public class SysDataSourceConfig {

@Bean(name = "sysDataSource")
@ConfigurationProperties(prefix = "spring.datasource.sys")
@Primary
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
return dataSource;
}

@Bean(name = "sysSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("sysDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/sys/*Mapper.xml"));
return bean.getObject();
}

@Bean(name = "sysTransactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("sysDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}

@Bean(name = "sysSqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sysSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}

}

这里需要注意,在两个数据源的配置中要特别区分DAO接口的包路径和映射文件的路径,当我们使用不同的DAO对象时便会访问不同的数据源。

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = Sample4Application.class)
public class Test {
@Autowired
private UserDao userDao;
@Autowired
private RoleDao roleDao;

@org.junit.Test
public void test() {
System.out.println(JSON.toJSON(userDao.findAllList()));
System.out.println(JSON.toJSON(roleDao.findAllList()));
}
}

控制台打印如下:

可以看到初始化了两个数据源,并访问不同的数据源查询了数据。

源码地址:https://github.com/GreedyStar/SpringBootDemo/tree/sample-4

最后的最后,安利一下自己写的一个Java代码生成工具,能够方便的生成Spring、SpringMVC、Mybatis架构下的Java代码,希望能对大家有所帮助,地址:Java代码生成器:Generator

来发评论吧~
Powered By Valine
v1.5.2