需要對不同數據庫中的表進行聯表查詢,這種問題在單機器中很難見到,一般不會把系統分成多個庫,頂多是分表,微服務或分佈式中比較常見,但此次確實遇到,提供一個簡單的實現思路,框架為springboot。
-
在application.peoperties中配置好兩個數據源。兩個庫分別為db1和db2
spring.datasource.cardbag.jdbcUrl=jdbc:mysql://${MYSQL_HOST:192.168.199.131}:3306/db1 spring.datasource.cardbag.username=root spring.datasource.cardbag.password=123456 spring.datasource.cardbag.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.zhisonguser.jdbcUrl=jdbc:mysql://${MYSQL_HOST:192.168.199.131}:3306/db2 spring.datasource.zhisonguser.username=root spring.datasource.zhisonguser.password=123456 spring.datasource.zhisonguser.driver-class-name=com.mysql.cj.jdbc.Driver -
新建一個Config類,將數據源配置進去。
@Configuration public class DataSourceConfig { /*db1的源*/ @Bean(name="db1DataSource") @Qualifier("db1DataSource") @ConfigurationProperties(prefix="spring.datasource.db1") public DataSource db1DataSource(){ return DataSourceBuilder.create().build(); } /*db2的源*/ @Bean(name="db2DataSource") @Qualifier("db2DataSource") @ConfigurationProperties(prefix="spring.datasource.db2") public DataSource db2DataSource(){ return DataSourceBuilder.create().build(); } @Bean(name="db1Template") public JdbcTemplate db1JdcbTemplate(@Qualifier("db1DataSource")DataSource db1DataSource){ return new JdbcTemplate(db1DataSource); } @Bean(name="db2Template") public JdbcTemplate db2JdcbTemplate(@Qualifier("db2DataSource")DataSource db2DataSource){ return new JdbcTemplate(db2DataSource); } } -
在數據庫中創建一個視圖View,通過該View實現多庫聯查,可以選擇在db1或db2表上新建查詢,然後創建一個view,過程大概如下:
CREATE VIEW USER_VIEW AS SELECT `db1`.User.userid AS `Userid`, `db1`.User.name AS `Name`, `db2`.User.age AS `Age`, FROM `db1`.User INNER JOIN `db2`.User ON `db1`.User.userid = `db2`.User.userid WHERE `db1`.User.name is not null;生成視圖時要注意在其中一個庫中生成,後面操作也是在該源上操作的。
-
此時可以在代碼中對生成的視圖進行操作了
@Autowired @Qualifier("db1JdcbTemplate") private JdbcTemplate db1JdcbTemplate; @Test public void test(){ List<Map<String,Object>> res = db1JdcbTemplate.queryForList("select * from USER_VIEW"); System.out.println(); }