spring 多个数据库

在开发企业应用程序时,我们经常面临访问多个数据库的挑战。 也许我们的应用程序必须将数据归档到某个数据仓库中,或者也许它必须将数据传播到某个第三方数据库。 使用Spring可以很容易地定义一个通用数据源,但是一旦我们引入了多个数据源,就会有些棘手。

在本文中,我们将演示一种通过使用Spring Boot开发SpringMVC应用程序,以最少的配置轻松访问Spring Boot应用程序中的多个数据库的技术。

数据库设置

为了遵循此演示,我们建议您有两个可用的数据库。 在这里,我们使用PostgreSQL和MySQL。

下面的脚本显示了两个数据库提供程序的create和insert语句。

PostgreSQL

CREATE TABLE usermaster ( 
   id integer, 
   name character varying, 
   emailid character varying, 
   phoneno character varying(10), 
   location character varying
) 

INSERT INTO usermaster(id, name, emailid, phoneno, location)
VALUES (1, 'name_postgres', 'email@email.com', '1234567890', 'IN');

MySQL

CREATE TABLE `usermaster` (
   `id` int(11) NOT NULL, 
   `name` varchar(255) DEFAULT NULL, 
   `emailid` varchar(20) DEFAULT NULL, 
   `phoneno` varchar(20) DEFAULT NULL, 
   `location` varchar(20) DEFAULT NULL, 
   PRIMARY KEY (`id`) 
)

INSERT INTO `kode12`.`usermaster` 
  (`id`, `name`, `emailid`, `phoneno`, `location`)
VALUES
  ('1', 'name_mysql', 'test@tset.com', '9876543210', 'IN');

项目设置

我们将使用Spring Tool Suite( STS )构建此演示:

  • 单击文件->新建-> Spring Starter Project选项。
  • 在对话框中,提供项目名称,Maven坐标,描述和包信息,然后单击“下一步”。
  • 对于启动依赖性,选择“ Web”,然后单击“下一步”。
  • 单击完成。 STS将根据您的依赖关系从Spring存储库下载项目。

该项目应如下所示:




java spring datasource多数据源 spring多个数据源_mybatis


现在,让我们详细了解每个文件。

pom.xml

pom包含所有必需的依赖项和插件映射。

<?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.aegis</groupId>
	<artifactId>MultipleDBConnect</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>MultipleDB</name>
	<description>MultipleDB with Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.3.5.RELEASE</version>
		<relativePath />
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

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

		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.38</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>

说明

下表详细列出了所有依赖项:

相依性

详情

弹簧启动启动器网站

提供对Web开发和MVC的支持。

Spring启动启动器测试

提供测试依赖项,例如JUnit,Mockito等。

弹簧启动启动器jdbc

提供对JDBC的支持

PostgreSQL

PostgreSQL数据库的JDBC驱动程序

MySQL的连接器的Java

适用于MySQL数据库的JDBC驱动程序

application.properties

包含启动应用程序的所有配置; (在传统的Spring中,我们将使用多个XML文件提供此配置。)

server.port=6060
spring.ds_post.url =jdbc:postgresql://localhost:5432/kode12
spring.ds_post.username =postgres
spring.ds_post.password =root
spring.ds_post.driverClassName=org.postgresql.Driver
spring.ds_mysql.url = jdbc:mysql://localhost:3306/kode12
spring.ds_mysql.username = root
spring.ds_mysql.password = root
spring.ds_mysql.driverClassName=com.mysql.jdbc.Driver


在此server.port=6060声明您的嵌入式服务器将在server.port=6060启动。(port.server.port是引导提供的标准属性。)

其他属性以spring.ds_ *为前缀是用户定义的:

带有spring.ds_post。*前缀的属性用于定义PostgreSQL数据库的配置。

带有spring.ds_mysql。*前缀的属性用于定义MySQL数据库的配置。

MultipleDbApplication.java

