UDN-企业互联网技术人气社区

板块导航

浏览  : 1604
回复  : 0

[讨论交流] Java Spring中同时访问多种不同数据库

[复制链接]
哥屋恩的头像 楼主
发表于 2016-10-29 19:14:30 | 显示全部楼层 |阅读模式
  开发企业应用时我们常常遇到要同时访问多种不同数据库的问题,有时是必须把数据归档到某种数据仓库中,有时是要把数据变更推送到第三方数据库中。使用Spring框架时,使用单一数据库是非常容易的,但如果要同时访问多个数据库的话事件就变得复杂多了。

  本文以在Spring框架下开发一个SpringMVC程序为例,示范了一种同时访问多种数据库的方法,而且尽量地简化配置改动。

  搭建数据库

  建议你也同时搭好两个数据库来跟进我们的示例。本文中我们用了PostgreSQL和MySQL。

  下面的脚本内容是在两个数据库中建表和插入数据的命令。

  PostgreSQL

 
  1.  CREATE TABLE usermaster (

  2.   id integer,

  3.   name character varying,

  4.   emailid character varying,

  5.   phoneno character varying(10),

  6.   location character varying

  7.   )

  8.   INSERT INTO usermaster(id, name, emailid, phoneno, location)

  9.   VALUES (1, 'name_postgres', 'email@email.com', '1234567890', 'IN');
复制代码


  MySQL

  1.   CREATE TABLE `usermaster` (

  2.   `id` int(11) NOT NULL,

  3.   `name` varchar(255) DEFAULT NULL,

  4.   `emailid` varchar(20) DEFAULT NULL,

  5.   `phoneno` varchar(20) DEFAULT NULL,

  6.   `location` varchar(20) DEFAULT NULL,

  7.   PRIMARY KEY (`id`)

  8.   )

  9.   INSERT INTO `kode12`.`usermaster`

  10.   (`id`, `name`, `emailid`, `phoneno`, `location`)

  11.   VALUES

  12.   ('1', 'name_mysql', 'test@tset.com', '9876543210', 'IN');
复制代码


  搭建项目

  我们用Spring Tool Suite (STS)来构建这个例子:

  点击File -> New -> Spring Starter Project。

  在对话框中输入项目名、Maven坐标、描述和包信息等,点击Next。

  在boot dependency中选择Web,点击Next。

  点击Finish。STS会自动按照项目依赖关系从Spring仓库中下载所需要的内容。

  创建完的项目如下图所示:

6.jpg


  接下来我们仔细研究一下项目中的各个相关文件内容。

  pom.xml

  pom中包含了所有需要的依赖和插件映射关系。

  代码:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5.     http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6.     <modelVersion>4.0.0</modelVersion>

  7.     <groupId>com.aegis</groupId>
  8.     <artifactId>MultipleDBConnect</artifactId>
  9.     <version>0.0.1-SNAPSHOT</version>
  10.     <packaging>jar</packaging>

  11.     <name>MultipleDB</name>
  12.     <description>MultipleDB with Spring Boot</description>

  13.     <parent>
  14.         <groupId>org.springframework.boot</groupId>
  15.         <artifactId>spring-boot-starter-parent</artifactId>
  16.         <version>1.3.5.RELEASE</version>
  17.         <relativePath />
  18.     </parent>

  19.     <properties>
  20.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  21.         <java.version>1.8</java.version>
  22.     </properties>

  23.     <dependencies>
  24.         <dependency>
  25.             <groupId>org.springframework.boot</groupId>
  26.             <artifactId>spring-boot-starter-web</artifactId>
  27.         </dependency>

  28.         <dependency>
  29.             <groupId>org.springframework.boot</groupId>
  30.             <artifactId>spring-boot-starter-test</artifactId>
  31.             <scope>test</scope>
  32.         </dependency>

  33.         <dependency>
  34.             <groupId>org.springframework.boot</groupId>
  35.             <artifactId>spring-boot-starter-jdbc</artifactId>
  36.         </dependency>

  37.         <dependency>
  38.             <groupId>org.postgresql</groupId>
  39.             <artifactId>postgresql</artifactId>
  40.         
  41. </dependency>

  42.         <dependency>
  43.             <groupId>mysql</groupId>
  44.             <artifactId>mysql-connector-java</artifactId>
  45.             <version>5.1.38</version>
  46.         </dependency>
  47.     </dependencies>

  48.     <build>
  49.         <plugins>
  50.             <plugin>
  51.                 <groupId>org.springframework.boot</groupId>
  52.                 <artifactId>spring-boot-maven-plugin</artifactId>
  53.             </plugin>
  54.         </plugins>
  55.     </build>
  56. </project>
