SpringBoot使用SqlSessionFactory方式配置多数据源
场景:
一个项目操作多个数据库
解决方法:
通过SqlSessionFactory指定的数据源来操作指定目录的XML文件
实现:
1.项目结构:
2.pom文件
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><scope>runtime</scope></dependency>
<!-- SpringBoot集成mybatis plus框架 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis.plus.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--常用工具类 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId></dependency></dependencies>
3.配置yml文件
server:port: 9099spring:application:name: kingdee-datadatasource:kingdee-middle:driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriverjdbc-url: jdbc:sqlserver://localhost:1433;databaseName=kingdee;Persist Security Info=True;Connection Timeout=30username: rootpassword: rootgfy:driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriverjdbc-url: jdbc:sqlserver://localhost:1433;databaseName=gfy;Persist Security Info=True;Connection Timeout=30username: rootpassword: rootgfy-002:driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriverjdbc-url: jdbc:sqlserver://localhost:1433;databaseName=gfy-002;Persist Security Info=True;Connection Timeout=30username: rootpassword: rootgfy-005:driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriverjdbc-url: jdbc:sqlserver://localhost:1433;databaseName=gfy-005;Persist Security Info=True;Connection Timeout=30username: rootpassword: rootmybatis-plus:mapper-locations: classpath*:mapper/**/*Mapper.xmltype-aliases-package: com.sys.kingdeedata.*configuration:#开启驼峰映射map-underscore-to-camel-case: falsecall-setters-on-nulls: true#开启复杂映射auto-mapping-behavior: full
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpllog-impl: org.apache.ibatis.logging.slf4j.Slf4jImplcache-enabled: trueuse-generated-keys: truedefault-executor-type: simple#配置全局默认主键类型,实体类就不用加 @TableId(value = "id", type = IdType.AUTO)global-config:db-config:id-type: auto
4.创键读取第一个数据库配置文件配置类并设置为主配置类
package com.sys.kingdeedata.common.config;import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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 org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;@Configuration
@MapperScan(basePackages = {"com.sys.kingdeedata.mapper.gfy"}, sqlSessionFactoryRef = "gfySqlSessionFactory")
public class GfyMybatisConfig {@Bean(name = "gfyDataSource")@ConfigurationProperties(prefix = "spring.datasource.gfy")public DataSource dataSource() {return DataSourceBuilder.create().build();}/*** 配置事务管理器,不然事务不起作用** @return*/@Beanpublic PlatformTransactionManager transactionManager() {return new DataSourceTransactionManager(this.dataSource());}@Primary@Bean(name = "gfySqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("gfyDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/gfy/*.xml"));sqlSessionFactoryBean.setTypeAliasesPackage("com.sys.kingdeedata.entity");sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);return sqlSessionFactoryBean.getObject();}
}
5.有几个数据源就依次创建几个配置类
package com.sys.kingdeedata.common.config;import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
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 org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;@Configuration
@MapperScan(basePackages = {"com.sys.kingdeedata.mapper.gfy002"}, sqlSessionFactoryRef = "gfy002SqlSessionFactory")
public class Gfy002MybatisConfig {@Bean(name = "gfy002DataSource")@ConfigurationProperties(prefix = "spring.datasource.gfy002")public DataSource dataSource() {return DataSourceBuilder.create().build();}/*** 配置事务管理器,不然事务不起作用** @return*/
// @Bean
// public PlatformTransactionManager transactionManager() {
// return new DataSourceTransactionManager(this.dataSource());
// }@Bean(name = "gfy002SqlSessionFactory")public SqlSessionFactory sqlSessionFactory(@Qualifier("gfy002DataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/gfy002/*.xml"));sqlSessionFactoryBean.setTypeAliasesPackage("com.sys.kingdeedata.entity");sqlSessionFactoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);return sqlSessionFactoryBean.getObject();}
}
6.在mapper包下按照配置创建对应的包,针对Mapper层通过SqlSessionFactory指定数据源来操作。