Spring Boot整合持久层之JdbcTemplate多数据源

持久层是JavaEE中访问数据库的核心操作,SpringBoot中对常见的持久层框架都提供了自动化配置,例如JdbcTemplate、JPA等,MyBatis的自动化配置则是MyBatis官方提供的。接下来分别向读者介绍SpringBoot整合这持久层技术中的整合JdbcTemplate

多数据源

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

JdbcTemplate 多数据源

JdbcTemplate 多数据源是比较简单的,因为一个 JdbcTemplate 对应一个 DataSource,开发者只需要手动提供多个 DataSource ,再手动配置 JdbcTemplate 即可。

1. 创建数据库

创建两个数据库:chapter05-1 和 chapter05-2.两个库中都创建 book 表,再各预设 1 条数据,脚本如下

create database `chapter05-1` default character set utf8;
CREATE TABLE `chapter05-1`.`book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `author` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `chapter05-1`.`book`(`id`, `name`, `author`) VALUES (1, '水浒传', '施耐庵');
create database `chapter05-2` default character set utf8;
CREATE TABLE `chapter05-2`.`book` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `author` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `chapter05-2`.`book`(`id`, `name`, `author`) VALUES (1, '三国演义', '罗贯中');

2.创建项目

创建 Spring Boot Web 项目,添加如下依赖:

<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>com.alibaba</groupId>
  <artifactId>druid-spring-boot-starter</artifactId>
  <version>1.1.10</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

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

3. 配置数据库连接

在application.properties 中配置数据库连接信息

# 数据源1
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.url=jdbc:mysql://localhost:3306/chapter05-1?useUnicode=true&characterEncoding=utf8&useSSL=true
spring.datasource.one.username=root
spring.datasource.one.password=root
# 数据源2
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.url=jdbc:mysql://localhost:3306/chapter05-2?useUnicode=true&characterEncoding=utf8&useSSL=true
spring.datasource.two.username=root
spring.datasource.two.password=root

4. 配置数据源

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

@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();
    }
}

代码解释:

  • DataSourceConfig 中提供了两个数据源:dsOne 和 dsTwo,默认方法名即实例名
  • @ConfigurationProperties 注解表示使用不同前缀的配置文件来创建不同的 DataSource 实例

5. 配置 JdbcTemplate

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

@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);
    }
}

代码解释:

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

6. 创建BookController

创建实体类 Book 和 BookController 进行测试

public class Book {
    private Integer id;
    private String name;
    private String author;
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
}
@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 注解。

7. 测试

http://localhost:8081/test1,查看打印日志

books1:[Book{id=1, name='水浒传', author='施耐庵'}]
books2:[Book{id=1, name='三国演义', author='罗贯中'}]

到此这篇关于Spring Boot整合持久层之JdbcTemplate多数据源的文章就介绍到这了,更多相关Spring Boot JdbcTemplate 内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!

本文标题为:Spring Boot整合持久层之JdbcTemplate多数据源

基础教程推荐