Springboot 之 Mybatis-plus 多數據源

簡介

Mybatis-puls 多數據源的使用,採用的是官方提供的dynamic-datasource-spring-boot-starter包的 @DS 註解,具體可以參考官網:

//gitee.com/baomidou/dynamic-datasource-spring-boot-starter

pom.xml文件引入如下依賴

主要引入dynamic-datasource-spring-boot-starter

<project xmlns="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.olive</groupId>
	<artifactId>mybatis-plus-multip-datasource</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>mybatis-multip-datasource</name>
	<url>//maven.apache.org</url>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.14</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>8</maven.compiler.source>
		<maven.compiler.target>8</maven.compiler.target>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
		
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
			<version>3.5.2</version>
		</dependency>
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.5.2</version>
		</dependency>
	</dependencies>
</project>

配置兩個數據源

分別為第一個主數據源(primary),第二數據源(slave_1),具體配置如下:

# 基本配置
server:
  port: 8080

# 資料庫
spring:
  datasource:
    dynamic:
      primary: master #設置默認的數據源或者數據源組,默認值即為master
      strict: false #嚴格匹配數據源,默認false. true未匹配到指定數據源時拋異常,false使用默認數據源
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3306/db01?characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver # 3.2.0開始支援SPI可省略此配置
        slave_1:
          url: jdbc:mysql://127.0.0.1:3306/crm72?characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  mapper-locations: mapper/*.xml
  type-aliases-package: com.olive.entity
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

  jackson:
    serialization:
      indent-output: true

創建學生與老師實體類

學生實體類

package com.olive.entity;

import java.io.Serializable;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@TableName("t_student")
@Data
public class StudentDO implements Serializable{

    @TableId(value="id", type = IdType.AUTO)
    private Long id;

    @TableField("user_name")
    private String name;

    @TableField("sex")
    private int sex;

    @TableField("grade")
    private String grade;
}

老師實體類

package com.olive.entity;

import java.io.Serializable;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("t_teacher")
public class TeacherDO implements Serializable {

	@TableId(value = "id", type = IdType.AUTO)

	private Long id;

	@TableField("user_name")
	private String name;

	@TableField("sex")
	private int sex;

	@TableField("office")
	private String office;
}

資料庫持久類

StudentMapper持久類

package com.olive.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.olive.entity.StudentDO;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface StudentMapper extends BaseMapper<StudentDO> {

}

TeacherMapper持久類

package com.olive.mapper;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.olive.entity.TeacherDO;
import org.apache.ibatis.annotations.Mapper;

@DS("slave_1")
@Mapper
public interface TeacherMapper extends BaseMapper<TeacherDO> {

}

以上,兩個持久類的實現都是繼承BaseMapper基類,該類提供了基本的增刪改查的方法;要注意的是,TeacherMapper 類使用了@DS("slave_1")指定了數據源;而StudentMapper沒有指定,使用的是默認的數據源。

服務類的實現

先定義操作學生和老師的兩個介面

StudentService介面

package com.olive.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.olive.entity.StudentDO;

public interface StudentService extends IService<StudentDO> {
}

TeacherService介面

package com.olive.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.olive.entity.TeacherDO;

public interface TeacherService extends IService<TeacherDO> {
}

再定義介面的實現類

StudentServiceImpl類

package com.olive.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.olive.entity.StudentDO;
import com.olive.mapper.StudentMapper;
import com.olive.service.StudentService;
import org.springframework.stereotype.Service;

@Service
public class StudentServiceImpl extends ServiceImpl<StudentMapper, StudentDO>
        implements StudentService {
}

TeacherServiceImpl類

package com.olive.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.olive.entity.TeacherDO;
import com.olive.mapper.TeacherMapper;
import com.olive.service.TeacherService;
import org.springframework.stereotype.Service;

@Service
public class TeacherServiceImpl extends ServiceImpl<TeacherMapper, TeacherDO>
        implements TeacherService {

}

觀察介面定義和介面實現,套路非常標準。都是實現和繼承Mybatis-Plus提供的標準介面和基類

創建springboot引導類

package com.olive;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@MapperScan("com.olive.mapper")
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }

}

測試

package com.olive;

import com.olive.service.StudentService;
import com.olive.service.TeacherService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.olive.entity.StudentDO;
import com.olive.entity.TeacherDO;

@SpringBootTest
public class MybatisPlusTest {

	@Autowired
	StudentService studentService;

	@Autowired
	TeacherService teacherService;

	@Test
	public void userSave() {
		StudentDO studentDO = new StudentDO();
		studentDO.setName("BUG弄潮兒");
		studentDO.setSex(1);
		studentDO.setGrade("一年級");
		studentService.save(studentDO);

		TeacherDO teacherDO = new TeacherDO();
		teacherDO.setName("Java樂園");
		teacherDO.setSex(2);
		teacherDO.setOffice("語文");
		teacherService.save(teacherDO);
	}
}