首页
学习
活动
专区
圈层
工具
发布
30 篇文章
1
Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式
2
Spring Boot2 系列教程(三)理解 spring-boot-starter-parent
3
Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置
4
Spring Boot2 系列教程(六)自定义 Spring Boot 中的 starter
5
Spring Boot2 系列教程(七)理解自动化配置的原理
6
Spring Boot2 系列教程(八)Spring Boot 中配置 Https
7
Spring Boot2 系列教程(九)Spring Boot 整合 Thymeleaf
8
Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate
9
Spring Boot2 系列教程(十八)Spring Boot 中自定义 SpringMVC 配置
10
Spring Boot2 系列教程(十七)SpringBoot 整合 Swagger2
11
Spring Boot2 系列教程(十六)定时任务的两种实现方式
12
Spring Boot2 系列教程(十五)定义系统启动任务的两种方式
13
Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理
14
Spring Boot2 系列教程(十一)Spring Boot 中的静态资源配置
15
Spring Boot2 系列教程(十二)@ControllerAdvice 的三种使用场景
16
Spring Boot2 系列教程(十四)CORS 解决跨域问题
17
Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker
18
Spring Boot2 系列教程(二十八)Spring Boot 整合 Session 共享
19
Spring Boot2 系列教程(二十九)Spring Boot 整合 Redis
20
Spring Boot2 系列教程(二十七)Nginx 极简扫盲入门
21
Spring Boot2 系列教程(二十六)Spring Boot 整合 Redis
22
Spring Boot2 系列教程(二十二)整合 MyBatis 多数据源
23
Spring Boot2 系列教程(二十一)整合 MyBatis
24
Spring Boot2 系列教程(二十)Spring Boot 整合JdbcTemplate 多数据源
25
Spring Boot2 系列教程(三十七)Spring Security 整合 JWT
26
Spring Boot2 系列教程(三十六)SpringSecurity 中角色继承的坑
27
Spring Boot2 系列教程(三十五)SpringSecurity 使用 JSON 格式登录
28
Spring Boot2 系列教程(三十四)Spring Security 添加验证码
29
Spring Boot2 系列教程(三十三)整合 Spring Security
30
Spring Boot2 系列教程(三十一)Spring Boot 构建 RESTful 风格应用

Spring Boot2 系列教程(二十)Spring Boot 整合JdbcTemplate 多数据源

多数据源配置也算是一个常见的开发需求,Spring 和 SpringBoot 中,对此都有相应的解决方案,不过一般来说,如果有多数据源的需求,我还是建议首选分布式数据库中间件 MyCat 去解决相关问题,之前有小伙伴在我的知识星球上提问,他的数据根据条件的不同,可能保存在四十多个不同的数据库中,怎么办?这种场景下使用多数据源其实就有些费事了,我给的建议是使用 MyCat,然后分表策略使用 sharding-by-intfile 。

当然如果一些简单的需求,还是可以使用多数据源的,Spring Boot 中,JdbcTemplate、MyBatis 以及 Jpa 都可以配置多数据源,本文就先和大伙聊一聊 JdbcTemplate 中多数据源的配置(关于JdbcTemplate的用法,如果还有小伙伴不了解,可以参考我的 Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate)。

创建工程

首先是创建工程,和前文一样,创建工程时,也是选择 Web、Jdbc 以及 MySQL 驱动,如下图:

创建成功之后,一定接下来手动添加 Druid 依赖,由于这里一会需要开发者自己配置 DataSoruce,所以这里必须要使用 druid-spring-boot-starter 依赖,而不是传统的那个 druid 依赖,因为 druid-spring-boot-starter 依赖提供了 DruidDataSourceBuilder 类,这个可以用来构建一个 DataSource 实例,而传统的 Druid 则没有该类。完整的依赖如下:

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

配置数据源

接下来,在 application.properties 中配置数据源,不同于上文,这里的数据源需要配置两个,如下:

代码语言:javascript
复制
spring.datasource.one.url=jdbc:mysql:///test01?useUnicode=true&characterEncoding=utf-8
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.two.url=jdbc:mysql:///test02?useUnicode=true&characterEncoding=utf-8
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource

这里通过 one 和 two 对数据源进行了区分,但是加了 one 和 two 之后,这里的配置就没法被 SpringBoot 自动加载了(因为前面的 key 变了),需要我们自己去加载 DataSource 了,此时,需要自己配置一个 DataSourceConfig,用来提供两个 DataSource Bean,如下:

代码语言:javascript
复制
@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.one")
    DataSource dsOne() {
        return DruidDataSourceBuilder.create().build();
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.two")
    DataSource dsTwo() {
        return DruidDataSourceBuilder.create().build();
    }
}

这里提供了两个 Bean,其中 @ConfigurationProperties 是 Spring Boot 提供的类型安全的属性绑定,以第一个Bean为例, @ConfigurationProperties(prefix = "spring.datasource.one") 表示使用 spring.datasource.one 前缀的数据库配置去创建一个 DataSource,这样配置之后,我们就有了两个不同的 DataSource,接下来再用这两个不同的 DataSource 去创建两个不同的 JdbcTemplate。

配置 JdbcTemplate 实例

创建 JdbcTemplateConfig 类,用来提供两个不同的 JdbcTemplate 实例,如下:

代码语言:javascript
复制
@Configuration
public class JdbcTemplateConfig {
    @Bean
    JdbcTemplate jdbcTemplateOne(@Qualifier("dsOne") DataSource dsOne) {
        return new JdbcTemplate(dsOne);
    }
    @Bean
    JdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo") DataSource dsTwo) {
        return new JdbcTemplate(dsTwo);
    }
}

每一个 JdbcTemplate 的创建都需要一个 DataSource,由于 Spring 容器中现在存在两个 DataSource,默认使用类型查找,会报错,因此加上 @Qualifier 注解,表示按照名称查找。这里创建了两个 JdbcTemplate 实例,分别对应了两个 DataSource。

接下来直接去使用这个 JdbcTemplate 就可以了。

测试使用

关于 JdbcTemplate 的详细用法大伙可以参考我的上篇文章,这里我主要演示数据源的差异,在 Controller 中注入两个不同的 JdbcTemplate ,这两个 JdbcTemplate 分别对应了不同的数据源,如下:

代码语言:javascript
复制
@RestController
public class HelloController {
    @Autowired
    @Qualifier("jdbcTemplateOne")
    JdbcTemplate jdbcTemplateOne;
    @Resource(name = "jdbcTemplateTwo")
    JdbcTemplate jdbcTemplateTwo;

    @GetMapping("/user")
    public List<User> getAllUser() {
        List<User> list = jdbcTemplateOne.query("select * from t_user", new BeanPropertyRowMapper<>(User.class));
        return list;
    }
    @GetMapping("/user2")
    public List<User> getAllUser2() {
        List<User> list = jdbcTemplateTwo.query("select * from t_user", new BeanPropertyRowMapper<>(User.class));
        return list;
    }
}

和 DataSource 一样,Spring 容器中的 JdbcTemplate 也是有两个,因此不能通过 byType 的方式注入进来,这里给大伙提供了两种注入思路,一种是使用 @Resource 注解,直接通过 byName 的方式注入进来,另外一种就是 @Autowired 注解加上 @Qualifier 注解,两者联合起来,实际上也是 byName。将 JdbcTemplate 注入进来之后,jdbcTemplateOne 和 jdbcTemplateTwo 此时就代表操作不同的数据源,使用不同的 JdbcTemplate 操作不同的数据源,实现了多数据源配置。

好了,这个问题就先说到这里,感兴趣的小伙伴也可以参考相关案例:https://github.com/lenve/javaboy-code-samples

下一篇
举报
领券