复制代码


  解释:

  下面详细解释各种依赖关系的细节:

  spring-boot-starter-web:为Web开发和MVC提供支持。

  spring-boot-starter-test:提供JUnit、Mockito等测试依赖。

  spring-boot-starter-jdbc:提供JDBC支持。

  postgresql:PostgreSQL数据库的JDBC驱动。

  mysql-connector-java:MySQL数据库的JDBC驱动。

  application.properties

  包含程序需要的所有配置信息。在旧版的Spring中我们要通过多个XML文件来提供这些配置信息。

  1.   server.port=6060

  2.   spring.ds_post.url =jdbc:postgresql://localhost:5432/kode12

  3.   spring.ds_post.username =postgres

  4.   spring.ds_post.password =root

  5.   spring.ds_post.driverClassName=org.postgresql.Driver

  6.   spring.ds_mysql.url = jdbc:mysql://localhost:3306/kode12

  7.   spring.ds_mysql.username = root

  8.   spring.ds_mysql.password = root

  9.   spring.ds_mysql.driverClassName=com.mysql.jdbc.Driver
复制代码


  解释:

  “server.port=6060”声明你的嵌入式服务器启动后会使用6060端口(port.server.port是Boot默认的标准端口)。

  其他属性中:

  以“spring.ds_*”为前缀的是用户定义属性。

  以“spring.ds_post.*”为前缀的是为PostgreSQL数据库定义的属性。

  以“spring.ds_mysql.*”为前缀的是为MySQL数据库定义的属性。

  MultipleDbApplication.java

 
  1.  package com.aegis;

  2.   import org.springframework.boot.SpringApplication;

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

  4.   @SpringBootApplication

  5.   public MultipleDbApplication {

  6.   public static void main(String[] args) {

  7.   SpringApplication.run(MultipleDbApplication.class, args);

  8.   }

  9.   }
复制代码


  这个文件包含了启动我们的Boot程序的主函数。注解“@SpringBootApplication”是所有其他Spring注解和Java注解的组合,包括:

  1.   @Configuration

  2.   @EnableAutoConfiguration

  3.   @ComponentScan

  4.   @Target(value={TYPE})

  5.   @Retention(value=RUNTIME)

  6.   @Documented

  7.   @Inherited
复制代码


  其他注解:

  1.   @Configuration

  2.   @EnableAutoConfiguration

  3.   @ComponentScan
复制代码


  上述注解会让容器通过这个类来加载我们的配置。

  1.   MultipleDBConfig.java

  2.   package com.aegis.config;

  3.   import javax.sql.DataSource;

  4.   import org.springframework.beans.factory.annotation.Qualifier;

  5.   import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;

  6.   import org.springframework.boot.context.properties.ConfigurationProperties;

  7.   import org.springframework.context.annotation.Bean;

  8.   import org.springframework.context.annotation.Configuration;

  9.   import org.springframework.context.annotation.Primary;

  10.   import org.springframework.jdbc.core.JdbcTemplate;

  11.   @Configuration

  12.   public class MultipleDBConfig {

  13.   @Bean(name = "mysqlDb")

  14.   @ConfigurationProperties(prefix = "spring.ds_mysql")

  15.   public DataSource mysqlDataSource() {

  16.   return DataSourceBuilder.create().build();

  17.   }

  18.   @Bean(name = "mysqlJdbcTemplate")

  19.   public JdbcTemplate jdbcTemplate(@Qualifier("mysqlDb") DataSource dsMySQL) {

  20.   return new JdbcTemplate(dsMySQL);

  21.   }

  22.   @Bean(name = "postgresDb")

  23.   @ConfigurationProperties(prefix = "spring.ds_post")

  24.   public DataSource postgresDataSource() {

  25.   return DataSourceBuilder.create().build();

  26.   }

  27.   @Bean(name = "postgresJdbcTemplate")

  28.   public JdbcTemplate postgresJdbcTemplate(@Qualifier("postgresDb")

  29.   DataSource dsPostgres) {

  30.   return new JdbcTemplate(dsPostgres);

  31.   }

  32.   }
复制代码


  解释:

  这是加了注解的配置类,包含加载我们的PostgreSQL和MySQL数据库配置的函数和注解。这也会负责为每一种数据库创建JDBC模板类。

  下面我们看一下这四个函数:

  1.   @Bean(name = "mysqlDb")

  2.   @ConfigurationProperties(prefix = "spring.ds_mysql")

  3.   public DataSource mysqlDataSource() {

  4.   return DataSourceBuilder.create().build();

  5.   }
