1. 程式人生 > 程式設計 >SpringBoot Mybatis如何配置多資料來源並分包

SpringBoot Mybatis如何配置多資料來源並分包

看了不少網上關於多資料來源的配置,大致可分為兩類,分包方式和通過切面方式;

樣例已上傳至github:https://github.com/dadachao/multids

第一個子專案ds01即時使用分包方式完成多資料來源配置。

總結專案中出現的問題和解決辦法:

資料庫的連線資訊:

連線資訊是寫在db.properties檔案中的:

#資料庫ds1
spring.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.ds1.url=jdbc:mysql://localhost:3306/ds1?serverTimezone=UTC

spring.datasource.ds1.username=root
spring.datasource.ds1.password=root
#資料庫ds2
spring.datasource.ds2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.ds2.url=jdbc:mysql://localhost:3306/ds2?serverTimezone=UTC
spring.datasource.ds2.username=root
spring.datasource.ds2.password=root

這些資訊將在配置類DbConfig1.java中引用。一開始我是通過使用註解@ImportResource(...)引進db.properties檔案,但在執行時報了org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 前言中不允許有內容的錯誤;使用這個註解也是我瞎猜的。後是通過使用註解@PropertySource(value = "classpath:/db.properties",encoding = "utf-8")解決問題。

其次是關於在配置類中使用@ConfigurationProperties註解自動注入連線資訊值(value)的問題:spring.datasource.ds1.url=jdbc:mysql://localhost:3306/ds1?serverTimezone=UTC

注意要使用.url而不是.jdbc-url;

指定資料連線池型別DataType:

資料來源型別可以在配置類生成DataSource的方法中指定:

@Bean(name = "ds1DataSource")
  @Primary
  @ConfigurationProperties(prefix = "spring.datasource.ds1")
  public DataSource getDataSource(){
    DataSourceBuilder<?> dataSourceBuilder = DataSourceBuilder.create();
    dataSourceBuilder.type(com.alibaba.druid.pool.DruidDataSource.class);
    return dataSourceBuilder.build();
  }

指定***Mapper.xml檔案的路徑掃描問題:(相當重要)

使用配置類進行資料來源相關進行配置後,原先在application.yml中配置的相關引數就不起作用了(原因未知),原先我是在application.yml中配置了.xml檔案的掃描路徑:

mybatis:
mapper-locations: classpath:/mybatis/**/*.xml
type-aliases-package: com.kong.ds01.model

但在執行時報錯:Mapper Bound Error(not found);後來通過在配置類中寫入掃描路徑解決:

public final static String mapperXmlLocation = "classpath:mybatis/*/*.xml";

@Bean(name = "ds1SqlSessionFactory")
  @Primary
  public SqlSessionFactory getSqlSessionFactory(@Qualifier("ds1DataSource") DataSource dataSource) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dataSource);
    sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperXmlLocation));
    return sqlSessionFactoryBean.getObject();
  }

而且通過這種方法表示任意路徑不能使用/**/,要使用/*/,否則識別不出來又會報相同的錯誤,這點真是太坑了!

指定執行器的型別(Execute.Type):

可以通過在配置類中的sqlSessionTemplate中指定:

@Bean(name = "ds1SqlSessionTemplate")
  @Primary
  public SqlSessionTemplate getSqlSessionTemplate(@Qualifier("ds1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
    return new SqlSessionTemplate(sqlSessionFactory,ExecutorType.BATCH);
  }

指定為BATCH型別後在進行批量操作時效率有明顯的提高。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。