主题: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
输出结果如下:
上述打印的数据分别来自对应的库。
下载源代码,请点击我直接下载。
示例结束 ... ...