項目里面配置數據源,一般采取 數據源+數據庫連接池的模式。
幾種數據源的配置模式:單數據源、多數據源靜態配置、多數據源動態配置。
常用的數據庫連接池:c3p0,Druid,DBCP等。本文以c3p0為主。
一、單數據源的配置(springboot+mybatis+postgresql+c3p0):
1、項目結構:項目里面mapper.java和mapper.xml在同一目錄下。
2、pom.xml里面的jar包:

<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> </dependency>
3、 application-dev.properties里面的配置:

spring.datasource.url=jdbc:postgresql://127.0.0.1:3306/aa spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.max-idle=10 spring.datasource.max-wait=10000 spring.datasource.min-idle=5 spring.datasource.initial-size=5 spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
4、config文件

import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.config.GlobalConfig; import com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig; import com.baomidou.mybatisplus.extension.incrementer.PostgreKeyGenerator; @Configuration @MapperScan("com.demo.mapper*") public class MybatisConfig { @Bean public GlobalConfig globalConfiguration() { GlobalConfig global = new GlobalConfig(); DbConfig dbConfig = new DbConfig(); global.setDbConfig(dbConfig); dbConfig.setKeyGenerator(new PostgreKeyGenerator()); dbConfig.setDbType(DbType.POSTGRE_SQL); return global; } }
二、多數據源靜態配置(springboot+mybatis+postgresql+c3p0):
1、項目結構:項目里面各個模塊的mapper.java和mapper.xml在各個模塊的同一目錄下。
2、pom.xml里面的jar包:

<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> </dependency> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> </dependency>
3、 application-dev.properties里面的配置:

spring.datasource.spdsdb.jdbc-url=jdbc:postgresql://127.0.0.1:3306/spdsdb spring.datasource.spdsdb.username=root spring.datasource.spdsdb.password=123456 spring.datasource.spdsdb.driver-class-name=org.postgresql.Driver spring.datasource.spdsdb.max-idle=10 spring.datasource.spdsdb.max-wait=10000 spring.datasource.spdsdb.min-idle=5 spring.datasource.spdsdb.initial-size=5 spring.datasource.spdsdb.type=com.mchange.v2.c3p0.ComboPooledDataSource spring.datasource.orderdb.jdbc-url=jdbc:postgresql://127.0.0.1:3306/orderdb spring.datasource.orderdb.username=orderdata spring.datasource.orderdb.password=123456 spring.datasource.orderdb.driver-class-name=org.postgresql.Driver spring.datasource.orderdb.max-idle=10 spring.datasource.orderdb.max-wait=10000 spring.datasource.orderdb.min-idle=5 spring.datasource.orderdb.initial-size=5 spring.datasource.orderdb.type=com.mchange.v2.c3p0.ComboPooledDataSource
4、datasource文件
主數據源:

import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; 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; @Configuration @MapperScan(basePackages = {DataSourceSpdsDB.PACKAGE},sqlSessionFactoryRef = "spdsSqlSessionFactory") public class DataSourceSpdsDB { //精確到目錄,以便跟其他數據源隔離 static final String PACKAGE = "com.demo.product.mapper"; static final String MAPPER_LOCATION = "classpath*:com.demo.product.mapper/*.xml"; @Bean(name="spdsDataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource.spdsdb") public DataSource dataSource(){ return DataSourceBuilder.create().build(); } /** * 返回數據庫的會話工廠 */ @Bean(name = "spdsSqlSessionFactory") @Primary public SqlSessionFactory sqlSessionFactory(@Qualifier("spdsDataSource") DataSource ds) throws Exception{ SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(ds); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION)); return bean.getObject(); } /** * 返回數據庫的會話模板 */ @Bean(name = "spdsSqlSessionTemplate") @Primary public SqlSessionTemplate sqlSessionTemplate(@Qualifier("spdsSqlSessionFactory") SqlSessionFactory sessionFactory) throws Exception{ return new SqlSessionTemplate(sessionFactory); } /** * 返回數據庫的事務 */ @Bean(name = "spdsTransactionManager") @Primary public DataSourceTransactionManager transactionManager(@Qualifier("spdsDataSource") DataSource ds){ return new DataSourceTransactionManager(ds); } }
從數據源:

import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; 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; @Configuration @MapperScan(basePackages = {DataSourceOrderDB.PACKAGE},sqlSessionFactoryRef = "orderSqlSessionFactory") public class DataSourceOrderDB { //精確到目錄,以便跟其他數據源隔離 static final String PACKAGE = "com.demo.trading.mapper"; static final String MAPPER_LOCATION = "classpath*:com.demo.trading.mapper/*.xml"; @Bean(name="orderDataSource") @ConfigurationProperties(prefix = "spring.datasource.orderdb") public DataSource dataSource(){ return DataSourceBuilder.create().build(); } /** * 返回數據庫的會話工廠 */ @Bean(name = "orderSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("orderDataSource") DataSource ds) throws Exception{ SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(ds); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MAPPER_LOCATION)); return bean.getObject(); } /** * 返回數據庫的會話模板 */ @Bean(name = "orderSqlSessionTemplate") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("orderSqlSessionFactory") SqlSessionFactory sessionFactory) throws Exception{ return new SqlSessionTemplate(sessionFactory); } /** * 返回數據庫的事務 */ @Bean(name = "orderTransactionManager") public DataSourceTransactionManager transactionManager(@Qualifier("orderDataSource") DataSource ds){ return new DataSourceTransactionManager(ds); } }
此處有一坑:
由於此處沒有把單數據源里面MybatisConfig.java文件上面的全局掃描注解@MapperScan("com.demo.*.mapper")給刪掉,導致操作從數據源的表時,
一直報錯,表不存在:Relation "xxx" not exist
參考文章:
https://www.cnblogs.com/ziyue7575/p/549bc1f2e0996ed979bd09c25a6a26c0.html
三、多數據源動態配置(springboot+mybatis):
參考文章:
https://blog.csdn.net/xp541130126/article/details/81739760
https://www.cnblogs.com/CryOnMyShoulder/p/12218876.html