package com.aegis;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public MultipleDbApplication {

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

该文件包含启动启动应用程序的主要方法。 @SpringBootApplication注释是其他Spring注释和Java注释的组合,包括:

@Configuration
@EnableAutoConfiguration
@ComponentScan
@Target(value={TYPE})
@Retention(value=RUNTIME)
@Documented
@Inherited

附加注释:

@Configuration
@EnableAutoConfiguration
@ComponentScan

这些是Spring注释,告诉容器扫描此类并加载我们的配置。

MultipleDBConfig.java

package com.aegis.config;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

@Configuration
public class MultipleDBConfig {
	@Bean(name = "mysqlDb")
	@ConfigurationProperties(prefix = "spring.ds_mysql")
	public DataSource mysqlDataSource() {
		return DataSourceBuilder.create().build();
	}

	@Bean(name = "mysqlJdbcTemplate")
	public JdbcTemplate jdbcTemplate(@Qualifier("mysqlDb") DataSource dsMySQL) {
		return new JdbcTemplate(dsMySQL);
	}
	
	@Bean(name = "postgresDb")
	@ConfigurationProperties(prefix = "spring.ds_post")
	public DataSource postgresDataSource() {
		return  DataSourceBuilder.create().build();
	}

	@Bean(name = "postgresJdbcTemplate")
	public JdbcTemplate postgresJdbcTemplate(@Qualifier("postgresDb") 
                                              DataSource dsPostgres) {
		return new JdbcTemplate(dsPostgres);
	}
}

说明

这是带注释的配置类,包含用于加载PostgreSQLMySQL配置的函数和注释。 它还负责为每个实例创建一个JDBCTemplate实例。

让我们看一下这四个功能:

1  @Bean(name = "mysqlDb")
2  @ConfigurationProperties(prefix = "spring.ds_mysql")
3  public DataSource mysqlDataSource() {
4  	return DataSourceBuilder.create().build();
5  }

上面代码段的第1行创建了mysqlDb bean。
第2行帮助@Bean使用前缀spring.ds_mysql加载所有属性。
第4行创建并初始化DataSource类,并创建mysqlDb DataSource对象。

1   @Bean(name = "mysqlJdbcTemplate")
2   public JdbcTemplate jdbcTemplate(@Qualifier("mysqlDb") DataSource dsMySQL) {
3   	return new JdbcTemplate(dsMySQL);
4   }

第1行创建一个名称为mysqlJdbcTemplate JdbcTemplate类型的新bean。
第2行接受DataSource参数和mysqlDB作为限定符,它是在第一个代码段的第1行中创建的。
第3 JdbcTemplate DataSource对象的帮助下初始化JdbcTemplate实例。

1  @Bean(name = "postgresDb")
2  @ConfigurationProperties(prefix = "spring.ds_post")
3  public DataSource postgresDataSource() {
4     return  DataSourceBuilder.create().build();
5  }

上面这段代码的第1行创建了postgresDb DataSource实例。
第2行帮助@Bean使用前缀spring.ds_post加载所有属性。
第4行创建并初始化postgresDb DataSource实例。

1  @Bean(name = "postgresJdbcTemplate")
2  public JdbcTemplate postgresJdbcTemplate(@Qualifier("postgresDb")
                                          DataSource dsPostgres) {
3    return new JdbcTemplate(dsPostgres);
4  }

第1行创建一个名称为postgresJdbcTemplate的类型为JdbcTemplate的新bean。
第2行接受DataSource作为参数,并接受postgresDb作为限定符,两者均在上面创建。
第3 JdbcTemplate DataSource对象的帮助下初始化JdbcTemplate实例。

DemoController.java

package com.aegis.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {

	@Autowired
	@Qualifier("postgresJdbcTemplate")
	private JdbcTemplate postgresTemplate;

	@Autowired
	@Qualifier("mysqlJdbcTemplate")
	private JdbcTemplate mysqlTemplate;

	@RequestMapping(value = "/getPGUser")
	public String getPGUser() {
		Map<String, Object> map = new HashMap<String, Object>();
		String query = " select * from usermaster";
		try {
			map = postgresTemplate.queryForMap(query);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "PostgreSQL Data: " + map.toString();
	}

	@RequestMapping(value = "/getMYUser")
	public String getMYUser() {
		Map<String, Object> map = new HashMap<String, Object>();
		String query = " select * from usermaster";
		try {
			map = mysqlTemplate.queryForMap(query);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "MySQL Data: " + map.toString();
	}
}

说明

@RestController类注释表示默认情况下,此类中声明的所有方法的结果都将绑定到响应主体。

上面显示的代码片段创建了一个JdbcTemplate实例。 @Qualifier有助于生成指定类型的模板。 在这里,我们提供postgresJdbcTemplate作为Qualifier参数,以便它尝试加载由MultipleDBConfig实例的jdbcTemplate(…)方法创建的Bean。

现在,Spring将根据您的请求调用相应的jdbc模板。 在调用url / getPGUser时,Spring将使用Postgres模板; 在调用/ getMYUser时,Spring将使用MySQL模板。

@Autowired
@Qualifier("postgresJdbcTemplate")
private JdbcTemplate postgresTemplate;

在这里,我们使用queryForMap(String query)方法使用jdbc模板从数据库获取数据, queryForMap(…)方法返回以列名作为键的映射并映射到实际列值。

演示版

要启动演示,请执行MultipleDbApplication类中的main(...)方法。 然后在您喜欢的浏览器中点击以下URL:

网址: http:// localhost:6060 / getMYUser

调用该URL将查询MySQL的用户数据库,并以字符串形式返回数据。


java spring datasource多数据源 spring多个数据源_mybatis_02


网址: http:// localhost:6060 / getPGUser

调用该URL将查询PostgreSQL用户数据库并以字符串形式返回数据。


java spring datasource多数据源 spring多个数据源_java_03