git地址:multi-data-source: springboot配置多数据源
1.多数据源
CREATE DATABASE `data_source_one`;
USE `data_source_one`;
CREATE TABLE `user` (
`id` INT (11),
`name` VARCHAR (33)
);INSERT INTO `user` VALUE(1,'许仙');
CREATE DATABASE `data_source_two`;
USE `data_source_two`;
CREATE TABLE `user` (
`id` INT (11),
`name` VARCHAR (33)
);INSERT INTO `user` VALUE(1,'白素贞');
2.maven依赖
<parent> <artifactId>spring-boot-starter-parent</artifactId> <groupId>org.springframework.boot</groupId> <version>2.3.8.RELEASE</version> </parent> <properties> <java.version>1.8</java.version> <mysql.version>5.1.47</mysql.version> <druid.version>1.1.20</druid.version> <dynamic.datasource.version>2.5.6</dynamic.datasource.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>io.easybest</groupId> <artifactId>spring-data-mybatis-boot-starter</artifactId> <version>2.0.1.RELEASE</version> </dependency> <!--多数据源依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>${dynamic.datasource.version}</version> </dependency> <!--mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!--druid连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
3.application.yml
server: port: 8088 spring: datasource: dynamic: primary: sourceOne # 配置默认数据库 datasource: sourceOne: # 数据源1配置 url: jdbc:mysql://127.0.0.1:3306/data_source_one?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver sourceTwo: # 数据源2配置 url: jdbc:mysql://127.0.0.1:3306/data_source_two?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false username: root password: root driver-class-name: com.mysql.jdbc.Driver durid: initial-size: 1 max-active: 20 min-idle: 1 max-wait: 60000 autoconfigure: exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 去除druid配置,非常重要
4.启动类
import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @MapperScan("com.qq.mapper") public class MultiSourceApplication { public static void main(String[] args) { SpringApplication.run(MultiSourceApplication.class, args); } }
5.数据库映射对象
import lombok.Data; @Data public class User { private Integer id; private String name; }
6.mapper
# mapper1
import com.qq.entity.User; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; import java.util.List; //默认使用sourceOne @Repository public interface SourceOneMapper { @Select("select * from user") List<User> findAll(); }#mapper2
import com.baomidou.dynamic.datasource.annotation.DS; import com.qq.entity.User; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; import java.util.List; //@DS指定数据源 @DS("sourceTwo") @Repository public interface SourceTwoMapper { @Select("select * from user") List<User> findAll(); }
7.service
#自己写个SourceService用于实现
import com.qq.entity.User;
import com.qq.mapper.SourceOneMapper;
import com.qq.mapper.SourceTwoMapper;
import com.qq.service.SourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
public class SourceServiceImpl implements SourceService {
@Autowired
private SourceOneMapper sourceOneMapper;
@Autowired
private SourceTwoMapper sourceTwoMapper;
@Override
public List<User> findAll() {
List<User> list = new ArrayList<>();
//数据合并
List<User> sourceOneList = sourceOneMapper.findAll();
list.addAll(sourceOneList);
List<User> sourceTwoList = sourceTwoMapper.findAll();
list.addAll(sourceTwoList);
return list;
}
@Override
public List<User> findSourceOne() {
return sourceOneMapper.findAll();
}
@Override
public List<User> findSourceTwo() {
return sourceTwoMapper.findAll();
}
}
8.controller
import com.qq.entity.User; import com.qq.service.SourceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class SourceController { @Autowired private SourceService sourceService; @GetMapping("/sourceAll") public List<User> findAll(){ return sourceService.findAll(); } @GetMapping("/sourceOne") public List<User> findSourceOne(){ return sourceService.findSourceOne(); } @GetMapping("/sourceTwo") public List<User> findSourceTwo(){ return sourceService.findSourceTwo(); } }
9.执行启动类,访问接口