Spring BootMybatis 实现动态数据源

动态数据源在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库。又比如业务A要访问A数据库,业务B要访问B数据库等,都可以使用动态数据源方案进行解决。接下来,我们就来讲解如何实现动态数据源,以及在过程中剖析动态数据源背后的实现原理。实现案例本教程案例基于SpringBoot Mybatis MySQL实现。数据库设计首先需要安装...

Spring BootMybatis 实现动态数据源

动态数据源

在很多具体应用场景的时候,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库。又比如业务A要访问A数据库,业务B要访问B数据库等,都可以使用动态数据源方案进行解决。接下来,我们就来讲解如何实现动态数据源,以及在过程中剖析动态数据源背后的实现原理。

实现案例

本教程案例基于 Spring BootMybatisMySQL 实现。

数据库设计

首先需要安装好MySQL数据库,新建数据库 master,slave,分别创建用户表,用来测试数据源,SQL脚本如下。

-- ------------------------------------------------------  用户-- ------------------------------------------------------  Table structure for `sys_user`-- ----------------------------------------------------DROP TABLE IF EXISTS `sys_user`;CREATE TABLE `sys_user` (  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',  `name` varchar(50) NOT NULL COMMENT '用户名',  `password` varchar(100) COMMENT '密码',  `salt` varchar(40) COMMENT '盐',  `email` varchar(100) COMMENT '邮箱',  `mobile` varchar(100) COMMENT '手机号',  `status` tinyint COMMENT '状态  0:禁用1:正常',  `dept_id` bigint(20) COMMENT '机构ID',  `create_by` varchar(50) COMMENT '创建人',  `create_time` datetime COMMENT '创建时间',  `last_update_by` varchar(50) COMMENT '更新人',  `last_update_time` datetime COMMENT '更新时间',  `del_flag` tinyint DEFAULT 0 COMMENT '是否删除  -1:已删除  0:正常',  PRIMARY KEY (`id`),  UNIQUE INDEX (`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户';

新建工程

新建一个Spring Boot工程,最终代码结构如下。

添加依赖

添加Spring Boot,Spring Aop,Mybatis,MySQL,Swagger相关依赖。Swagger方便用来测试接口。

pom.xml

<?xml version="1.0" encoding="UTF-8"?><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>top.ivan.demo</groupId> <artifactId>springboot-dynamic-datasource</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-dynamic-datasource</name> <description>Demo project for Spring Boot</description> <parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-parent</artifactId>  <version>2.0.4.RELEASE</version>  <relativePath/> <!-- lookup parent from repository --> </parent> <properties>  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  <java.version>1.8</java.version>  <mybatis.spring.version>1.3.2</mybatis.spring.version>  <swagger.version>2.8.0</swagger.version> </properties> <dependencies>  <!-- spring boot -->  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>  </dependency>  <!-- spring aop -->  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>  </dependency>  <!-- mybatis -->  <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.version}</version>  </dependency>  <!-- mysql -->  <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>  </dependency>  <!-- swagger -->  <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>${swagger.version}</version>  </dependency>  <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>${swagger.version}</version>  </dependency> </dependencies> <build>  <plugins><plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId></plugin>  </plugins> </build></project>

配置文件

修改配置文件,添加两个数据源,可以是同一个主机地址的两个数据库master,slave,也可是两个不同主机的地址,根据实际情况配置。

application.yml

spring:  datasource: master:driver-class-name: com.mysql.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSourcejdbcUrl: jdbc:mysql://127.0.0.1:3306/master?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8username: rootpassword: 123 slave:driver-class-name: com.mysql.jdbc.Drivertype: com.zaxxer.hikari.HikariDataSourcejdbcUrl: jdbc:mysql://127.0.0.1:3306/slave?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8username: rootpassword: 123

启动类

启动类添加exclude = {DataSourceAutoConfiguration.class}, 以禁用数据源默认自动配置。

数据源默认自动配置会读取 spring.datasource.* 的属性创建数据源,所以要禁用以进行定制。

@ComponentScan(basePackages = "com.louis.springboot") 是扫描范围,都知道不用多说。

DynamicDatasourceApplication.java

package com.louis.springboot.dynamic.datasource;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;import org.springframework.context.annotation.ComponentScan;/** * 启动器 * @author Louis * @date Oct 31, 2018 */@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) // 禁用数据源自动配置@ComponentScan(basePackages = "com.louis.springboot")public class DynamicDatasourceApplication { public static void main(String[] args) {  SpringApplication.run(DynamicDatasourceApplication.class, args); }}

数据源配置类

创建一个数据源配置类,主要做以下几件事情:

1. 配置 dao,model,xml mapper文件的扫描路径。

2. 注入数据源配置属性,创建master、slave

源文地址:http://www.guoxiongfei.cn/cntech/3045.html