如何在Java SpringBoot項(xiàng)目中配置動(dòng)態(tài)數(shù)據(jù)源你知道嗎
在我們工作中涉及到一些場(chǎng)景需要我們配置多數(shù)據(jù)源的操作,之前來說我們配置數(shù)據(jù)源需要寫繁瑣的配置類來配置我們的數(shù)據(jù)源,哪個(gè)是默認(rèn)數(shù)據(jù)源等等,而現(xiàn)在我們可以使用“苞米豆”為我們提供的提供的第三方工具,只需要簡(jiǎn)單配置就可以實(shí)現(xiàn)多數(shù)據(jù)源之間的靈活切換了!
首先需要引入第三方依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.3.5</version>
</dependency>
只需要在配置文件中按照如下配置
spring:
datasource:
dynamic:
primary: master #設(shè)置默認(rèn)的數(shù)據(jù)源或者數(shù)據(jù)源組,默認(rèn)值即為master
strict: false #嚴(yán)格匹配數(shù)據(jù)源,默認(rèn)false. true未匹配到指定數(shù)據(jù)源時(shí)拋異常,false使用默認(rèn)數(shù)據(jù)源
datasource:
master: # 名稱可以自己定義
url: jdbc:mysql://localhost:3306/students?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slave: # 名稱可以自己定義
url: jdbc:mysql://localhost:3306/teachers?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
創(chuàng)建如下兩個(gè)數(shù)據(jù)庫



entity
@Data
public class Student implements Serializable {
/**
* 主鍵
*/
private Integer id;
/**
* 姓名
*/
private String name;
/**
* 年齡
*/
private Integer age;
/**
* 性別
*/
private String sex;
private static final long serialVersionUID = 1L;
}
@Data
public class Teacher implements Serializable {
/**
* 主鍵
*/
private Integer id;
/**
* 姓名
*/
private String name;
/**
* 年齡
*/
private Integer age;
/**
* 學(xué)科
*/
private String subject;
private static final long serialVersionUID = 1L;
}
mapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mysql.mapper.StudentDao">
<select id="findAllStudent" resultType="com.example.demo.entity.Student">
select *
from student;
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mysql.mapper.TeacherDao">
<select id="findAllTeacher" resultType="com.example.demo.entity.Teacher">
select *
from teacher;
</select>
</mapper>
mapper層
@Mapper
public interface StudentDao {
List<Student> findAllStudent();
}
@Mapper
public interface TeacherDao {
List<Teacher> findAllTeacher();
}
Service層
@Service
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
@Override
public List<Student> findAllStudent() {
return studentDao.findAllStudent();
}
@Service
@DS("slave")
public class TeacherServiceImpl implements TeacherService {
@Autowired
private TeacherDao teacherDao;
@Override
public List<Teacher> findAllTeacher() {
return teacherDao.findAllTeacher();
}
}
下面是兩個(gè)測(cè)試方法
@RestController
public class TestController {
@Autowired
private StudentService studentService;
@Autowired
private TeacherService teacherService;
/**
* 查詢所有學(xué)生信息
*
* @return Student
*/
@GetMapping("/test/1")
public List<Student> findAllStudent() {
return studentService.findAllStudent();
}
/**
* 查詢所有教師信息
*
* @return Teacher
*/
@GetMapping("/test/2")
public List<Teacher> findAllTeacher() {
return teacherService.findAllTeacher();
}
}
需要注意的一點(diǎn)是mapper和mapper.xml路徑需一致否自會(huì)導(dǎo)致編譯后找不到xml文件


下面可以來看一下測(cè)試結(jié)果:
查詢學(xué)生:

查詢老師:

此時(shí)不管是學(xué)生還是老師的信息是都可以查詢出來的,這就全靠TeacherServiceImpl中使用的DS(“slave”)指定了數(shù)據(jù)源,假如說我們把注解去掉再來一次試試,可以看到請(qǐng)求報(bào)錯(cuò)提示students庫中沒有teacher這個(gè)表,所以說在我們沒有指定數(shù)據(jù)源的時(shí)候,它是會(huì)自動(dòng)去匹配默認(rèn)的數(shù)據(jù)源來查詢!

- SpringBoot動(dòng)態(tài)數(shù)據(jù)源連接測(cè)試的操作詳解
- SpringBoot實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的方法總結(jié)
- springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源)
- SpringBoot中動(dòng)態(tài)數(shù)據(jù)源是實(shí)現(xiàn)與用途
- Springboot實(shí)現(xiàn)根據(jù)用戶ID切換動(dòng)態(tài)數(shù)據(jù)源
- 詳解SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換
- SpringBoot Mybatis動(dòng)態(tài)數(shù)據(jù)源切換方案實(shí)現(xiàn)過程
- 通過springboot+mybatis+druid配置動(dòng)態(tài)數(shù)據(jù)源
- SpringBoot整合MyBatisPlus配置動(dòng)態(tài)數(shù)據(jù)源的方法
- springboot 動(dòng)態(tài)數(shù)據(jù)源的實(shí)現(xiàn)方法(Mybatis+Druid)
- SpringBoot實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的項(xiàng)目實(shí)踐
相關(guān)文章
java經(jīng)典問題:連個(gè)字符串互為回環(huán)變位
連個(gè)字符串互為回環(huán)變位經(jīng)常出現(xiàn)在java程序員面試中,這個(gè)是考驗(yàn)程序員的解題思路和方法的最經(jīng)典的一題,小編為大家詳細(xì)分析一下,一起來學(xué)習(xí)吧。2017-11-11
如何將IDEA打成jar包并在windows后臺(tái)運(yùn)行
在本篇文章里小編給大家分享的是關(guān)于如何將IDEA打成jar包并在windows后臺(tái)運(yùn)行知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)參考下。2019-08-08
Spring中11個(gè)最常用的擴(kuò)展點(diǎn)總結(jié),你知道幾個(gè)
我們知道IOC(控制反轉(zhuǎn))和AOP(面向切面編程)是spring的基石,除此之外spring的擴(kuò)展能力非常強(qiáng),下面這篇文章主要給大家介紹了關(guān)于Spring中11個(gè)最常用的擴(kuò)展點(diǎn)的相關(guān)資料,需要的朋友可以參考下2022-12-12
Java基于socket實(shí)現(xiàn)的客戶端和服務(wù)端通信功能完整實(shí)例
這篇文章主要介紹了Java基于socket實(shí)現(xiàn)的客戶端和服務(wù)端通信功能,結(jié)合完整實(shí)例形式分析了Java使用socket建立客戶端與服務(wù)器端連接與通信功能,需要的朋友可以參考下2018-05-05

