配置数据源
在依赖spring boot的spring-boot-starter-data-jpa后,它就会默认为你配置数据源,这些默认的数据源主要是内存数据库,如h2、hqldb和Derby等内存数据,有时候需要配置为我们想要的数据源。
启动默认数据源
h2数据库为例,在maven中加入它的依赖
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
这里引入了JPA得依赖。对JPA来说,在springboot中是依赖Hibernate去实现的,因此我们可以看到在maven依赖包下存在很多与Hibernate相关的jar。
这样我们就可以在不使用任何配置数据库的情况下运行springboot工程了,因为h2是内嵌式数据库,它会随着项目的启动而启动,并不需要任何配置。不过更多时候我们希望使用的是商用数据库,如MySQL和Oracle。
配置自定义数据源
以MySQL为例,删除maven中h2的依赖,保留spring-boot-starter-data-jpa的依赖,增加MySQL的依赖。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
这显然还不足以连接数据源,还需要配置数据库的相关信息才能连接到数据库。
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
# spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#最大等待连接中的数量,设置0为没有限
spring.datasource.tomcat.max-idle=10
#最大连接活动数
spring.datasource.tomcat.max-active=50
spring.jpa.database = MYSQL
#最大等待毫秒数,单位为ms,超过时间会出错误信息
spring.datasource.tomcat.max-wait=10000
#数据库连接池初始化连接数
spring.datasource.tomcat.initial-size=5
这样我们就完成了springboot的数据源配置。spring.datasource.url=jdbc:mysql://localhost:3306/test
是数据库地址,后面是区时配置,在后面jpa会用到。这只是匹配springboot绑定的Tomcat的数据源,有时候我们希望使用第三方数据源,例如dbcp,只需要添加maven依赖,配置dbcp2数据源就可以了,在这里就不展示DBCP2的具体配置信息了。
测试:
package com.example.JPAdemo;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
//实现spring bean生命周期接口ApplicationContextAware
@Component
public class DataSourceShow implements ApplicationContextAware {
ApplicationContext applicationContext = null;
@Override
//spring容器会自动调用这个方法,注入spring IOC容器
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
DataSource dataSource =applicationContext.getBean(DataSource.class);
System.out.println("------------");
System.out.println(dataSource.getClass().getName());
System.out.println("------------");
}
}
上述代码中实现了接口ApplicationContextAware的方法setApplicationContext(),依照springbean生命周期的规则,在其初始化的时候该方法就会被调用,从而获取springioc容器的上下文(ApplicationContext ),通过getBean获取数据库连接池,输出日志:
------------
org.apache.tomcat.jdbc.pool.DataSource
------------