一、數據源的作用
1 通過DataSource可以獲取數據庫連接Connection
2 通過DataSource創建JdbcTemplate操作數據庫
實際項目中,我們在配置數據源的時候會指定數據庫連接池,比如流行的Hikari(spring默認的數據庫連接池)、C3p0、Dbcp2以及阿里巴巴的Druid。應用在操作數據庫的時候,直接從數據庫連接池獲取連接,而不需要每次創建新的連接。至於數據庫連接池的好處,總結就是: 應用創建和銷毀連接的代價是很大的,使用數據庫連接池可以很好的復用連接,節省開銷,方便管理,簡化開發。
SpringBoot項目啟動時會自動加載datasourceConfig配置,項目如果需要操作數據庫,就需要配置數據源,如果不需要,則需要處理:
1.在yml文件配置數據庫信息
2.排除引入帶有數據庫的包
3.使用注解啟動類的@EnableAutoConfiguration或@SpringBootApplication中添加exclude = {DataSourceAutoConfiguration.class},排除此類的autoconfig。
@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
二、默認數據源,通過spring-boot-starter-jdbc快速配置數據源
springboot默認支持4種數據源類型,定義在org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration中,分別是:
- org.apache.tomcat.jdbc.pool.DataSource
- com.zaxxer.hikari.HikariDataSource
- org.apache.commons.dbcp.BasicDataSource
- org.apache.commons.dbcp2.BasicDataSource
對於這4種數據源,當classpath下有相應的類存在時,springboot會通過自動配置為其生成DataSource Bean,默認只會生成一個,四種數據源生效的先后順序從上到下。
添加依賴和配置
在Springboot 使用JDBC可直接添加官方提供的 spring-boot-start-jdbc 或者 spring-boot-start-data-jpa 依賴。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.RELEASE</version> </parent> <dependencies> <!-- 添加MySQL依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 添加JDBC依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
在核心配置application.properties或者application.yml文件中添加數據源相關配置。
# application.yml文件中添加如下配置: spring: datasource: url: jdbc:mysql://localhost:3306/testuseUnicode=true&characterEncoding=utf8 driverClassName: com.mysql.jdbc.Driver username: root password: 123456
當connector版本是6.0以前的使用com.mysql.jdbc.Driver,6.0以后的使用com.mysql.cj.jdbc.Driver
切換默認數據源
方式一 排除其他的數據源依賴,僅保留需要的數據源依賴;
方式二 通過在核心配置中通過spring.datasource.type屬性指定數據源的類型;
方式一
Springboot默認支持的4種數據源Maven依賴如下:
<!-- 添加Tomcat-JDBC依賴 --> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </dependency> <!-- 添加HikariCP依賴 --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency> <!-- 添加DBCP依賴 --> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> </dependency> <!-- 添加DBCP2依賴 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> </dependency>
當我們引入spring-boot-start-jdbc依賴時,其實里面就包含了 Tomcat-JDBC 的依賴,如果想要切換為其他的數據源類型,需要先將Tomcat-JDBC 依賴排除,再添加上需要的數據源的依賴,以使用HikariCP數據源為例,依賴配置如下。
<!-- 添加JDBC依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <!-- 排除Tomcat-JDBC依賴 --> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加HikariCP依賴 --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </dependency>
方式二
此外,還可以通過在核心配置中通過添加spring.datasource.type = [數據源類型] 來指定數據源的類型;
spring.datasource.type=com.zaxxer.hikari.HikariDataSource # spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource # spring.datasource.type=org.apache.commons.dbcp.BasicDataSource # spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
三、第三方數據源,自定義數據源DataSource
如果不想使用Springboot默認支持的4種數據源,還可以選擇使用其他第三方的數據源,例如:Druid、c3p0等。可能有些場景我們不想使用SpringBoot JDBC默認的數據源,需要引入數據庫連接池,然后自定義數據源,指定數據源類型。
以使用Druid數據源為例。
添加依賴與配置
在pom文件中引入第三方數據源依賴。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.1.RELEASE</version> </parent> <dependencies> <!-- 添加MySQL依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 添加JDBC依賴 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- 添加Druid依賴 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.6</version> </dependency> </dependencies>
核心配置文件中的添加數據源相關配置與使用默認數據源時的配置相同,此處不再重復貼出。
定義數據源
使用注解@Bean 創建一個DataSource Bean並將其納入到Spring容器中進行管理即可。
@Configuration public class DataSourceConfig { @Autowired private Environment env; @Bean public DataSource getDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(env.getProperty("spring.datasource.url")); dataSource.setUsername(env.getProperty("spring.datasource.username")); dataSource.setPassword(env.getProperty("spring.datasource.password")); return dataSource; } }
或
@Configuration @ConfigurationProperties(prefix = "spring.datasource") @Data public class DataSource2Config { private String url; private String username; private String password; @Bean public DataSource getDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl(url); dataSource.setUsername(username);// 用戶名 dataSource.setPassword(password);// 密碼 return dataSource; } }
四、springboot配置多數據源一個mysql一個sqlserver
1、添加依賴
<!--mybatis 模塊--> <dependency> <groupId>com.bestway</groupId> <artifactId>materials-common-mybatis</artifactId> <version>1.0</version> </dependency> <!--sqlserver模塊--> <dependency> <groupId>com.microsoft.sqlserver</groupId> <artifactId>mssql-jdbc</artifactId> <version>6.4.0.jre8</version> <scope>runtime</scope> </dependency>
2、配置類
MySqlDataSourceConfig
@Configuration @MapperScan(basePackages = "com.bestway.manager.mapper.mysql", sqlSessionFactoryRef = "MySqlSessionFactory") public class MySqlDataSourceConfig {
//返回數據庫的數據源 @Bean(name="MySqlDataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource.mysql") public DataSource mysqlDbDataSource(){ return DataSourceBuilder.create().build(); } //返回數據庫的會話工廠 @Primary @Bean(name = "MySqlSessionFactory") public SqlSessionFactory mySqlSessionFactory(@Qualifier("MySqlDataSource") DataSource datasource) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); MybatisConfiguration configuration = new MybatisConfiguration(); configuration.addInterceptor(new PaginationInterceptor()); factoryBean.setConfiguration(configuration); factoryBean.setDataSource(datasource); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/mysql/*.xml")); return factoryBean.getObject(); } }
SqlServerDataSourceConfig
@Configuration @MapperScan(basePackages = "com.bestway.manager.mapper.sqlserver", sqlSessionFactoryRef = "SqlServerSessionFactory") public class SqlServerDataSourceConfig { @Bean(name="SqlServerDataSource") @ConfigurationProperties(prefix = "spring.datasource.sqlserver") public DataSource sqlServerDbDataSource(){ return DataSourceBuilder.create().build(); } @Bean(name = "SqlServerSessionFactory") public SqlSessionFactory sqlServerSessionFactory(@Qualifier("SqlServerDataSource") DataSource datasource) throws Exception { MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); MybatisConfiguration configuration = new MybatisConfiguration(); configuration.addInterceptor(new PaginationInterceptor()); factoryBean.setConfiguration(configuration); factoryBean.setDataSource(datasource); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/sqlserver/*.xml")); return factoryBean.getObject(); } }
3、配置數據源文件
security: oauth2: client: client-id: mine client-secret: mine scope: server ignore: urls: - /img/** - /app-interface/login/checkAccess # 數據源 spring: rabbitmq: queuename: mine_subscribe_queue exchange: subscribe_ex routingkey: subscribe_routkey subscribe: routingkey: baseinfo_subwl_routkey exchange: subscribe_baseinfo_wlex datasource: mysql: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver username: root password: 123 jdbc-url: jdbc:mysql://192.20.1.240:3306/materials-manager?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai hikari: minimum-idle: 5 maximum-pool-size: 20 auto-commit: true idle-timeout: 30000 pool-name: MysqlHikariCP max-lifetime: 1800000 connection-timeout: 10000 connection-test-query: SELECT 1 sqlserver: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver username: sa password: kj111 jdbc-url: jdbc:sqlserver://192.20.0.248;instanceName=MSSQLSERVER2012;DatabaseName=BW_KJ915 hikari: minimum-idle: 5 maximum-pool-size: 20 auto-commit: true idle-timeout: 30000 pool-name: MssqlHikariCP max-lifetime: 1800000 connection-timeout: 10000 connection-test-query: SELECT 1 # 直接放行URL ignore: urls: - /img/** # 配置mybatis-plus mybatis-plus: # 主要是下面的配置 ,能夠將sql打印在控制台上 #configuration: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #0為直通車免審核,1為正常申請 apply: type: 1
4、創建對應的映射文件