当前位置: 首页 > 科技观察

JavaSpring中同时访问多个不同的数据库

时间:2023-03-21 12:41:35 科技观察

在开发企业应用的时候,我们经常会遇到同时访问多个不同数据库的问题。有时需要将数据归档到数据仓库中,有时需要推送数据更改。到第三方数据库。在使用Spring框架的时候,使用单个数据库是非常容易的,但是如果要同时访问多个数据库,事情就变得复杂多了。本文以在Spring框架下开发一个SpringMVC程序为例,演示一种同时访问多个数据库的方法,尽可能简化配置的改动。建议您也设置两个数据库来跟进我们的示例。在本文中,我们使用了PostgreSQL和MySQL。下面的脚本内容是在两个数据库中创建表和插入数据的命令。PostgreSQLCREATETABLEusermaster(idinteger,namecharactervarying,emailidcharactervarying,phonenocharactervarying(10),locationcharactervarying)INSERTINTTOusermaster(id,name,emailid,phoneno,location)VALUES(1,'name_postgres','email@email.com','1234567890','IN);MySQLCREATETABLE`usermaster`(`id`int(11)NOTNULL,`name`varchar(255)DEFAULTNULL,`emailid`varchar(20)DEFAULTNULL,`phoneno`varchar(20)DEFAULTNULL,`location`varchar(20)DEFAULTNULL,PRIMARYKEY(`id`))INSERTINTO`kode12`.`usermaster`(`id`,`name`,`emailid`,`phoneno`,`location`)VALUES('1','name_mysql','测试@tset.com','9876543210','IN');构建项目我们使用SpringToolSuite(STS)来构建这个示例:单击File->New->SpringStarterProject。在对话框中输入项目名称、Maven坐标、描述和包信息,点击Next。在引导依赖项中选择Web,然后单击下一步。单击完成。STS会根据项目依赖自动从Spring仓库中下载需要的内容。创建的工程如下图所示:下面我们来详细了解一下工程中各个相关文件的内容。pom.xmlpom包含所有必需的依赖项和插件映射。代码:<模型版本>4.0.0com.aegisMultipleDBConnect0.0.1-SNAPSHOTjarMultipleDBMultipleDBwithSpringBootorg.springframework.bootspring-boot-starter-parent1.3.5.RELEASEUTF-81.8org.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-starter-jdbcorg.postgresqlpostgresqlmysqlmysql-connector-java5.1.38org.springframework.开机spring-boot-maven-plugin说明:下面详细解释各种依赖的细节: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文件来提供这些配置信息。server.port=6060spring.ds_post.url=jdbc:postgresql://localhost:5432/kode12spring.ds_post.username=postgresspring.ds_post.password=rootspring.ds_post.driverClassName=org.postgresql.Driverspring.ds_mysql.url=jdbc:mysql://localhost:3306/kode12spring.ds_mysql.username=rootspring.ds_mysql.password=rootspring.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.javapackagecom.aegis;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicMultipleDbApplication{publicstaticvoidmain(String[]args){SpringApplication.run(MultipleDbApplication.class,}}args)包含主要函数启动我们的Boot程序。注解“@SpringBootApplication”是所有其他Spring注解和Java注解的组合,包括:@Configuration@EnableAutoConfiguration@ComponentScan@Target(value={TYPE})@Retention(value=RUNTIME)@Documented@Inherited其他注解:@Configuration@EnableAutoConfiguration@ComponentScan上面的注解会让容器通过这个类来加载我们的配置。MultipleDBConfig.javapackagecom.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;@ConfigurationpublicclassMultipleDBConfig{@Bean(name="mysqlDb")@ConfigurationProperties(prefix="spring.ds_mysql")publicDataSourcemysqlDataSource(){returnDataSourceBuilder.create().build();}@Bean(name="mysqlJdbcTemplate")publicJdbcTemplatejdbcTemplate(@Qualifier("mysqlDb")DataSourcedsMySQL){returnnewJdbcTemplate(dsMySQL);}@Bean(name="postgresDb")@ConfigurationProperties(prefix="spring.ds_post")publicDataSourcepostgresDataSource(){returnDataSourceBuilder.create().build();}@Bean(name="postgresJdbcTemplate")publicJdbcTemplatepostgresJdbcTemplate(@Qualifier("postgresDb")DataSourcesPostgres){returnnewJdbcTemplate(dsPostgres);}}解释:这是注解配置类包含用于加载我们的PostgreSQL和MySQL数据库配置的函数和注释。这还将负责为每个数据库创建JDBC模板类。我们来看看这四个函数:@Bean(name="mysqlDb")@ConfigurationProperties(prefix="spring.ds_mysql")publicDataSourcemysqlDataSource(){returnDataSourceBuilder.create().build();}上面的代码***行创建了mysqlDbbean。第二行帮助@Bean加载前缀为spring.ds_mysql的所有属性。第四行创建并初始化DataSource类,并创建mysqlDbDataSource对象。@Bean(name="mysqlJdbcTemplate")publicJdbcTemplatejdbcTemplate(@Qualifier("mysqlDb")DataSourcesMySQL){returnnewJdbcTemplate(dsMySQL);}***行创建一个名为mysqlJdbcTemplate的JdbcTemplate类型的新Bean。第二行将在***行创建的DataSource类型的新参数传递给函数,并使用mysqlDB作为限定符。第三行使用DataSource对象初始化JdbcTemplate实例。@Bean(name="postgresDb")@ConfigurationProperties(prefix="spring.ds_post")publicDataSourcepostgresDataSource(){returnDataSourceBuilder.create().build();}***行创建一个DataSource实例postgresDb。第二行帮助@Bean加载所有以spring.ds_post为前缀的配置。第四行创建并初始化DataSource实例postgresDb。@Bean(name="postgresJdbcTemplate")publicJdbcTemplatepostgresJdbcTemplate(@Qualifier("postgresDb")DataSourcesPostgres){returnnewJdbcTemplate(dsPostgres);}***行创建一个名为postgresJdbcTemplate的JdbcTemplate类型的新bean。第二行接受一个DataSource类型的参数,并使用postgresDb作为限定符。第三行使用DataSource对象初始化JdbcTemplate实例。DemoController.javapackagecom.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;@RestControllerpublicclassDemoController{@Autowired@Qualifier("postgresJdbcTemplate")privateJdbcTemplatepostgresTemplate;@Autowired@Qualifier("mysqlJdbcTemplate")privateJdbcTemplatemysqlTemplate;@RequestMapping(value="/getPGUser")publicStringgetPGUser(){Mapmap=newHashMap();Stringquery="select*fromusermaster";try{map=postgresTemplate.queryForMap(query);}catch(Exceptione){e.printStackTrace();}return"PostgreSQLData:"+map.toString();}@RequestMapping(value="/getMYUser")publicStringgetMYUser(){Mapmap=newHashMap();Stringquery="select*fromusermaster";try{map=mysqlTemplate.queryForMap(query);}catch(Exceptione){e.printStackTrace();}return"MySQLData:"+map.toString();}}解释:@RestController类注解表示默认绑定该类定义的所有函数上面的代码片段在响应中创建了一个JdbcTemplate实例。@Qualifier用于生成对应类型的模板。该代码提供postgresJdbcTemplate作为Qualifier参数,因此它将加载由MultipleDBConfig实例的jdbcTemplate(...)函数创建的Bean。这样,Spring就会根据你的要求调用合适的JDBC模板。Spring在调用URL“/getPGUser”时将使用PostgreSQL模板,而在调用URL“/getMYUser”时Spring将使用MySQL模板。@Autowired@Qualifier("postgresJdbcTemplate")privateJdbcTemplatepostgresTemplate;这里我们使用queryForMap(Stringquery)函数使用JDBC模板从数据库中获取数据,queryForMap(...)返回一个map,字段名为Key,Value为实际字段值。执行MultipleDbApplication类中的main(...)函数可以看到演示效果。在常用浏览器中单击以下URL:URL:http://localhost:6060/getMYUser上述URL将查询MySQL数据库并以字符串形式返回数据。Url:http://localhost:6060/getPGUser上面的URL将查询PostgreSQL数据库并将数据作为字符串返回。关于作者AaronJacobson是一位经验丰富的JavaWeb程序员,他在外包和咨询公司Technoligent作为Java开发程序员工作了10多年。他的主要贡献包括Java、Python、Asp.Net和移动应用程序中的一系列Web解决方案。可以在Twitter@Techno_Ligent或Facebook@TechnoLigent上联系到他。