SpringBoot 整合JdbcTemplate 多数据源

多数据源

所谓多数据源,就是一个Java EE项目中采用了不同数据库实例中的多个库,或者同一个数据库实例中多个不同的库。一般来说,采用MyCat等分布式数据库中间件是比较好的解决方案,这样可以把数据库读写分离、分库分表、备份等操作交给中间件去做,Java代码只需要专注于业务即可。不过,这并不意味着无法使用Java代码解决类似的问题,在Spring Framework中就可以配置多数据源,Spring Boot继承其衣钵,只不过配置方式有所变化

因为一个JdbcTemplate对应一个DataSource,开发者只需要手动提供多个DataSource,再手动配置JdbcTemplate即可。

 

添加如下依赖:

复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
复制代码

这里添加的数据库连接池依赖是druid-spring-boot-starter。druid-spring-boot-starter可以帮助开发者在Spring Boot项目中轻松集成Druid数据库连接池和监控。

 

配置数据库连接:

复制代码
spring:
  datasource:
    boot:
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://localhost:3306/boot?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      username: root
      password: 123456
    boot2:
      type: com.alibaba.druid.pool.DruidDataSource
      url: jdbc:mysql://localhost:3306/boot2?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
      username: root
      password: 123456
复制代码

 

配置数据源:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Configuration
public class DataSourceConfig {
 
    @Primary
    @Bean
    @ConfigurationProperties("spring.datasource.boot")
    DataSource dsOne() {
        return DruidDataSourceBuilder.create().build();
    }
 
    @Bean
    @ConfigurationProperties("spring.datasource.boot2")
    DataSource dsTwo() {
        return DruidDataSourceBuilder.create().build();
    }
 
}

  

配置JdbcTemplate:

只要引入了spring-jdbc依赖,那么开发者没有提供JdbcTemplate实例时,Spring Boot默认会提供一个JdbcTemplate实例。现在配置多数据源时,由开发者自己提供JdbcTemplate实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Configuration
public class JdbcTemplateConfig {
 
    @Primary
    @Bean
    JdbcTemplate jdbcTemplateOne(@Qualifier("dsOne") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
 
    @Bean
    JdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
 
}

  

创建BookController:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RestController
public class BookController {
 
    @Resource(name = "jdbcTemplateOne")
    JdbcTemplate jdbcTemplate;
 
    @Autowired
    @Qualifier("jdbcTemplateTwo")
    JdbcTemplate jdbcTemplateTwo;
 
    @GetMapping("/test1")
    public void test1() {
        List<Book> books1 = jdbcTemplate.query("select * from book", new BeanPropertyRowMapper<>(Book.class));
        List<Book> books2 = jdbcTemplateTwo.query("select * from book", new BeanPropertyRowMapper<>(Book.class));
        System.out.println("books1:" + books1);
        System.out.println("books2:" + books2);
    }
}

简单起见,这里没有添加Service层,而是直接将JdbcTemplate注入到了Controller中。在Controller中注入两个不同的JdbcTemplate有两种方式:一种是使用@Resource注解,并指明name属性,即按name进行装配,此时会根据实例名查找相应的实例注入;另一种是使用@Autowired注解结合@Qualifier注解,效果等同于使用@Resource注解。

 

文章来源:Spring Boot+Vue全栈开发实战 5.4 多数据源

 

posted @   草木物语  阅读(1171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
历史上的今天:
2018-05-26 pagehelper 使用
2018-05-26 jackson json转对象 对象转json
点击右上角即可分享
微信分享提示