溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringBoot多數(shù)據(jù)源集成的方法

發(fā)布時(shí)間:2022-05-20 11:24:26 來源:億速云 閱讀:259 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了SpringBoot多數(shù)據(jù)源集成的方法的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇SpringBoot多數(shù)據(jù)源集成的方法文章都會(huì)有所收獲,下面我們一起來看看吧。

    一、多數(shù)據(jù)源使用場景與弊端

    1.場景

    • 業(yè)務(wù)系統(tǒng)跨數(shù)據(jù)庫

    • 數(shù)據(jù)轉(zhuǎn)存(這個(gè)現(xiàn)在太low了,應(yīng)該高級(jí)點(diǎn)都不用)

    • 系統(tǒng)集成

    2.弊端

    • 跨庫業(yè)務(wù)事務(wù)問題

    • service、dao不能重復(fù)注入數(shù)據(jù)源

    二、使用步驟

    1.引入庫

    <!-- 多數(shù)據(jù)源支持 -->
        <dependency>
          <groupId>com.baomidou</groupId>
          <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
          <version>3.3.6</version>
        </dependency>

    2.多數(shù)據(jù)源配置文件

    #數(shù)據(jù)源配置
    spring:
      application:
        name: olap
      datasource:
        dynamic:
          primary: target
        target:
          jdbc-url: jdbc:mysql://192.168.1.101:15051/db1?useUnicode=true&characterEncoding=utf8&useSSL=true&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
          username: root
          password: 123
          driver-class-name: com.mysql.jdbc.Driver
        source1:
          jdbc-url: jdbc:mysql://192.168.102:15052/db2?useUnicode=true&characterEncoding=utf8&useSSL=true&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
          username: admin
          password: 456
          driver-class-name: com.mysql.jdbc.Driver

    3.多數(shù)據(jù)源配置類

    數(shù)據(jù)源1

    import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
    import javax.sql.DataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.annotation.MapperScan;
    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.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.PlatformTransactionManager;
    @Configuration
    @MapperScan(basePackages = "com.easylinkin.dc.mapper.source1", sqlSessionFactoryRef = "source1SqlSessionFactory")
    public class Source1DataSourceConfig {
      // mapper.xml所在地址
      private static final String MAPPER_LOCATION = "classpath*:mapper/business/source1/*.xml";
      /**
       * 數(shù)據(jù)源
       */
      @Bean(name = "source1DataSource")
      @ConfigurationProperties(prefix = "spring.datasource.source1")
      public DataSource dataSource() {
        DataSource build = DataSourceBuilder.create().build();
        return build;
      }
      /**
       * 事務(wù)管理器
       */
      @Bean(name = "source1TransactionManager")
      public PlatformTransactionManager dataSourceTransactionManager(
          @Qualifier("source1DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
      }
      /**
       * session工廠
       */
      @Bean(name = "source1SqlSessionFactory")
      public SqlSessionFactory sqlSessionFactory(@Qualifier("source1DataSource") DataSource dataSource)
          throws Exception {
      /*  final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(
            Source1DataSourceConfig.MAPPER_LOCATION));*/
        //不使用下面這個(gè)無法使用mybatis-plus提供的BaseMapper中的方法,需要增加mybatis-plus 的拓展依賴
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //不在這里注入分頁插件,會(huì)失效
        //bean.setPlugins(new PaginationInterceptor[]{new PaginationInterceptor()});
        return bean.getObject();
      }
    }

    數(shù)據(jù)源2

    import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
    import javax.sql.DataSource;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.annotation.MapperScan;
    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.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    import org.springframework.transaction.PlatformTransactionManager;
    @Configuration
    @MapperScan(basePackages = "com.easylinkin.dc.mapper.target", sqlSessionFactoryRef = "targetSqlSessionFactory")
    public class TargetDataSourceConfig {
      // mapper.xml所在地址
      private static final String MAPPER_LOCATION = "classpath*:mapper/business/target/*.xml";
      /**
       * 主數(shù)據(jù)源,Primary注解必須增加,它表示該數(shù)據(jù)源為默認(rèn)數(shù)據(jù)源 項(xiàng)目中還可能存在其他的數(shù)據(jù)源,如獲取時(shí)不指定名稱,則默認(rèn)獲取這個(gè)數(shù)據(jù)源,如果不添加,則啟動(dòng)時(shí)候回報(bào)錯(cuò)
       */
      @Primary
      @Bean(name = "targetDataSource")
      @ConfigurationProperties(prefix = "spring.datasource.target")
      public DataSource dataSource() {
        DataSource build = DataSourceBuilder.create().build();
        return build;
      }
      /**
       * 事務(wù)管理器,Primary注解作用同上
       */
      @Bean(name = "masterTransactionManager")
      @Primary
      public PlatformTransactionManager dataSourceTransactionManager(
          @Qualifier("targetDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
      }
      /**
       * session工廠,Primary注解作用同上
       */
      @Bean(name = "targetSqlSessionFactory")
      @Primary
      public SqlSessionFactory sqlSessionFactory(@Qualifier("targetDataSource") DataSource dataSource)
          throws Exception {
        /*final SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource);
        sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(
            TargetDataSourceConfig.MAPPER_LOCATION));
        return sessionFactoryBean.getObject();*/
        //不使用下面這個(gè)無法使用mybatis-plus提供的BaseMapper中的方法,需要增加mybatis-plus 的拓展依賴
        MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //不在這里注入分頁插件,會(huì)失效
        //bean.setPlugins(new PaginationInterceptor[]{new PaginationInterceptor()});
        return bean.getObject();
      }
    }
    • 注意dao一定要在@MapperScan注解設(shè)置的包下

    • 注意xml文件要在MAPPER_LOCATION=的路徑下

    • springBoot啟動(dòng)類不要再用@MapperScan注解

    • 其他注意配置類的SqlSessionFactory 方法,看注釋

    4.使用

    import com.baomidou.dynamic.datasource.annotation.DS;
    import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    import com.baomidou.mybatisplus.core.metadata.IPage;
    import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import com.easylinkin.dc.common.exceptions.BusinessException;
    import com.easylinkin.dc.common.utils.io.OutputStreamUtil;
    import com.easylinkin.dc.mapper.source1.FkRegisterVisitorMapper;
    import com.easylinkin.dc.business.visitor.entity.FkRegisterVisitor;
    import com.easylinkin.dc.business.visitor.entity.vo.FkRegisterVisitorVo;
    import com.easylinkin.dc.business.visitor.service.FkRegisterVisitorService;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.ObjectUtils;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.stereotype.Repository;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.util.Assert;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    /**
     * FkRegisterVisitor表服務(wù)實(shí)現(xiàn)類
     *
     * @author CodeGenerator
     * @date 2022/05/16
     */
    @DS("source1")
    @Slf4j
    @Service("fkRegisterVisitorService")
    public class FkRegisterVisitorServiceImpl extends ServiceImpl
        <FkRegisterVisitorMapper, FkRegisterVisitor> implements FkRegisterVisitorService {
        }

    注意是在service的實(shí)現(xiàn)類上用@DS(“數(shù)據(jù)源名稱”)注解,數(shù)據(jù)源名稱與配置文件里的datasource下的一致。

    注意dao不能再用@DS注解,否在報(bào)錯(cuò)

    關(guān)于“SpringBoot多數(shù)據(jù)源集成的方法”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“SpringBoot多數(shù)據(jù)源集成的方法”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI