SpringBoot:結合Mybatis plus 配置Mysql多數據源

主題:SpringBoot結合Mybatis plus 配置多數據源

示例:下面通過Mysql多個庫,各查詢一張表來演示。

1 整體工程結構,如下圖:

          

2 詳細類說明

2.1  創建Maven工程

  • pom.xml配置內容如下:
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.test.datasource</groupId>
	<artifactId>springboot-multy-datasource-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
	</parent>

	<properties>
		<java.version>1.8</java.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

		<shiro-spring.version>1.4.0</shiro-spring.version>
		<jedis.version>2.9.0</jedis.version>
		<druid.version>1.1.16</druid.version>
		<thymeleaf-extras-shiro.viersion>2.0.0</thymeleaf-extras-shiro.viersion>
	</properties>

	<dependencies>
		<!-- springboot core jar -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-autoconfigure</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-actuator</artifactId>
		</dependency>

		<!-- SpringBoot Test -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<!-- jackson-annotations -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-annotations</artifactId>
		</dependency>

		<!-- Mysql DB -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.0-RELEASE</version>
		</dependency>

		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
			<version>2.5.7</version>
		</dependency>

		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>1.2.10</version>
		</dependency>

	</dependencies>
</project>

配置文件 application.yml 內容如下:

server:
  port: 7090

logging:
  level:
    com.datasource: debug

mybatis:
  executor-type: simple

spring:
  datasource:
    hikari:
      minimum-idle: 4
      maximum-pool-size: 16
      connection-timeout: 10000
      idle-timeout: 30000
      connection-init-sql: set names utf8mb4
    dynamic:
      primary: test1
      datasource:
        test1: 
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test_1?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
          username: root
          password: root
        test2: 
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test_2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
          username: root
          password: root
        test3: 
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://127.0.0.1:3306/test_3?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
          username: root
          password: root

mybatis-plus: 
  type-aliases-package: com.datasource.pojo
  mapper-locations: classpath*:com/datasource/mapper/**/*Mapper.xml
  configuration:
    map-underscore-to-camel-case: true

pagehelper: 
  reasonable: true
  support-methods-arguments: true
  params: count=countSql
  row-bounds-with-count: true
  helper-dialect: mysql
  

2.2 具體類說明

  • Controller 層: MultyController
package com.datasource.controller;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.datasource.pojo.SysLog;
import com.datasource.service.MultyService;

@RestController
@RequestMapping("/multy")
public class MultyController {

	protected Logger logger = LoggerFactory.getLogger(this.getClass());

	@Autowired
	private MultyService multyService;

	@GetMapping("/test")
	public String test() {
		List<SysLog> test01 = multyService.test01();
		logger.info("test01 庫 -> {}", test01.toString());

		List<SysLog> test02 = multyService.test02();
		logger.info("test02 庫 -> {}", test02.toString());

		List<SysLog> test03 = multyService.test03();
		logger.info("test03 庫 -> {}", test03.toString());
		return null;
	}
}
  • Service層: MultyService 接口
package com.datasource.service;

import java.util.List;

import com.datasource.pojo.SysLog;

public interface MultyService {

	List<SysLog> test01();

	List<SysLog> test02();

	List<SysLog> test03();
}

Service層:MultyServiceImpl實現類

package com.datasource.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.datasource.mapper.MultMapperTest01;
import com.datasource.mapper.MultMapperTest02;
import com.datasource.mapper.MultMapperTest03;
import com.datasource.pojo.SysLog;
import com.datasource.service.MultyService;

@Service
public class MultyServiceImpl implements MultyService {

	@Autowired
	private MultMapperTest01 test01;

	@Autowired
	private MultMapperTest02 test02;

	@Autowired
	private MultMapperTest03 test03;

	public List<SysLog> test01() {
		return test01.selectList(new QueryWrapper<>());
	}

	public List<SysLog> test02() {
		return test02.selectList(new QueryWrapper<>());
	}

	public List<SysLog> test03() {
		return test03.selectList(new QueryWrapper<>());
	}

}
  • Mapper層: 創建三個庫對應的Mapper接口類:

MultMapperTest01:對應測試庫1

