国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot整合Mybatis配置多數(shù)據(jù)源

這篇具有很好參考價(jià)值的文章主要介紹了Spring Boot整合Mybatis配置多數(shù)據(jù)源。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


前言

在之前的事件管理系統(tǒng)博客中有提到動(dòng)態(tài)的多數(shù)據(jù)源配置

工作中難免需要做幾個(gè)工具方便自己偷懶,加上之前的擋板,數(shù)據(jù)源肯定沒(méi)法單一配置,所以需要多數(shù)據(jù)源配置。這里介紹兩種配置:動(dòng)態(tài)數(shù)據(jù)源和固定數(shù)據(jù)源模式。這兩種我在目前的工作的工具開(kāi)發(fā)中都有用到。


一、固定數(shù)據(jù)源配置

Mybatis是提供這種固定的多數(shù)據(jù)源配置的,需要分別配置包掃描(一般是不同的數(shù)據(jù)源掃描不同的包),事務(wù)處理器等。

  • yml配置,主要是不要用Spring Boot自帶的數(shù)據(jù)庫(kù)配置,spring.datasource,或者其他數(shù)據(jù)源配置,改用自己的,這樣其實(shí)Spring boot的數(shù)據(jù)庫(kù)自動(dòng)配置DataSourceAutoConfiguration其實(shí)是失效了的。
## 這個(gè)是第一個(gè)固定配置
spring:
  datasource:
    druid:
      db-type: com.alibaba.druid.pool.DruidDataSource
      driver-class-name: com.ibm.db2.jcc.DB2Driver
      url: jdbc:db2://*****
      username: ****
      password: ****
      initial-size: 1
      min-idle: 1
      max-active: 1
      max-wait: 5000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      max-evictable-idle-time-millis: 900000
      connection-error-retry-attempts: 1
      break-after-acquire-failure: true
## 這是第二個(gè)動(dòng)態(tài)數(shù)據(jù)源配置
app:
  datasource:
    mapDatasource:
      TESTDATASOURCE1:
        db-type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
        url: jdbc:sqlserver://****
        username: ****
        password: ****
        initial-size: 5
        min-idle: 5
        max-active: 10
        max-wait: 5000
        time-between-eviction-runs-millis: 60000
        min-evictable-idle-time-millis: 300000
        max-evictable-idle-time-millis: 900000
        connection-error-retry-attempts: 1
        break-after-acquire-failure: true
      TESTDATASOURCE2:
        db-type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
        url: jdbc:sqlserver://****
        username: ****
        password: ****
        initial-size: 5
        min-idle: 5
        max-active: 10
        max-wait: 5000
        time-between-eviction-runs-millis: 60000
        min-evictable-idle-time-millis: 300000
        max-evictable-idle-time-millis: 900000
        connection-error-retry-attempts: 1
        break-after-acquire-failure: true
      TESTDATASOURCE3:
        db-type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.ibm.db2.jcc.DB2Driver
        url: jdbc:db2://****
        username: ****
        password: ****
        initial-size: 5
        min-idle: 5
        max-active: 10
        max-wait: 5000
        time-between-eviction-runs-millis: 60000
        min-evictable-idle-time-millis: 300000
        max-evictable-idle-time-millis: 900000
        connection-error-retry-attempts: 1
        break-after-acquire-failure: true
      TESTDATASOURCE4:
        db-type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.ibm.db2.jcc.DB2Driver
        url: jdbc:db2://****
        username: ****
        password: ****
        initial-size: 5
        min-idle: 5
        max-active: 10
        max-wait: 5000
        time-between-eviction-runs-millis: 60000
        min-evictable-idle-time-millis: 300000
        max-evictable-idle-time-millis: 900000
        connection-error-retry-attempts: 1
        break-after-acquire-failure: true
  • Spring Boot配置類(lèi)
@Data
@ConfigurationProperties(prefix = "app.datasource")
public class SystemDynamicDatasourceProperties {
    private Map<String, DruidDataSource> mapDatasource;
}

  • mybatis固定數(shù)據(jù)源配置
