参考1: https://www.cnblogs.com/tangzekai/p/7782773.html
参考2 https://blog.csdn.net/baochanghong/article/details/54134018
依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.21</version> </dependency>
jdbcTemplate:
List<ReportDetailInfo> list = ediPdJdbcTemplate.query(getShipSql,new BeanPropertyRowMapper(ReportDetailInfo.class)) ;
配置:

package com.icil.report.config; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; 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 DataSourceConfig { @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource")//原博主这里加上@Qualify 没有必要 删了也没有影响 @ConfigurationProperties("jdbc.datasource.edi") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } // @Primary @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") //原博主这里加上@Qualify 没有必要 删了也没有影响 @ConfigurationProperties("jdbc.datasource.booking") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } /** * @param dataSource * @return * @Bean明确地指示了一种方法,什么方法呢——产生一个bean的方法, 并且交给Spring容器管理;从这我们就明白了为啥@Bean是放在方法的注释上了, * 因为它很明确地告诉被注释的方法,你给我产生一个Bean,然后交给Spring容器, * 实现依赖注入 */ @Bean(name = "primaryJdbcTemplate") public JdbcTemplate primaryTemplate(@Qualifier("primaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } }
application.properties

### database EDI configure jdbc.datasource.edi.jdbc-url=jdbc:mysql:///EDI jdbc.datasource.edi.driverClassName=com.mysql.cj.jdbc.Driver jdbc.datasource.edi.username=root jdbc.datasource.edi.password=hhaa jdbc.datasource.edi.sql-script-encoding=UTF-8 ### database booking configure jdbc.datasource.booking.jdbc-url=jdbc:mysql:///booking jdbc.datasource.booking.driverClassName=com.mysql.cj.jdbc.Driver jdbc.datasource.booking.username=root jdbc.datasource.booking.password=hahahaha jdbc.datasource.booking.sql-script-encoding=UTF-8
test:

package top.zekk.twodatasource; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.annotation.Bean; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class TwoDatasourceApplicationTests { @Autowired /*@Qualify 多个同类型bean?存在时 Spring不知道应该绑定哪个实现类 指定绑定的类名@Bean(name="**") */ @Qualifier("primaryJdbcTemplate") protected JdbcTemplate jdbcTemplate1; @Autowired //@Qualify 多个同类型bean?存在时 指定绑定的类名@Bean(name="**") @Qualifier("secondaryJdbcTemplate") protected JdbcTemplate jdbcTemplate2; @Before //首先执行清空数据库操作 public void setUp(){ jdbcTemplate1.update("DELETE FROM USER "); jdbcTemplate2.update("DELETE FROM USER "); } @Test public void test(){ jdbcTemplate1.update ("INSERT INTO USER (id,name,age) VALUES (?,?,?)",1,"aaa",20); jdbcTemplate2.update ("INSERT INTO USER (id,name,age) VALUES (?,?,?)",1,"bbb",30); jdbcTemplate2.update ("INSERT INTO USER (id,name,age) VALUES (?,?,?)",2,"bbb",31); Assert.assertEquals("1",jdbcTemplate1.queryForObject("select count(1) from user",String.class)); Assert.assertEquals("2",jdbcTemplate2.queryForObject("select count(1) from user",String.class)); } }
@Test // 136 db void TestInsert() { userJdbcTemplate.update ("INSERT INTO user (id,name,age) VALUES (?,?,?)",4,"Ryan1",21); addressJdbcTemplate.update ("INSERT INTO address (id,country,provinces,city) VALUES (?,?,?,?)",4,"cn1","gd1","sz"); List<Map<String, Object>> mapsUser = userJdbcTemplate.queryForList("select * from user"); List<Map<String, Object>> mapsAddress = addressJdbcTemplate.queryForList("select * from address"); System.err.println("user" + mapsAddress); System.err.println("address" + mapsAddress); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?