• 五、Spring Boot 整合持久层技术(4)


    本章概要

    • JdbcTemplate 多数据源

    5.4 多数据源

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

    5.4.1 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, '三国演义', '罗贯中');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    2.创建项目

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

    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-jdbcartifactId>
    dependency>
    <dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-webartifactId>
    dependency>
    <dependency>
      <groupId>com.alibabagroupId>
      <artifactId>druid-spring-boot-starterartifactId>
      <version>1.1.10version>
    dependency>
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <scope>runtimescope>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    注意这里添加的数据库连接池依赖是 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    代码解释:

    • 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    代码解释:

    • 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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    @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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    简单起见,这里没有添加 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='罗贯中'}]
    
    • 1
    • 2
  • 相关阅读:
    java毕业设计对外汉语教学辅助平台Mybatis+系统+数据库+调试部署
    微信小程序 校园周边美食商城分享系统
    【人工智能数学基础】几何解释——最小二乘法
    数据在内存中的存储(一个新手的理解)
    Docker安装部署Nexus3作为内网镜像代理缓存容器镜像
    架构师的成名之路
    python 对长页面进行截屏拼接成长图
    32、Flink table api和SQL 之用户自定义 Sources & Sinks实现及详细示例
    【Java】Int/boolean/...转String && String转Int/boolean/...
    多分类损失函数(机器学习)
  • 原文地址:https://blog.csdn.net/GXL_1012/article/details/125989085