下面我将详细讲解Spring Boot整合持久层之JdbcTemplate多数据源的完整攻略。
1. 前置条件
在运行本教程的示例之前,需要确保以下条件已被满足:
- 已经安装了Java和Maven
- 已经安装了MySQL数据库,并且创建了至少两个数据库,命名为
db1
和db2
,用户为root,密码为123456。
2. 引入依赖
首先需要在maven的pom.xml
文件中引入Spring Boot JdbcTemplate和MySQL数据库的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
3. 配置数据源
在Spring Boot中配置多个数据源需要分别配置多个DataSource
对象和JdbcTemplate
对象,以下是一个配置两个数据源的示例:
@Configuration
public class DataSourceConfig {
@Bean(name = "firstDataSource")
@Qualifier("firstDataSource")
@ConfigurationProperties(prefix="spring.datasource.first")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondDataSource")
@Qualifier("secondDataSource")
@ConfigurationProperties(prefix="spring.datasource.second")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "firstJdbcTemplate")
public JdbcTemplate primaryJdbcTemplate(
@Qualifier("firstDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "secondJdbcTemplate")
public JdbcTemplate secondaryJdbcTemplate(
@Qualifier("secondDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
需要注意的是,在配置数据源时需要指定@ConfigurationProperties(prefix="spring.datasource.first")
,后面的"first"为application.properties中配置的数据源的前缀,例如下面的application.properties文件中的配置,就需要使用spring.datasource.first
和spring.datasource.second
分别指定两个数据源的属性。
spring.datasource.first.url=jdbc:mysql://localhost:3306/db1?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
spring.datasource.first.username=root
spring.datasource.first.password=123456
spring.datasource.first.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.second.url=jdbc:mysql://localhost:3306/db2?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
spring.datasource.second.username=root
spring.datasource.second.password=123456
spring.datasource.second.driver-class-name=com.mysql.cj.jdbc.Driver
在上述代码的@Configuration注释表示配置类,@Bean表示创建实例。其中,firstDataSource和secondDataSource分别用@ConfigurationProperties(prefix="spring.datasource.first")和@ConfigurationProperties(prefix="spring.datasource.second")指定了数据源的配置,@Qualifier用来区分在同一个类下有多个同类型的实例,spring在装配bean的时候会使用@Bean对应方法的方法名来作为默认的Bean名称,primaryDataSource()和secondaryDataSource()方法都称之为“Bean定义方法”,返回值是被@Bean注解的方法创建的bean实例。因为创建出来的bean都是单例模式,这里的方法获取到的bean都是同一个对象,所以我们可以用这种方式达到注入同种类型的多个Bean的目的。
4. 使用JdbcTemplate操作多数据源
在使用JdbcTemplate操作多数据源时,需要给JdbcTemplate
指定相应的数据源,如下面的示例所示:
@Service
public class TestService {
@Autowired
@Qualifier("firstJdbcTemplate")
JdbcTemplate firstJdbcTemplate;
@Autowired
@Qualifier("secondJdbcTemplate")
JdbcTemplate secondJdbcTemplate;
@Transactional
public void insert() {
firstJdbcTemplate.update("INSERT INTO user (id, name) VALUES (?, ?)", 1, "test1");
secondJdbcTemplate.update("INSERT INTO user (id, name) VALUES (?, ?)", 2, "test2");
throw new RuntimeException();
}
}
在上述示例中,@Autowired
注解用来自动注入JdbcTemplate
对象,通过@Qualifier
注解来指定数据源。
5. 示例说明
以下是两个示例说明,其中TestService
是对两个数据源进行操作的服务类:
示例1
在示例1中,我们可以调用TestService
的insert
方法,首先会先往db1
中插入一条数据,然后往db2
中插入一条数据,执行到这里会因为抛出异常而导致事务回滚。
@Test
public void test1() {
try{
testService.insert();
}catch (Exception e){}
int count1 = jdbcTemplate1.queryForObject("SELECT COUNT(*) FROM user", Integer.class);
Assert.assertEquals(0, count1.intValue());
int count2 = jdbcTemplate2.queryForObject("SELECT COUNT(*) FROM user", Integer.class);
Assert.assertEquals(0, count2.intValue());
}
在该测试用例中,我们首先调用TestService
的insert
方法,然后在捕获异常后查询两个数据源中是否都没有插入数据,查询结果应该都为0。
示例2
在示例2中,我们可以调用TestService
的insert
方法,首先会往db1
中插入一条数据,然后往db2
中插入一条数据,然后向db1
中再次插入一条数据,这次不会抛出异常,最后查询两个数据源中的数据。
@Test
public void test2() {
testService.insert();
int count1 = jdbcTemplate1.queryForObject("SELECT COUNT(*) FROM user", Integer.class);
Assert.assertEquals(1, count1.intValue());
int count2 = jdbcTemplate2.queryForObject("SELECT COUNT(*) FROM user", Integer.class);
Assert.assertEquals(1, count2.intValue());
}
在该测试用例中,我们首先调用TestService
的insert
方法,然后查询两个数据源中是否都成功插入数据,查询结果应该都为1。
至此,我们完成了Spring Boot整合持久层之JdbcTemplate多数据源的整体攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot整合持久层之JdbcTemplate多数据源 - Python技术站