@Configuration
public class DataSourceConfiguration {


    @Configuration
    @MapperScan(basePackages = "com.test.mapper.datasource1", sqlSessionTemplateRef  = "source1SqlSessionTemplate")
    public static class source1DatasourceConfiguration {
        @Bean(name = "source1DataSource")
        @ConfigurationProperties(prefix = "spring.datasource.druid")
        public DruidDataSource source1DataSource(){
            return new DruidDataSource();
        }

        @Bean(name = "source1TransactionManager")
        public DataSourceTransactionManager source1TransactionManager(@Qualifier("source1DataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }


        @Bean(name = "source1SqlSessionFactory")
        public SqlSessionFactory source1SqlSessionFactory(@Qualifier("source1DataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/source1/*.xml"));
            bean.setTypeAliasesPackage("com.source1.entity");
            return bean.getObject();
        }

        @Bean(name = "source1SqlSessionTemplate")
        public SqlSessionTemplate source1SqlSessionTemplate(@Qualifier("source1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }

    @Configuration
    @EnableConfigurationProperties(SystemDynamicDatasourceProperties.class)
    @MapperScan(basePackages = "com.source1.source1web.mapper.other", sqlSessionTemplateRef  = "otherSqlSessionTemplate")
    public static class DynamicDatasourceConfiguration {

        @Resource
        private SystemDynamicDatasourceProperties systemDynamicDatasourceProperties;
        @Bean(name = "otherDataSource")
        public SystemDynamicDatasource otherDataSource(){
            HashMap<Object, Object> map = new HashMap<>(systemDynamicDatasourceProperties.getMapDatasource());
            SystemDynamicDatasource systemDynamicDatasource = new SystemDynamicDatasource(map);
            return systemDynamicDatasource;
        }

        @Bean(name = "otherTransactionManager")
        public DataSourceTransactionManager otherTransactionManager(@Qualifier("otherDataSource") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }


        @Bean(name = "otherSqlSessionFactory")
        public SqlSessionFactory otherSqlSessionFactory(@Qualifier("otherDataSource") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/other/*.xml"));
            bean.setTypeAliasesPackage("com.source1.source1web.entity");
            return bean.getObject();
        }

        @Bean(name = "otherSqlSessionTemplate")
        public SqlSessionTemplate otherSqlSessionTemplate(@Qualifier("otherSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    }
}

  • 說(shuō)明
    這兩種其實(shí)就已經(jīng)是兩種數(shù)據(jù)源的配置了,當(dāng)使用com.test.mapper.datasource1包下的Mapper的時(shí)候,使用的是就Datasource1的數(shù)據(jù)源,包括事務(wù)管理器,當(dāng)使用com.source1.source1web.mapper.other包下的Mapper的時(shí)候,就是第二種數(shù)據(jù)源。

但是,這種只適合于單數(shù)據(jù)庫(kù)操作的事務(wù),多數(shù)據(jù)庫(kù)的事務(wù)屬于分布式事務(wù),不適于此,當(dāng)一個(gè)數(shù)據(jù)庫(kù)事務(wù)提交成功之后,另一個(gè)事務(wù)失敗的話(huà),無(wú)法回滾第一個(gè)。因?yàn)榇隧?xiàng)目只適用于查詢(xún)和單數(shù)據(jù)庫(kù)的插入,失敗不做回滾。

二、動(dòng)態(tài)數(shù)據(jù)源

其實(shí)就是在上面的基礎(chǔ)上,上面已經(jīng)配置好了數(shù)據(jù)源,和動(dòng)態(tài)的配置,但是漏掉了一些配置的細(xì)節(jié),就是動(dòng)態(tài)數(shù)據(jù)源,其實(shí)Mybatis提供了動(dòng)態(tài)數(shù)據(jù)源的抽象類(lèi)AbstractRoutingDataSource,我們只需要繼承這個(gè)類(lèi)并重寫(xiě)determineCurrentLookupKey方法,找到相關(guān)的數(shù)據(jù)源即可。在這個(gè)配置里無(wú)論添加多少數(shù)據(jù)源都可以,動(dòng)態(tài)添加也是可以的。

  • 動(dòng)態(tài)數(shù)據(jù)源配置
public class SystemDynamicDatasource extends AbstractRoutingDataSource {
    private Map<Object,Object> dataSourceMap;
    public static final ThreadLocal<String> DATA_SOURCE = new ThreadLocal<>();

    public SystemDynamicDatasource(Map<Object, Object> dataSourceMap){
        this.dataSourceMap = dataSourceMap;
        super.setTargetDataSources(dataSourceMap);
        super.afterPropertiesSet();
    }

    public void setDataSource(Integer key, DataSource dataSource){
        DruidDataSource oldDataSource = (DruidDataSource) dataSourceMap.put(key, dataSource);
        if (oldDataSource != null) {
            oldDataSource.close();
        }
        afterPropertiesSet();
    }
    public void removeDataSource(String key){
        DruidDataSource oldDataSource = (DruidDataSource) dataSourceMap.remove(key);
        if (oldDataSource != null) {
            oldDataSource.close();
        }
        afterPropertiesSet();
    }
    public boolean isExist(String key){
        return dataSourceMap.get(key) != null;
    }
    @Override
    protected Object determineCurrentLookupKey() {
        return DATA_SOURCE.get();
    }
    public void setDataSource(String dataSource){
        DATA_SOURCE.set(dataSource);
    }

    public static void removeDataSource(){
        DATA_SOURCE.remove();
    }
}

說(shuō)明:

  • 線(xiàn)上使用進(jìn)入多線(xiàn)程環(huán)境,其實(shí)主要區(qū)別就是需要確定當(dāng)前線(xiàn)程使用的是哪個(gè)數(shù)據(jù)源。Map里面存儲(chǔ)的就是多數(shù)據(jù)源,其中key是每個(gè)數(shù)據(jù)源的key,當(dāng)某個(gè)線(xiàn)程需要確定使用哪個(gè)數(shù)據(jù)源的時(shí)候,就是靠這個(gè)key來(lái)進(jìn)行區(qū)分的。
  • ThreadLocal就是確定某個(gè)線(xiàn)程使用的是哪個(gè)key,這樣保證了線(xiàn)程安全,不會(huì)相互影響,只要使用的時(shí)候注意remove即可。
  • determineCurrentLookupKey調(diào)用來(lái)決定哪個(gè)數(shù)據(jù)源。
  • AOP配置

    這里最好使用AOP進(jìn)行統(tǒng)一配置,不要在代碼里寫(xiě),在代碼里寫(xiě)既添加了大量重復(fù)代碼,而且與業(yè)務(wù)相關(guān),代碼可讀性差,最好做成AOP統(tǒng)一配置。

    代碼如下:

    • 注解
      @Target({ElementType.TYPE, ElementType.METHOD})
      public @interface OtherDatasource {
          String value() default "";
      }
      

      可以通過(guò)這個(gè)注解來(lái)充當(dāng)切點(diǎn),但是本次使用僅作為額外數(shù)據(jù),獲取指定的數(shù)據(jù)源使用。

    • 切面
    @Aspect
    @Component
    @Slf4j
    public class OtherDataSourceAspect {
    
        @Autowired
        private SystemDynamicDatasource systemDynamicDatasource;
    
    //     @Pointcut("@annotation(com.ibank.im.app.aop.cache.annotation.SystemCacheable)")
    
        @Pointcut("execution(public * com.test.mapper.other.*.*(..))")
        public void pointcut(){}
    
        @Around("pointcut()")
        public Object systemCacheableAround(ProceedingJoinPoint joinPoint) throws Throwable {
            Class<?> targetCls=joinPoint.getTarget().getClass();
    
            OtherDatasource annotation = targetCls.getAnnotation(OtherDatasource.class);
            String datasource = null;
            if (Objects.isNull(annotation) || !StringUtils.hasText(datasource = annotation.value())) {
                MethodSignature methodSignature=(MethodSignature)joinPoint.getSignature();
                Method targetMethod=
                        targetCls.getDeclaredMethod(
                                methodSignature.getName(),
                                methodSignature.getParameterTypes());
                OtherDatasource methodAnnotation = targetMethod.getAnnotation(OtherDatasource.class);
    
                if (Objects.isNull(methodAnnotation) || !StringUtils.hasText(datasource = methodAnnotation.value())) {
                    Object[] args = joinPoint.getArgs();
                    if (Arrays.isNullOrEmpty(args)) {
                        throw new IllegalArgumentException("must have 1 param");
                    }
                    if (!(args[0] instanceof String)) {
                        throw new IllegalArgumentException("the first param must be databaseEnv");
                    }
                    datasource = (String) args[0];
                }
            }
    
            if (!systemDynamicDatasource.isExist(datasource)) {
                throw new IllegalArgumentException("databaseEnv does not exist");
            }
            try{
                systemDynamicDatasource.setDataSource(datasource);
                return joinPoint.proceed();
            }finally {
                systemDynamicDatasource.removeDataSource(datasource);
            }
        }
    }
    

說(shuō)明:

  • 本次數(shù)據(jù)源直接在Mapper層使用,不在Service層使用,因?yàn)橐粋€(gè)Service可能要使用多個(gè)不同的數(shù)據(jù)源操作,比較麻煩,直接作用在Mapper層比較合適。
  • 邏輯上,先判斷這個(gè)類(lèi)上有沒(méi)有注解,有的話(huà)使用這個(gè)注解,如果沒(méi)有在使用方法上的注解,方法上如果沒(méi)有注解,就是用第一個(gè)String參數(shù),在沒(méi)有就會(huì)報(bào)錯(cuò),在判斷是否存在這個(gè)數(shù)據(jù)源。不存在直接報(bào)錯(cuò)。
  • 使用的時(shí)候,一定要用try包裹,使用完成必須remove掉當(dāng)前的值,無(wú)論是否發(fā)生異常。不移除的話(huà)容易發(fā)生內(nèi)存溢出等問(wèn)題。
  • 切面執(zhí)行方法就是ProceedingJoinPoint類(lèi)的proceed方法,但是實(shí)際上這個(gè)方法有兩個(gè)重載的函數(shù),一個(gè)帶參數(shù)一個(gè)不帶參數(shù),這里簡(jiǎn)要介紹一下:
    • 不帶參數(shù)的:表示調(diào)用時(shí)傳遞什么參數(shù),就是什么參數(shù),Advice不干預(yù),原樣傳遞。因?yàn)楸敬芜^(guò)程不修改什么參數(shù)。所以使用的是這個(gè)
    • 帶參數(shù)的:自然就是相反的,將替換掉調(diào)用時(shí)傳遞的參數(shù),這時(shí)候方法里調(diào)用的就是切面里的參數(shù)。

因?yàn)槟壳皹I(yè)務(wù)需求問(wèn)題,都是使用的參數(shù)進(jìn)行傳遞,所以只能定義在方法參數(shù)上。像這個(gè)樣子:

@Mapper
public interface TestMapper {

    int insertTest(String env, Entity entity);

}

第一個(gè)參數(shù)就決定是哪個(gè)數(shù)據(jù)源,但是實(shí)際上業(yè)務(wù)并不采用。因?yàn)闊o(wú)法固定使用某個(gè)數(shù)據(jù)源的問(wèn)題,只能以參數(shù)的方式傳遞。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-817237.html


搞定收工!

到了這里,關(guān)于Spring Boot整合Mybatis配置多數(shù)據(jù)源的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring Boot + MyBatis-Plus 實(shí)現(xiàn) MySQL 主從復(fù)制動(dòng)態(tài)數(shù)據(jù)源切換

    Spring Boot + MyBatis-Plus 實(shí)現(xiàn) MySQL 主從復(fù)制動(dòng)態(tài)數(shù)據(jù)源切換

    MySQL 主從復(fù)制是一種常見(jiàn)的數(shù)據(jù)庫(kù)架構(gòu),它可以提高數(shù)據(jù)庫(kù)的性能和可用性。 動(dòng)態(tài)數(shù)據(jù)源切換則可以根據(jù)業(yè)務(wù)需求,在不同場(chǎng)景下使用不同的數(shù)據(jù)源,比如在讀多寫(xiě)少的場(chǎng)景下,可以通過(guò)切換到從庫(kù)來(lái)分擔(dān)主庫(kù)的壓力 。 在本文中,我們將介紹如何在 Spring Boot 中實(shí)現(xiàn) MySQL 動(dòng)

    2024年02月19日
    瀏覽(27)
  • Spring Boot 配置雙數(shù)據(jù)源

    Spring Boot 配置雙數(shù)據(jù)源

    Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve denpendies. 需求: 1.基本步驟 添加依賴(lài) 添加 Spring Boot 和數(shù)據(jù)庫(kù)驅(qū)動(dòng)的依賴(lài) 配置數(shù)據(jù)源 在 application.properties 或 application.yml 中分別配

    2024年01月22日
    瀏覽(23)
  • Spring Boot入門(mén)(07):整合 MySQL 和 Druid數(shù)據(jù)源 | 全網(wǎng)最詳細(xì)保姆級(jí)教學(xué)(兩萬(wàn)字)

    Spring Boot入門(mén)(07):整合 MySQL 和 Druid數(shù)據(jù)源 | 全網(wǎng)最詳細(xì)保姆級(jí)教學(xué)(兩萬(wàn)字)

    ????????作為現(xiàn)代Web應(yīng)用開(kāi)發(fā)的重要技術(shù)棧之一,Spring Boot在快速構(gòu)建可靠、高效、易維護(hù)的應(yīng)用方面具有獨(dú)特的優(yōu)勢(shì)。而在實(shí)際開(kāi)發(fā)中,數(shù)據(jù)庫(kù)作為系統(tǒng)的重要組成部分,對(duì)于數(shù)據(jù)源的選擇和配置也是至關(guān)重要的。本篇文章將全面介紹如何使用Spring Boot整合MySQL和Druid數(shù)據(jù)

    2024年02月12日
    瀏覽(25)
  • 【Java】Spring Boot配置動(dòng)態(tài)數(shù)據(jù)源

    1.1 創(chuàng)建動(dòng)態(tài)數(shù)據(jù)源 通過(guò)實(shí)現(xiàn)Spring提供的AbstractRoutingDataSource類(lèi),可以實(shí)現(xiàn)自己的數(shù)據(jù)源選擇邏輯,從而可以實(shí)現(xiàn)數(shù)據(jù)源的動(dòng)態(tài)切換。 1.2 創(chuàng)建動(dòng)態(tài)數(shù)據(jù)源配置類(lèi) 跟配置靜態(tài)多數(shù)據(jù)源一樣,需要手動(dòng)配置下面的三個(gè) Bean,只不過(guò)DynamicDataSource類(lèi)的targetDataSources是空的。 1.3 創(chuàng)建動(dòng)

    2024年02月09日
    瀏覽(25)
  • Spring Boot配置多個(gè)Kafka數(shù)據(jù)源

    application.properties配置文件如下 1.第一個(gè)kakfa 2.第二個(gè)kakfa 備注: 生產(chǎn)者消費(fèi)者代碼參考鏈接,開(kāi)發(fā)同學(xué)需要以實(shí)際情況按要求自己變更下代碼即可: Spring Boot 集成多個(gè) Kafka_springboot集成多個(gè)kafka_//承續(xù)緣_紀(jì)錄片的博客-CSDN博客

    2024年02月07日
    瀏覽(27)
  • 使用mybatis和dynamic-datasource-spring-boot-starter動(dòng)態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫(kù)

    記錄 :415 場(chǎng)景 :使用mybatis和dynamic-datasource-spring-boot-starter動(dòng)態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫(kù)。 版本 :JDK 1.8,Spring?Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。 源碼 :https://github.com/baomidou/dynamic-datasource-spring-boot-starter dynamic-datasource-spring-boot-starter :一個(gè)基于springboot的快

    2023年04月19日
    瀏覽(22)
  • 如何在Spring Boot中配置雙數(shù)據(jù)源?

    在許多應(yīng)用程序中, 可能會(huì)遇到需要連接多個(gè)數(shù)據(jù)庫(kù)的情況 。這些數(shù)據(jù)庫(kù)可以是不同的類(lèi)型,例如關(guān)系型數(shù)據(jù)庫(kù)和NoSQL數(shù)據(jù)庫(kù),或者它們可以是相同類(lèi)型但包含不同的數(shù)據(jù)。為了處理這種情況,我們可以使用雙數(shù)據(jù)源來(lái)管理多個(gè)數(shù)據(jù)庫(kù)連接。 雙數(shù)據(jù)源是指在一個(gè)應(yīng)用程序中

    2024年02月11日
    瀏覽(20)
  • 使用dynamic-datasource-spring-boot-starter動(dòng)態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫(kù)(MyBatis-3.5.9)

    記錄 :383 場(chǎng)景 :使用dynamic-datasource-spring-boot-starter動(dòng)態(tài)切換數(shù)據(jù)源,使用MyBatis操作數(shù)據(jù)庫(kù)。提供三種示例:一,使用@DS注解作用到類(lèi)上。二,使用@DS注解作用到方法上。三,不使用注解,使用DynamicDataSourceContextHolder類(lèi)在方法內(nèi)靈活切換不同數(shù)據(jù)源。 源碼: https://github.com/

    2024年01月20日
    瀏覽(24)
  • Spring Boot多數(shù)據(jù)源配置詳解及報(bào)錯(cuò)問(wèn)題解決

    Spring Boot多數(shù)據(jù)源配置詳解及報(bào)錯(cuò)問(wèn)題解決

    Spring Boot多數(shù)據(jù)源配置詳解 前幾天,公司提了個(gè)需求,對(duì)一個(gè)項(xiàng)目進(jìn)行二次開(kāi)發(fā),在開(kāi)發(fā)過(guò)程中,需要配置多數(shù)據(jù)源來(lái)進(jìn)行數(shù)據(jù)庫(kù)的操作。下面我將主鍵探索總結(jié)的配置流程和遇到的各種坑做以總結(jié),希望能夠幫到遇到同樣問(wèn)題的友友。有錯(cuò)的地方,請(qǐng)各位大佬留言指出。

    2024年02月16日
    瀏覽(21)
  • spring boot下基于spring data jpa配置mysql+達(dá)夢(mèng)多數(shù)據(jù)源(以不同包路徑方式,mysql為主數(shù)據(jù)源)

    :mysql 達(dá)夢(mèng)/dameng jpa 多數(shù)據(jù)源 spring boot:2.1.17.RELEASE mysql驅(qū)動(dòng):8.0.21(跟隨boot版本) 達(dá)夢(mèng)驅(qū)動(dòng):8.1.2.192 lombok:1.18.12(跟隨boot版本) 以mysql為主數(shù)據(jù)源,達(dá)夢(mèng)為第二數(shù)據(jù)源方式配置 適用于舊項(xiàng)目二次開(kāi)發(fā)接入達(dá)夢(mèng)數(shù)據(jù)庫(kù)或基于通用二方/三方包做業(yè)務(wù)擴(kuò)展等場(chǎng)景 將以不

    2024年02月05日
    瀏覽(59)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包