SpringBoot系列:Spring Boot多数据源,jdbcTemplate方式

一、jdbcTemplate配置多数据源

在实际开发中,因为业务的复杂情况,可能分库或者分表,也可能业务模块的划分使用不同的数据源,或者其他一些特殊要求,导致需要连接多数据源。

我们先来看看jdbcTemplate的方式如何使用多数据源。

在之前的章节jdbcTemplate示例的基础上(jdbcTemplate集成示例),我们进行调整配置多数据源。

<!--mysql连接-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

<!--druid连接池-->
<!--<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.29</version>
</dependency>-->
<!--druid连接池调整为druid-spring-boot-starter,方便自定义覆写数据源-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

<!--jdbc依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

引入依赖中,druid连接池做了轻微的调整,改为druid-spring-boot-starter,方便我们更加容易的创建数据源。

然后是application核心配置文件中,因为是多数据源,这里配置了master和slave两个数据源。

server:
  port: 10900

spring:
  datasource:
    master:
      # 新版驱动从com.mysql.jdbc.Driver变更为com.mysql.cj.jdbc.Driver
      driver-class-name: com.mysql.cj.jdbc.Driver
      # 数据源需要添加时间标准和指定编码格式解决乱码 You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
      url: jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
      username: root
      password: 1234
    slave:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/springboot2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
      username: root
      password: 1234

接着配置数据源,这里创建了DataSourceConfig类,这是一个配置类。ConfigurationProperties加载配置文件,分别生成masterDataSource与slaveDataSource。

@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.master")
    DataSource masterDataSource(){
        // DataSourceBuilder.create().build();
        return DruidDataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.slave")
    DataSource slaveDataSource(){
        return DruidDataSourceBuilder.create().build();
    }

}

有了数据源,那怎么和jdbcTemplate进行关联呢,所以我们需要进行jdbcTemplate的配置,新建JdbcTemplateConfig类。这个配置类也很简单,主要就是使用不同的DataSource绑定不同的JdbcTemplate对象,同时还指定了不同的事务管理器。

@Configuration
public class JdbcTemplateConfig {

    @Bean
    JdbcTemplate masterJdbcTemplate(@Qualifier("masterDataSource")DataSource masterDataSource){
        return new JdbcTemplate(masterDataSource);
    }

    @Bean
    JdbcTemplate slaveJdbcTemplate(@Qualifier("slaveDataSource")DataSource slaveDataSource){
        return new JdbcTemplate(slaveDataSource);
    }

    // 事务管理器
    @Bean
    public PlatformTransactionManager masterTransactionManager(@Qualifier("masterDataSource")DataSource masterDataSource) {
        return new DataSourceTransactionManager(masterDataSource);
    }

    // 事务管理器
    @Bean
    public PlatformTransactionManager slaveTransactionManager(@Qualifier("slaveDataSource")DataSource slaveDataSource) {
        return new DataSourceTransactionManager(slaveDataSource);
    }

}

自此,多数据源的jdbcTemplate就已经配置好了,而使用起来,和普通的jdbcTemplate对象没有任何差别,只要我们注入想操作库相对应的jdbcTemplate对象即可。

    @Autowired
    @Qualifier("masterJdbcTemplate")
    private JdbcTemplate jdbcTemplate;

    @Resource(name="slaveJdbcTemplate")
    private JdbcTemplate slaveJdbcTemplate;

   /**
     * 添加用户
     * @param user
     * @return
     */
    @Override
    public int add(User user) {
        return jdbcTemplate.update("insert into user(username, password) value(?, ?)",
                user.getUsername(), user.getPassword());
    }

    /**
     * 添加用户
     * @param user
     * @return
     */
    @Override
    public int addSlave(User user) {
        return slaveJdbcTemplate.update("insert into user(username, password) value(?, ?)",
                user.getUsername(), user.getPassword());
    }

注入方式上,可以有两种选择,一种是@Bean配合@Qualifier指定名称,另一种是使用@Resource,这样我们就可以通过jdbcTemplate操作不同的数据源了。

如果在启动报错,提示找不到数据源,那是因为加载默认数据源失败了,这个时候我们需要在启动类上排除默认数据源。

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }

}

源码地址:https://github.com/imyanger/springboot-project/tree/master/p12-springboot-muti-jdbcTemplate

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值