package com.datasource.mapper;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.datasource.pojo.SysLog;

@DS(value = "test1")
public interface MultMapperTest01 extends BaseMapper<SysLog> {

}

MultMapperTest02:對應測試庫2

package com.datasource.mapper;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.datasource.pojo.SysLog;

@DS(value = "test2")
public interface MultMapperTest02 extends BaseMapper<SysLog> {

}

MultMapperTest03:對應測試庫3

package com.datasource.mapper;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.datasource.pojo.SysLog;

@DS(value = "test3")
public interface MultMapperTest03 extends BaseMapper<SysLog> {

}
  • pojo層:實體類

SysLog:實體類

package com.datasource.pojo;

import java.io.Serializable;

import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;

@TableName("CBS_SYS_LOG")
public class SysLog implements Serializable {

	private static final long serialVersionUID = 5313820461668903640L;
	
	/**
	 * 流水號自增
	 */
	private long id;
	
	/**
	 * 日誌類型
	 */
	private String type;
	
	/**
	 * 操作日期 格式 YYYY-MM-DD
	 */
	private String operDate;
	
	/**
	 * 操作時間 (格式 HH:MM:SS)
	 */
	private String operTime;
	
	/**
	 * 用戶ID
	 */
	private String userId;

	/**
	 * 用戶名
	 */
	private String userName;
	
	/**
	 * 操作菜單名稱
	 */
	private String menuName;

	/**
	 * 操作內容
	 */
	private String operation;

	/**
	 * 請求方法
	 */
	private String method;

	/**
	 * 請求參數
	 */
	@JsonIgnore
	private String params;
	
	/**
	 * 請求結果
	 */
	@JsonIgnore
	private String result;

	/**
	 * IP地址
	 */
	private String ipAddr;

	/**
	 * 登錄設備
	 */
	private String device;
	
	/**
	 * 請求結果
	 */
	@JsonIgnore
	private int delFlag;

	public SysLog() {
		super();
	}

	public SysLog(String type, String operDate, String operTime, String userId, String userName,
			String menuName, String operation, String method, String params, String result, String ipAddr, String device ) {
		super();
		this.type = type;
		this.operDate = operDate;
		this.operTime = operTime;
		this.userId = userId;
		this.userName = userName;
		this.menuName = menuName;
		this.operation = operation;
		this.method = method;
		this.params = params;
		this.result = result;
		this.ipAddr = ipAddr;
		this.device = device;
		this.delFlag = 1;
	}

	public String getResult() {
		return result;
	}

	public void setResult(String result) {
		this.result = result;
	}

	public String getDevice() {
		return device;
	}

	public void setDevice(String device) {
		this.device = device;
	}

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getOperDate() {
		return operDate;
	}

	public void setOperDate(String operDate) {
		this.operDate = operDate;
	}

	public String getOperTime() {
		return operTime;
	}

	public void setOperTime(String operTime) {
		this.operTime = operTime;
	}

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getMenuName() {
		return menuName;
	}

	public void setMenuName(String menuName) {
		this.menuName = menuName;
	}

	public String getOperation() {
		return operation;
	}

	public void setOperation(String operation) {
		this.operation = operation;
	}

	public String getMethod() {
		return method;
	}

	public void setMethod(String method) {
		this.method = method;
	}

	public String getParams() {
		return params;
	}

	public void setParams(String params) {
		this.params = params;
	}

	public String getIpAddr() {
		return ipAddr;
	}

	public void setIpAddr(String ipAddr) {
		this.ipAddr = ipAddr;
	}

	public int getDelFlag() {
		return delFlag;
	}

	public void setDelFlag(int delFlag) {
		this.delFlag = delFlag;
	}

	@Override
	public String toString() {
		return "SysLog [id=" + id + ", type=" + type + ", operDate=" + operDate + ", operTime=" + operTime + ", userId="
				+ userId + ", userName=" + userName + ", menuName=" + menuName + ", operation=" + operation
				+ ", method=" + method + ", params=" + params + ", result=" + result + ", ipAddr=" + ipAddr
				+ ", device=" + device + ", toString()=" + super.toString() + "]";
	}

}
  • 啓動類:MultyApplication
