Java Spring中同时访问多种不同数据库

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

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

开发企业应用时我们常常遇到要同时访问多种不同数据库的问题,有时是必须把数据归档到某种数据仓库中,有时是要把数据变更推送到第三方数据库中。使用Spring框架时,使用单一数据库是非常容易的,但如果要同时访问多个数据库的话事件就变得复杂多了。

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

搭建数据库

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

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

PostgreSQL

  1. CREATETABLEusermaster(
  2. idinteger,
  3. namecharactervarying,
  4. emailidcharactervarying,
  5. phonenocharactervarying(10),
  6. locationcharactervarying)
  7. INSERTINTOusermaster(id,name,emailid,phoneno,location)VALUES(1,'name_postgres','email@email.com','1234567890','IN');

MySQL

  1. CREATETABLE`usermaster`(`id`int(11)NOTNULL,
  2. `name`varchar(255)DEFAULTNULL,
  3. `emailid`varchar(20)DEFAULTNULL,
  4. `phoneno`varchar(20)DEFAULTNULL,
  5. `location`varchar(20)DEFAULTNULL,
  6. PRIMARYKEY(`id`)
  7. )INSERTINTO`kode12`.`usermaster`
  8. (`id`,`name`,`emailid`,`phoneno`,`location`)VALUES
  9. ('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仓库中下载所需要的内容。

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

Java Spring中同时访问多种不同数据库[[191743]]

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

pom.xml

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

代码:

  1. <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.aegis</groupId>
  7. <artifactId>MultipleDBConnect</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10. <name>MultipleDB</name>
  11. <description>MultipleDBwithSpringBoot</description>
  12. <parent>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-parent</artifactId>
  15. <version>1.3.5.RELEASE</version>
  16. <relativePath/>
  17. </parent>
  18. <properties>
  19. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  20. <java.version>1.8</java.version>
  21. </properties>
  22. <dependencies>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-test</artifactId>
  30. <scope>test</scope>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-jdbc</artifactId>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.postgresql</groupId>
  38. <artifactId>postgresql</artifactId>
  39. </dependency>
  40. <dependency>
  41. <groupId>mysql</groupId>
  42. <artifactId>mysql-connector-java</artifactId>
  43. <version>5.1.38</version>
  44. </dependency>
  45. </dependencies>
  46. <build>
  47. <plugins>
  48. <plugin>
  49. <groupId>org.springframework.boot</groupId>
  50. <artifactId>spring-boot-maven-plugin</artifactId>
  51. </plugin>
  52. </plugins>
  53. </build></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=6060spring.ds_post.url=jdbc:postgresql://localhost:5432/kode12spring.ds_post.username=postgres
  2. spring.ds_post.password=root
  3. spring.ds_post.driverClassName=org.postgresql.Driverspring.ds_mysql.url=jdbc:mysql://localhost:3306/kode12spring.ds_mysql.username=root
  4. spring.ds_mysql.password=root
  5. 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. packagecom.aegis;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicMultipleDbApplication{publicstaticvoidmain(String[]args){
  2. SpringApplication.run(MultipleDbApplication.class,args);
  3. }
  4. }

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

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

其他注解:

  1. @Configuration@EnableAutoConfiguration@ComponentScan

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

MultipleDBConfig.java

  1. packagecom.aegis.config;importjavax.sql.DataSource;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Primary;importorg.springframework.jdbc.core.JdbcTemplate;
  2. @ConfigurationpublicclassMultipleDBConfig{
  3. @Bean(name="mysqlDb")
  4. @ConfigurationProperties(prefix="spring.ds_mysql")
  5. publicDataSourcemysqlDataSource(){returnDataSourceBuilder.create().build();
  6. }
  7. @Bean(name="mysqlJdbcTemplate")
  8. publicJdbcTemplatejdbcTemplate(@Qualifier("mysqlDb")DataSourcedsMySQL){returnnewJdbcTemplate(dsMySQL);
  9. }
  10. @Bean(name="postgresDb")
  11. @ConfigurationProperties(prefix="spring.ds_post")
  12. publicDataSourcepostgresDataSource(){returnDataSourceBuilder.create().build();
  13. }
  14. @Bean(name="postgresJdbcTemplate")
  15. publicJdbcTemplatepostgresJdbcTemplate(@Qualifier("postgresDb")
  16. DataSourcedsPostgres){returnnewJdbcTemplate(dsPostgres);
  17. }
  18. }

解释:

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

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

  1. @Bean(name="mysqlDb")@ConfigurationProperties(prefix="spring.ds_mysql")publicDataSourcemysqlDataSource(){returnDataSourceBuilder.create().build();
  2. }

上面代码***行创建了mysqlDb bean。

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

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

  1. @Bean(name="mysqlJdbcTemplate")publicJdbcTemplatejdbcTemplate(@Qualifier("mysqlDb")DataSourcedsMySQL){returnnewJdbcTemplate(dsMySQL);
  2. }

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

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

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

  1. @Bean(name="postgresDb")@ConfigurationProperties(prefix="spring.ds_post")publicDataSourcepostgresDataSource(){returnDataSourceBuilder.create().build();
  2. }

***行创建DataSource实例postgresDb。

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

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

  1. @Bean(name="postgresJdbcTemplate")publicJdbcTemplatepostgresJdbcTemplate(@Qualifier("postgresDb")
  2. DataSourcedsPostgres){returnnewJdbcTemplate(dsPostgres);
  3. }

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

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

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

DemoController.java

  1. packagecom.aegis.controller;importjava.util.HashMap;importjava.util.Map;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;
  2. @RestControllerpublicclassDemoController{
  3. @Autowired
  4. @Qualifier("postgresJdbcTemplate")privateJdbcTemplatepostgresTemplate;
  5. @Autowired
  6. @Qualifier("mysqlJdbcTemplate")privateJdbcTemplatemysqlTemplate;
  7. @RequestMapping(value="/getPGUser")publicStringgetPGUser(){Map<String,Object>map=newHashMap<String,Object>();Stringquery="select*fromusermaster";try{map=postgresTemplate.queryForMap(query);
  8. }catch(Exceptione){
  9. e.printStackTrace();
  10. }return"PostgreSQLData:"+map.toString();
  11. }
  12. @RequestMapping(value="/getMYUser")publicStringgetMYUser(){Map<String,Object>map=newHashMap<String,Object>();Stringquery="select*fromusermaster";try{map=mysqlTemplate.queryForMap(query);
  13. }catch(Exceptione){
  14. e.printStackTrace();
  15. }return"MySQLData:"+map.toString();
  16. }
  17. }

解释:

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

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

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

  1. @Autowired@Qualifier("postgresJdbcTemplate")privateJdbcTemplatepostgresTemplate;

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

演示

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

URL: http://localhost:6060/getMYUser

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

Java Spring中同时访问多种不同数据库

Url: http://localhost:6060/getPGUser

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

Java Spring中同时访问多种不同数据库

关于作者

Aaron Jacobson是个经验丰富的Java Web程序员,在外包与咨询公司Technoligent担任Java开发程序员10年以上。他的主要贡献包括Java、Python、Asp.Net和手机应用等一系列Web解决方案。可以通过Twitter @Techno_Ligent或Facebook @TechnoLigent联系他。

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年5月4日 23:12
下一篇 2023年5月4日 23:12

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信