主題: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
輸出結果如下:
上述打印的數據分別來自對應的庫。
下載源代碼,請點擊我直接下載。
示例結束 ... ...