package com.datasource;

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

/**
 * @Description 自動化測試啓動主入口
 * @author CuiWW
 * @date 2019年10月18日
 */
@SpringBootApplication
@MapperScan(basePackages = "com.datasource.mapper")
public class MultyApplication {

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

特殊說明:其中註解 @MapperScan 需要精確的指定到 mapper 目錄, 如果Mapper有多個目錄,則此處要需要配置多個

示例:@MapperScan({"com.yqzl.cloud.auth.alog.mapper", "com.yqzl.cloud.auth.mapper", "com.yqzl.cloud.auth.base.mapper"})

原因:具體的*Mapper接口類並未不回 @Mapper 註解所致,個人習慣問題而已,只是需要注意下!

  • 附註:數據表結構
CREATE TABLE `cbs_sys_log` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID(無意義 流水號自增)',
  `TYPE` char(1) NOT NULL COMMENT '日誌類型(0-登錄日誌 1-操作日誌)',
  `OPER_DATE` varchar(10) NOT NULL COMMENT '操作日期(格式 YYYY-MM-DD)',
  `OPER_TIME` varchar(10) NOT NULL COMMENT '操作時間(格式 HH:MM:SS)',
  `USER_ID` varchar(40) NOT NULL COMMENT '用戶ID',
  `USER_NAME` varchar(80) NOT NULL COMMENT '用戶名',
  `MENU_NAME` varchar(50) DEFAULT NULL COMMENT '操作菜單名稱',
  `OPERATION` varchar(100) NOT NULL COMMENT '操作內容',
  `METHOD` varchar(200) NOT NULL COMMENT '請求方法',
  `PARAMS` longtext NOT NULL COMMENT '請求參數',
  `RESULT` longtext,
  `DEVICE` varchar(50) DEFAULT NULL COMMENT '登錄設備',
  `IP_ADDR` varchar(100) DEFAULT NULL COMMENT 'IP地址',
  `DEL_FLAG` int(11) NOT NULL COMMENT '邏輯刪除標記(0-刪除 1-正常 默認爲1)',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='系統日誌表';


INSERT INTO `test_1`.`cbs_sys_log` (`ID`, `TYPE`, `OPER_DATE`, `OPER_TIME`, `USER_ID`, `USER_NAME`, `MENU_NAME`, `OPERATION`, `METHOD`, `PARAMS`, `RESULT`, `DEVICE`, `IP_ADDR`, `DEL_FLAG`) 
VALUES ('1', '0', '2019-07-01', '18:22:32', 'admin', '超級管理員', '登錄', '登錄', '/auth/login', 'Admin []', NULL, 'PC', '0:0:0:0:0:0:0:1', '1');
INSERT INTO `test_2`.`cbs_sys_log` (`ID`, `TYPE`, `OPER_DATE`, `OPER_TIME`, `USER_ID`, `USER_NAME`, `MENU_NAME`, `OPERATION`, `METHOD`, `PARAMS`, `RESULT`, `DEVICE`, `IP_ADDR`, `DEL_FLAG`) 
VALUES ('2', '0', '2019-08-01', '18:22:32', 'admin', '超級管理員', '登錄', '登錄', '/auth/login', 'Admin []', NULL, 'PC', '0:0:0:0:0:0:0:1', '1');
INSERT INTO `test_3`.`cbs_sys_log` (`ID`, `TYPE`, `OPER_DATE`, `OPER_TIME`, `USER_ID`, `USER_NAME`, `MENU_NAME`, `OPERATION`, `METHOD`, `PARAMS`, `RESULT`, `DEVICE`, `IP_ADDR`, `DEL_FLAG`) 
VALUES ('3', '0', '2019-09-01', '18:22:32', 'admin', '超級管理員', '登錄', '登錄', '/auth/login', 'Admin []', NULL, 'PC', '0:0:0:0:0:0:0:1', '1');

執行啓動類,並在瀏覽器中輸入URL:

http://localhost:7090/multy/test

輸出結果如下:

上述打印的數據分別來自對應的庫。

下載源代碼,請點擊我直接下載。

示例結束 ... ...

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章