注意:不是主从,只是简单的多数据源
下面是 mysql8和 sqlserver2016的多数据源的配置
maven
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.3</version> <!-- lookup parent from repository -->
<relativePath/>
</parent>
<properties>
<java.version>21</java.version>
<mysql.version>8.0.28</mysql.version>
<sqlserver.version>12.3.0.jre20-preview</sqlserver.version>
<mybatis-plus.version>3.5.5</mybatis-plus.version>
</properties>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>${sqlserver.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
yaml
spring:
datasource:
sys:
driver-class-name: com.mysql.cj.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/scanner_server?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&allowMultiQueries=true
username: root
password: xxx
sap:
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbcUrl: jdbc:sqlserver://localhost:1433;DatabaseName=TKDZY;encrypt=false;
username: sa
password: xxx
config
SysMapperConfig
package com.tk.scanner.server.config.mapper;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.tk.scanner.server.plugin.mybatis.handler.MyDataPermissionHandler;
import com.tk.scanner.server.plugin.mybatis.handler.MyMetaObjectHandler;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
*@author shen chen
*@Date 2024-03-04
*@Description
*/
@Configuration
@MapperScan(basePackages = {"com.tk.scanner.server.mapper.sys"}, sqlSessionTemplateRef = "sysSqlSessionTemplate")
public class SysMapperConfig {
@Bean(name = "sysDataSource")
@ConfigurationProperties(prefix = "spring.datasource.sys") // prefix值必须是application.properteis中对应属性的前缀
@Primary
public DataSource sysDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory sysSqlSessionFactory(@Qualifier("sysDataSource") DataSource dataSource, GlobalConfig globalConfig) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/sys/*.xml"));
bean.setTypeAliasesPackage("com.tk.scanner.server.model.entity");
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setMapUnderscoreToCamelCase(true);
// 配置打印 sql 语句
configuration.setLogImpl(StdOutImpl.class);
bean.setConfiguration(configuration);
bean.setGlobalConfig(globalConfig);
bean.setPlugins(sysMybatisPlusInterceptor());
return bean.getObject();
}
/**
* 自动填充数据库创建人、创建时间、更新人、更新时间
* SapMapperConfig 也同时使用了这个 globalConfig 对象
*/
@Bean
public GlobalConfig globalConfig() {
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MyMetaObjectHandler());
GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig()
.setIdType(IdType.AUTO)
.setLogicDeleteField("deleted")
.setLogicDeleteValue("1")
.setLogicNotDeleteValue("0");
globalConfig.setDbConfig(dbConfig);
return globalConfig;
}
@Bean
public SqlSessionTemplate sysSqlSessionTemplate(@Qualifier("sysSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "sysTransactionManager")
@Primary
public DataSourceTransactionManager sysTransactionManager(@Qualifier("sysDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor sysMybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 数据权限
interceptor.addInnerInterceptor(new DataPermissionInterceptor(new MyDataPermissionHandler()));
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 如果配置多个插件,切记分页最后添加
// interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
return interceptor;
}
}
SapMapperConfig
package com.tk.scanner.server.config.mapper;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
*@author shen chen
*@Date 2024-03-04
*@Description
*/
@Configuration
@MapperScan(basePackages = {"com.tk.scanner.server.mapper.sap"}, sqlSessionTemplateRef = "sapSqlSessionTemplate")
public class SapMapperConfig {
@Bean(name = "sapDataSource")
@ConfigurationProperties(prefix = "spring.datasource.sap") // prefix值必须是application.properteis中对应属性的前缀
public DataSource sapDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
public SqlSessionFactory sapSqlSessionFactory(@Qualifier("sapDataSource") DataSource dataSource, GlobalConfig globalConfig) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/sap/*.xml"));
bean.setTypeAliasesPackage("com.tk.sap.entity");
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setMapUnderscoreToCamelCase(true);
// 配置打印 sql 语句
configuration.setLogImpl(StdOutImpl.class);
bean.setConfiguration(configuration);
bean.setGlobalConfig(globalConfig);
bean.setPlugins(sapMybatisPlusInterceptor());
return bean.getObject();
}
@Bean
public SqlSessionTemplate sapSqlSessionTemplate(@Qualifier("sapSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "sapTransactionManager")
public DataSourceTransactionManager sapTransactionManager(@Qualifier("sapDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor sapMybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQL_SERVER));// 如果配置多个插件,切记分页最后添加
return interceptor;
}
}