一、数据源的作用
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、创建对应的映射文件