Spring Boot学习(七)之Web应用使用jdbctemplate多数据源配置

来源:互联网 发布:plc200仿真软件 编辑:程序博客网 时间:2024/05/22 05:16

 上篇文章中说到单数据原连接访问,插入数据;但是往往随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,下面基于之前的JdbcTemplate和Spring-data-jpa例子分别介绍两种多数据源的配置方式。

先看pom文件 引用的jar

 

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">   <modelVersion>4.0.0</modelVersion>   <groupId>com.xiaojingg</groupId>   <artifactId>springbootstudy-demo7-jdbctemplate-more</artifactId>   <version>0.0.1-SNAPSHOT</version>   <packaging>jar</packaging>   <name>springbootstudy-demo7-jdbctemplate-more</name>   <description>Demo project for Spring Boot</description>   <parent>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-parent</artifactId>      <version>1.5.8.RELEASE</version>      <relativePath/> <!-- lookup parent from repository -->   </parent>   <properties>      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>      <java.version>1.8</java.version>   </properties>   <dependencies>      <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter</artifactId>      </dependency>      <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-test</artifactId>         <scope>test</scope>      </dependency>      <dependency>         <groupId>mysql</groupId>         <artifactId>mysql-connector-java</artifactId>         <version>5.1.21</version>      </dependency>      <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-jdbc</artifactId>      </dependency>   </dependencies>   <build>      <plugins>         <plugin>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-maven-plugin</artifactId>         </plugin>      </plugins>   </build></project>

多数据源配置

创建一个Spring配置类,定义两个DataSource用来读取application.properties中的不同配置。如下例子中,主数据源配置为spring.datasource.primary开头的配置,第二数据源配置为spring.datasource.secondary开头的配置。

01package com.xiaojingg;
02 
03import org.springframework.beans.factory.annotation.Qualifier;
04import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
05import org.springframework.boot.context.properties.ConfigurationProperties;
06import org.springframework.context.annotation.Bean;
07import org.springframework.context.annotation.Configuration;
08import org.springframework.context.annotation.Primary;
09import org.springframework.jdbc.core.JdbcTemplate;
10 
11import javax.sql.DataSource;
12 
13/**
14 * 筱进GG
15 */
16@Configuration
17public class DataSourceConfig {
18 
19    @Bean(name = "primaryDataSource")
20    @Qualifier("primaryDataSource")
21    @ConfigurationProperties(prefix="spring.datasource.primary")
22    public DataSource primaryDataSource() {
23        return DataSourceBuilder.create().build();
24    }
25 
26    @Bean(name = "secondaryDataSource")
27    @Qualifier("secondaryDataSource")
28    @Primary
29    @ConfigurationProperties(prefix="spring.datasource.secondary")
30    public DataSource secondaryDataSource() {
31        return DataSourceBuilder.create().build();
32    }
33 
34    @Bean(name = "primaryJdbcTemplate")
35    public JdbcTemplate primaryJdbcTemplate(
36            @Qualifier("primaryDataSource") DataSource dataSource) {
37        return new JdbcTemplate(dataSource);
38    }
39 
40    @Bean(name = "secondaryJdbcTemplate")
41    public JdbcTemplate secondaryJdbcTemplate(
42            @Qualifier("secondaryDataSource") DataSource dataSource) {
43        return new JdbcTemplate(dataSource);
44    }
45 
46}

对应的application.properties配置如下:

 

spring.datasource.primary.url=jdbc:mysql://localhost:3306/test1spring.datasource.primary.username=rootspring.datasource.primary.password=rootspring.datasource.primary.driver-class-name=com.mysql.jdbc.Driverspring.datasource.secondary.url=jdbc:mysql://localhost:3306/test2spring.datasource.secondary.username=rootspring.datasource.secondary.password=rootspring.datasource.secondary.driver-class-name=com.mysql.jdbc.Driver

接下来通过测试用例来演示如何使用这两个针对不同数据源的JdbcTemplate:

package com.xiaojingg;import org.junit.Assert;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTestpublic class SpringbootstudyDemo7JdbctemplateMoreApplicationTests {   @Autowired   @Qualifier("primaryJdbcTemplate")   protected JdbcTemplate jdbcTemplate1;   @Autowired   @Qualifier("secondaryJdbcTemplate")   protected JdbcTemplate jdbcTemplate2;   @Before   public void setUp() {      jdbcTemplate1.update("DELETE  FROM  USER ");      jdbcTemplate2.update("DELETE  FROM  USER ");   }   @Test   public void test() throws Exception {      // 往第一个数据源中插入两条数据      jdbcTemplate1.update("insert into user(id,name,age) values(?, ?, ?)", 1, "aaa", 20);      jdbcTemplate1.update("insert into user(id,name,age) values(?, ?, ?)", 2, "bbb", 30);      // 往第二个数据源中插入一条数据,若插入的是第一个数据源,则会主键冲突报错      jdbcTemplate2.update("insert into user(id,name,age) values(?, ?, ?)", 1, "aaa", 20);      // 查一下第一个数据源中是否有两条数据,验证插入是否成功      Assert.assertEquals("2", jdbcTemplate1.queryForObject("select count(1) from user", String.class));      // 查一下第一个数据源中是否有两条数据,验证插入是否成功      Assert.assertEquals("1", jdbcTemplate2.queryForObject("select count(1) from user", String.class));   }}

运行截图:




阅读全文
1 0
原创粉丝点击