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存储库下载项目。
该项目应如下所示:
现在,让我们详细了解每个文件。
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);
}
}
说明
这是带注释的配置类,包含用于加载PostgreSQL
和MySQL
配置的函数和注释。 它还负责为每个实例创建一个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的用户数据库,并以字符串形式返回数据。
网址: http:// localhost:6060 / getPGUser
调用该URL将查询PostgreSQL用户数据库并以字符串形式返回数据。