Springboot+MybatisPlus 多数据源

时间:2025-04-24 08:28:03

1.配置多数据源后需要注意的地方

2.配置说明

目录

1.配置多数据源后需要注意的地方

2.配置说明


多数据源的实现方法比较多,基于springboot和mybatis的情况下,有基于AOP进行动态数据源配置的实现,也有直接通过配置不同的SqlSessionFactory去扫描不同目录去实现,也有通过dynamic-datasource-spring-boot-starter去实现。此外,还有通过各种第三方开源组件例如ShardingSphere实现的多数据源配置。本文着重介绍通过不同的SqlSessionFactory去实现多数据源配置。

1.配置多数据源后需要注意的地方

Springboot配置MybatisPlus(或Mybaits)多数据源后,常见的功能使用可能需要关注几个地方。

1.1数据源配置变化

eg:

单数据源 多数据源
数据源url
-url

...

1.2 分页问题

使用多数据源后,分页可能会失效,这个时候需要重新往SqlSessionFactory注册分页拦截器。从MyBatis-Plus 3.4.0开始,不再使用旧版本的PaginationInterceptor ,而是使用MybatisPlusInterceptor。

首先配置分页拦截器Bean

import ;
import ;
import ;
import ;
import ;

/**
 * 
 * @Description // 多数据源配置时,多种配置会失效。
 * 例如mybatisplus分页插件、数据库字段下换线自动转驼峰格式失效
 * @Date 2023/5/10
 **/
@Configuration
public class MyBatisPlusConfig {

    /**
     * mybatis-plus分页插件
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 向MyBatis-Plus的过滤器链中添加分页拦截器,需要设置数据库类型(主要用于分页方言)
        (new PaginationInnerInterceptor());
        return interceptor;
    }
}

然后将分页拦截器配置到SqlSessionFactory

import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;

import ;
import ;

/**
 * @Author wengguochao@
 * @Description // 配置mybatis的SessionFactory和SessionTemplate
 * @Date 2023/5/10
 **/
@Configuration
@MapperScan(value = ".db1",sqlSessionFactoryRef = "sqlSessionFactoryBeanOne")
public class MybatisConfigOne {

    @Resource
    @Qualifier("dsOne")
    DataSource dsOne;

    @Resource
    private MybatisPlusInterceptor mybatisPlusInterceptor;

    @Bean
    SqlSessionFactory sqlSessionFactoryBeanOne() throws Exception {

        MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        (dsOne);
        (new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/**/*.xml"));

        // 多数据源控制台打印sql,配置任意一个数据源即可
        MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
        ();
        (mybatisConfiguration);

        // 设置分页插件
        (mybatisPlusInterceptor);

        return ();
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate1() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryBeanOne());
    }
}

1.3 IDEA控制台不打印Sql日志

多数据源需要手动配置SQL打印,选择任意一个SqlSessionFactoryBean注册日志打印即可。代码请参考1.2代码块

2.配置说明

Maven配置部分说明:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0" xmlns:xsi="http:///2001/XMLSchema-instance"
	xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId></groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.11</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId></groupId>
	<artifactId>springboottest</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboottest</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<>8</>
	</properties>
	<dependencies>
		<dependency>
			<groupId></groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	

		<!--MybatisPlus引入-->
		<dependency>
			<groupId></groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.5.3</version>
		</dependency>

		<dependency>
			<groupId></groupId>
			<artifactId>mysql-connector-j</artifactId>
			<version>8.0.31</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId></groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId></groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId></groupId>
			<artifactId>hutool-all</artifactId>
			<version>5.8.16</version>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId></groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId></groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>

	</build>


</project>

2.1配置DataSource


import ;
import ;
import ;
import ;
import ;

import ;

/**
 * @Author wengguochao@
 * @Description //
 * @Date 2023/5/10
 **/
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("")
    public DataSource dsOne(){
        return ().type().build();
//        return ().build();
    }

    @Bean
    @ConfigurationProperties("")
    public DataSource dsTwo(){
//        return ().type().build();
        return ().build();
    }


}

2.2 Springboot配置文件配置数据源信息

#mybatis多数据源
-url=jdbc:mysql://.:3339/testSys?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
=root
=123456
-class-name=

#mybatis多数据源[ 多数据源源需要注意url和driver-class与单数据源的区别]
-url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
#-url=jdbc:mysql://.:3340/testSys?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
=root
=123456
-class-name=

2.3配置SqlSessionFactoryBean、分页插件

import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;

import ;
import ;

/**
 * @Author wengguochao@
 * @Description // 配置mybatis的SessionFactory和SessionTemplate
 * @Date 2023/5/10
 **/
@Configuration
@MapperScan(value = ".db1",sqlSessionFactoryRef = "sqlSessionFactoryBeanOne")
public class MybatisConfigOne {

    @Resource
    @Qualifier("dsOne")
    DataSource dsOne;

    @Resource
    private MybatisPlusInterceptor mybatisPlusInterceptor;

    @Bean
    SqlSessionFactory sqlSessionFactoryBeanOne() throws Exception {

        MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        (dsOne);
        (new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db1/**/*.xml"));

        // 多数据源控制台打印sql,配置任意一个数据源即可
        MybatisConfiguration mybatisConfiguration = new MybatisConfiguration();
        ();
        (mybatisConfiguration);

        // 设置分页插件
        (mybatisPlusInterceptor);

        return ();
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate1() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryBeanOne());
    }
}



import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;

import ;
import ;

/**
 * @Author wengguochao@
 * @Description // 配置mybatis的SessionFactory和SessionTemplate
 * @Date 2023/5/10
 **/
@Configuration
@MapperScan(value = ".db2",sqlSessionFactoryRef = "sqlSessionFactoryBeanTwo")
public class MybatisConfigTwo {

    @Resource
    @Qualifier("dsTwo")
    DataSource dsTwo;

    @Resource
    private MybatisPlusInterceptor mybatisPlusInterceptor;

    @Bean
    SqlSessionFactory sqlSessionFactoryBeanTwo() throws Exception {
        MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        (dsTwo);
        (new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/**/*.xml"));

        // 设置分页插件
        (mybatisPlusInterceptor);
        return ();
    }

    @Bean
    SqlSessionTemplate sqlSessionTemplate2() throws Exception {
        return new SqlSessionTemplate(sqlSessionFactoryBeanTwo());
    }
}



import ;
import ;
import ;
import ;
import ;

/**
 * @Author wengguochao@
 * @Description // 多数据源配置时,多种配置会失效。
 * 例如mybatisplus分页插件、数据库字段下换线自动转驼峰格式失效
 * @Date 2023/5/10
 **/
@Configuration
public class MyBatisPlusConfig {

    /**
     * mybatis-plus分页插件
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 向MyBatis-Plus的过滤器链中添加分页拦截器,需要设置数据库类型(主要用于分页方言)
        (new PaginationInnerInterceptor());
        return interceptor;
    }
}

至此,基本配置就完成了。需要注意的是,SqlSessionFactoryBean创建的时候,指定了扫描指定的目录,这个需要自行调整即可。至于Controller、Service、Dao层,就跟平时单数据源那样使用即可,比较简单,此处不做进一步论述。