SpringBoot - 使用JdbcTemplate操作数据库2(多数据源的配置与使用)

作者: hangge 发布时间: 2020-01-29 浏览: 292 次 编辑

所谓多数据源,就是一个 Java EE 项目中采用了不同数据库实例中的多个库,或者同一个数据库实例中多个不同的库。而 JdbcTemplate 多数据源的配置是比较简单的,因为一个 JdbcTemplate 对应一个 DataSource,开发者只需要手动提供多个 DataSource,再手动配置 JdbcTemplate 即可。下面通过样例进行演示。

三、多数据源的配置与使用

1,添加依赖

首先编辑 pom.xml 文件,添加相关依赖:

注意:跟前文相比,这里的数据库连接池依赖改用 druid-spring-boot-starterdruid-spring-boot-starter 可以帮助开发者在 Spring Boot 项目中轻松集成 Druid 数据库连接池和监控。

<!-- spring-jdbc -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
 
<!-- 数据库驱动依赖 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
 
<!-- 数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

2,配置数据库链接

(1)假设我们需要同时连接如下 hanggehangge2 这两个数据库。

原文:SpringBoot - 使用JdbcTemplate操作数据库2(多数据源的配置与使用)

(2)在 application.properties 中配置数据库连接信息:

# 数据源 1
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql://localhost:3306/hangge
spring.datasource.one.username=root
spring.datasource.one.password=hangge1234
# 数据源 2
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://localhost:3306/hangge2
spring.datasource.two.username=root
spring.datasource.two.password=hangge1234

3,配置数据源

创建 DataSourceConfig 配置数据源,根据 application.properties 中的配置生成两个数据源:

代码说明:

  • DataSourceConfig 中提供了两个数据源:dsOnedsTwo ,默认方法名即为实例名。
  • @ConfigurationProperties 注解表示使用不同前缀的配置文件来创建不同的 DataSource 实例。
@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties("spring.datasource.one")
    DataSource dsOne() {
        return DruidDataSourceBuilder.create().build();
    }
 
    @Bean
    @ConfigurationProperties("spring.datasource.two")
    DataSource dsTwo() {
        return DruidDataSourceBuilder.create().build();
    }
}

4,配置 JdbcTemplate

(1)从前文的样例可以知道,项目只要引入了 spring-jdbc 依赖,如果开发者没有提供 JdbcTemplate 实例时,Spring Boot 默认会提供一个 JdbcTemplate 实例。
(2)如果配置多数据源时,由开发者自己提供 JdbcTemplate 实例,代码如下:

JdbcTemplateConfig 中提供了两个 JdbcTemplate 实例。每个 JdbcTemplate 实例都需要提供 DataSource,由于 Spring 容器中有两个 DataSource 实例,因此需要通过方法名查找。@Qualifier 注解表示查找不同名称的 DataSource 实例注入进来。

@Configuration
public class JdbcTemplateConfig {
 
    @Bean
    JdbcTemplate jdbcTemplateOne(@Qualifier("dsOne")DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
 
    @Bean
    JdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo")DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

5,创建实体类

(1)假设两个数据库中都有 Users 表,结构如下:

原文:SpringBoot - 使用JdbcTemplate操作数据库2(多数据源的配置与使用)


(2)创建对应的 User 实体类:

@Setter
@Getter
@NoArgsConstructor
@ToString
public class User {
    private Integer id;
    private String userName;
    private String passWord;
}

6,创建 Controller

为方便演示,这里不再添加 Dao 层和 Service 层,而是直接将两个 JdbcTemplate 注入到了 Controller 中,然后分别查询两个数据库中的数据。

Controller 中注入不同的 JdbcTemplate 有两种方式:

  • 一种是使用 @Resource 注解,并指明 name 属性,即按 name 进行装配,此时会根据实例名查找相应的实例注入。
  • 另一种是使用 @Autowired 注解结合 @Qualifier 注解,效果等同于使用 @Resource 注解。
@RestController
public class HelloController {
 
    @Resource(name = "jdbcTemplateOne")
    JdbcTemplate jdbcTemplateOne;
 
    @Autowired
    @Qualifier("jdbcTemplateTwo")
    JdbcTemplate jdbcTemplateTwo;
 
    @RequestMapping("/test")
    public void test(){
        List users1 = jdbcTemplateOne.query("SELECT * FROM users",
                new BeanPropertyRowMapper<>(User.class));
        List users2 = jdbcTemplateTwo.query("SELECT * FROM users",
                new BeanPropertyRowMapper<>(User.class));
        System.out.println("数据库1>>>users>>>" + users1);
        System.out.println("数据库2>>>users>>>" + users2);
 
        return;
    }
}

7,运行测试

在浏览器中访问 http://localhost:8080/test 地址,可以看到控制台打印出的日志如下:

原文:SpringBoot - 使用JdbcTemplate操作数据库2(多数据源的配置与使用)


原文出自:www.hangge.com 转载请保留原文链接:https://www.hangge.com/blog/cache/detail_2530.html