项目里面配置数据源,一般采取 数据源+数据库连接池的模式。
几种数据源的配置模式:单数据源、多数据源静态配置、多数据源动态配置。
常用的数据库连接池: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