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

输出结果如下:

上述打印的数据分别来自对应的库。

下载源代码,请点击我直接下载。

示例结束 ... ...

 

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