博客 / 詳情

返回

JDBC多個數據庫之間聯表查詢

需要對不同數據庫中的表進行聯表查詢,這種問題在單機器中很難見到,一般不會把系統分成多個庫,頂多是分表,微服務或分佈式中比較常見,但此次確實遇到,提供一個簡單的實現思路,框架為springboot。

  1. 在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
  2. 新建一個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);
     }
    
    
    }
  3. 在數據庫中創建一個視圖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;

    生成視圖時要注意在其中一個庫中生成,後面操作也是在該源上操作的。

  4. 此時可以在代碼中對生成的視圖進行操作了

     @Autowired
     @Qualifier("db1JdcbTemplate")
     private JdbcTemplate db1JdcbTemplate;
    
    
     @Test
     public void test(){
         List<Map<String,Object>> res = db1JdcbTemplate.queryForList("select * from USER_VIEW");
         System.out.println();
     }
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.