复制代码


  上面代码第一行创建了mysqlDb bean。

  第二行帮助@Bean加载了所有有前缀spring.ds_mysql的属性。

  第四行创建并初始化了DataSource类,并创建了mysqlDb DataSource对象。

  1.   @Bean(name = "mysqlJdbcTemplate")

  2.   public JdbcTemplate jdbcTemplate(@Qualifier("mysqlDb") DataSource dsMySQL) {

  3.   return new JdbcTemplate(dsMySQL);

  4.   }
复制代码


  第一行以mysqlJdbcTemplate为名创建了一个JdbcTemplate类型的新Bean。

  第二行将第一行中创建的DataSource类型新参数传入函数,并以mysqlDB为qualifier。

  第三行用DataSource对象初始化JdbcTemplate实例。

  1.   @Bean(name = "postgresDb")

  2.   @ConfigurationProperties(prefix = "spring.ds_post")

  3.   public DataSource postgresDataSource() {

  4.   return DataSourceBuilder.create().build();

  5.   }
复制代码


  第一行创建DataSource实例postgresDb。

  第二行帮助@Bean加载所有以spring.ds_post为前缀的配置。

  第四行创建并初始化DataSource实例postgresDb。

  1.   @Bean(name = "postgresJdbcTemplate")

  2.   public JdbcTemplate postgresJdbcTemplate(@Qualifier("postgresDb")

  3.   DataSource dsPostgres) {

  4.   return new JdbcTemplate(dsPostgres);

  5.   }
复制代码


  第一行以postgresJdbcTemplate为名创建JdbcTemplate类型的新bean。

  第二行接受DataSource类型的参数,并以postgresDb为qualifier。

  第三行用DataSource对象初始化JdbcTemplate实例。

  DemoController.java

 
  1.   package com.aegis.controller;

  2.   import java.util.HashMap;

  3.   import java.util.Map;

  4.   import org.springframework.beans.factory.annotation.Autowired;

  5.   import org.springframework.beans.factory.annotation.Qualifier;

  6.   import org.springframework.jdbc.core.JdbcTemplate;

  7.   import org.springframework.web.bind.annotation.PathVariable;

  8.   import org.springframework.web.bind.annotation.RequestMapping;

  9.   import org.springframework.web.bind.annotation.RestController;

  10.   @RestController

  11.   public class DemoController {

  12.   @Autowired

  13.   @Qualifier("postgresJdbcTemplate")

  14.   private JdbcTemplate postgresTemplate;

  15.   @Autowired

  16.   @Qualifier("mysqlJdbcTemplate")

  17.   private JdbcTemplate mysqlTemplate;

  18.   @RequestMapping(value = "/getPGUser")

  19.   public String getPGUser() {

  20.   Map map = new HashMap();

  21.   String query = " select * from usermaster";

  22.   try {

  23.   map = postgresTemplate.queryForMap(query);

  24.   } catch (Exception e) {

  25.   e.printStackTrace();

  26.   }

  27.   return "PostgreSQL Data: " + map.toString();

  28.   }

  29.   @RequestMapping(value = "/getMYUser")

  30.   public String getMYUser() {

  31.   Map map = new HashMap();

  32.   String query = " select * from usermaster";

  33.   try {

  34.   map = mysqlTemplate.queryForMap(query);

  35.   } catch (Exception e) {

  36.   e.printStackTrace();

  37.   }

  38.   return "MySQL Data: " + map.toString();

  39.   }

  40.   }
复制代码


  解释:

  @RestController类注解表明这个类中定义的所有函数都被默认绑定到响应中。

  上面代码段创建了一个JdbcTemplate实例。@Qualifier用于生成一个对应类型的模板。代码中提供的是postgresJdbcTemplate作为Qualifier参数,所以它会加载MultipleDBConfig实例的jdbcTemplate(…)函数创建的Bean。

  这样Spring就会根据你的要求来调用合适的JDBC模板。在调用URL “/getPGUser”时Spring会用PostgreSQL模板,调用URL “/getMYUser”时Spring会用MySQL模板。

  1.   @Autowired

  2.   @Qualifier("postgresJdbcTemplate")

  3.   private JdbcTemplate postgresTemplate;
复制代码

  这里我们用queryForMap(String query)函数来使用JDBC模板从数据库中获取数据,queryForMap(…)返回一个map,以字段名为Key,Value为实际字段值。

  演示

  执行类MultipleDbApplication中的main (…)函数就可以看到演示效果。在你常用的浏览器中点击下面URL:

  URL: http://localhost:6060/getMYUser

  上面的URL会查询MySQL数据库并以字符串形式返回数据。

5.jpg


  Url: http://localhost:6060/getPGUser

  上面的URL会查询PostgreSQL数据库并以字符串形式返回数据。

4.jpg


原文作者:佚名  来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部