springboot+druid+mybatisplus使用注解整合配置多數據源


dynamic-datasource完美解決這件事,只需要添加注解即可。

 

步驟總結:

1.加入依賴

2.yml配置數據源,配置默認數據庫

3.啟動類添加(exclude = DruidDataSourceAutoConfigure.class)

4.Mapper接口添加@DS注解

 

紅色標記部分為重點! 

 

 主要依賴包

  • spring-boot-starter-web
  • mybatis-plus-boot-starter
  • dynamic-datasource-spring-boot-starter # 配置動態數據源
  • druid-spring-boot-starter # 阿里的數據庫連接池
  • mysql-connector-java
  • lombok

pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-parent</artifactId>
       <version>2.1.9.RELEASE</version>
       <relativePath/> <!-- lookup parent from repository -->
   </parent>
   <groupId>com.example</groupId>
   <artifactId>mutipledatasource2</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <name>mutipledatasource2</name>
   <description>Demo project for Spring Boot</description>

   <properties>
       <java.version>1.8</java.version>
   </properties>

   <dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>com.baomidou</groupId>
           <artifactId>mybatis-plus-boot-starter</artifactId>
           <version>3.2.0</version>
       </dependency>
       <dependency>
           <groupId>com.baomidou</groupId>
           <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
           <version>2.5.6</version>
       </dependency>
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <scope>runtime</scope>
       </dependency>
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>druid-spring-boot-starter</artifactId>
           <version>1.1.20</version>
       </dependency>
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <optional>true</optional>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
       </dependency>
   </dependencies>

   <build>
       <plugins>
           <plugin>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-maven-plugin</artifactId>
           </plugin>
       </plugins>
   </build>

   <profiles>
       <profile>
           <id>local1</id>
           <properties>
               <profileActive>local1</profileActive>
           </properties>
           <activation>
               <activeByDefault>true</activeByDefault>
           </activation>
       </profile>
       <profile>
           <id>local2</id>
           <properties>
               <profileActive>local2</profileActive>
           </properties>
       </profile>
   </profiles>
</project>

 

application.yml 配置文件:

server:
  port: 8080
spring:
  datasource:
    dynamic:
      primary: db1 # 配置默認數據庫
      datasource:
        db1: # 數據源1配置mysql
          url: jdbc:mysql://localhost:3306/db1?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        db2: # 數據源2配置mysql
          url: jdbc:mysql://localhost:3306/db2?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        db3: # 數據源3配置oracle
          type: com.alibaba.druid.pool.DruidDataSource
          platform: oracle
          driver-class-name: oracle.jdbc.driver.OracleDriver
          url: jdbc:oracle:thin:@127.0.0.1:8081:orcl
          username: business
          password: business
          initialSize: 5
          minIdle: 5
          maxActive: 20
          maxWait: 60000
          timeBetweenEvictionRunsMillis: 60000
          minEvictableIdleTimeMillis: 300000
          validationQuery: SELECT 1 FROM DUAL
          testWhileIdle: true
          testOnBorrow: false
          testOnReturn: false
          filters: stat,wall,log4j
          logSlowSql: true
      durid:
        initial-size: 1
        max-active: 20
        min-idle: 1
        max-wait: 60000
  autoconfigure:
    exclude:  com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid配置

 

 

DruidDataSourceAutoConfigure會注入一個DataSourceWrapper,其會在原生的spring.datasource下找 url, username, password 等。動態數據源 URL 等配置是在 dynamic 下,因此需要排除,否則會報錯。排除方式有兩種,一種是上述配置文件排除,還有一種可以在項目啟動類排除:

@SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class)
public class Application {
  public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
  }
}

 

給使用非默認數據源添加注解@DS

@DS 可以注解在方法上和類上,同時存在方法注解優先於類上注解。
注解在 service 實現或 mapper 接口方法上,不要同時在 service 和 mapper 注解。

Mapper接口類注解:

@DS("db2") 
public interface UserMapper extends BaseMapper<User> { }

Service實現類注解:

@Service 
@DS("db2") 
public class ModelServiceImpl extends ServiceImpl<ModelMapper, Model> implements IModelService {}

 

Mapper接口方法中:

不在類上注解,在方法中注解,可實現一個類調用不同的數據庫。

@Mapper
public interface UserMapper extends BaseMapper<User> {

// 調用默認數據庫 在yml配置好默認庫后 @DS("db1") 可寫可不寫 
List<Map<String,Object>> getData();

@Select("SELECT * FROM user") 
// 調用配置的第二個數據庫
@DS("db2") 
List<User> selectAll();

}

 

如果想完全去XML化,那就在dao接口中加上@Select等標簽即可,再加上語句就行了,不用xml也可以,根據自己習慣。

 

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM