使用DataSource
需要使用DataSource可以在pom.xml中添加
spring-boot-starter-jdbc
依赖,这会自动加入Spring Jdbc的依赖。还需要加入相应的JDBC驱动包的依赖,笔者这里使用的是MySQL的驱动。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
DataSource的自动配置由
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
负责,当不存在DataSource类型的bean时,其会负责创建一个池化的DataSource。内置支持的连接池包括下面这几个,默认自动使用的顺序也是按照下面的顺序进行使用。即如果Classpath下存在HikariDataSource时将优先使用HikariDataSource,其次是Tomcat提供的数据库连接池,最后是dbcp2。
- com.zaxxer.hikari.HikariDataSource
- org.apache.tomcat.jdbc.pool.DataSource
- org.apache.commons.dbcp2.BasicDataSource
当添加了
spring-boot-starter-jdbc
依赖时,会自动级联加入Hikari依赖,即此时默认将使用HikariDataSource。当Classpath下同时存在多个支持的数据库连接池实现时,如果不期望使用自动选择的数据库连接池实现,可以通过
spring.datasource.type
指定需要使用的数据库连接池实现。比如如果Classpath下同时存在
com.zaxxer.hikari.HikariDataSource
和
org.apache.tomcat.jdbc.pool.DataSource
,默认将使用
com.zaxxer.hikari.HikariDataSource
,如果期望使用
org.apache.tomcat.jdbc.pool.DataSource
,则可以配置
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
。
然后可以通过
spring.datasource
前缀开始的属性配置数据库连接相关的信息了,比如配置URL、驱动Class、用户名、密码等。数据库的配置信息由
org.springframework.boot.autoconfigure.jdbc.DataSourceProperties
负责接收。
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=elim
更多的配置信息可以参考DataSourceProperties的API文档。
如果需要对使用的HikariDataSource连接池进行配置,可以通过
spring.datasource.hikari
前缀开始的属性进行配置,对应的配置属性将由
com.zaxxer.hikari.HikariDataSource
负责接收,可以配置的属性请参考对应的API文档。
如果需要对使用的Tomcat连接池进行配置,可以通过
spring.datasource.tomcat
org.apache.tomcat.jdbc.pool.DataSource
如果需要对使用的dbcp2连接池进行配置,可以通过
spring.datasource.dbcp2
org.apache.commons.dbcp2.BasicDataSource
有了DataSource后,就可以使用DataSource了,我们可以在需要应用它的地方直接进行注入,比如下面这样。
@Service
public class JdbcService {
@Autowired
private DataSource dataSource;
public List<String> getUsers() throws Exception {
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
List<String> names = new ArrayList<>();
try {
connection = this.dataSource.getConnection();
statement = connection.createStatement();
resultSet = statement.executeQuery("select name from tb_user");
while (resultSet.next()) {
names.add(resultSet.getString(1));
}
} finally {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
}
return names;
}
}
现在的应用中基本都不会直接使用DataSource编程了,基本都是基于Hibernate、JPA或Mybatis编程。也有的会使用JdbcTemplate了。拥有了DataSource类型的bean后,Spring Boot的
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
将自动为我们配置JdbcTemplate bean,所以上述代码可以改写为如下这样。
@Service
public class JdbcService {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<String> getUsers() throws Exception {
String sql = "select name from tb_user";
List<String> names = this.jdbcTemplate.queryForList(sql, String.class);
return names;
}
}
可以使用
spring.jdbc.template
前缀开始的属性对JdbcTemplate进行一些自定义配置,对应的配置属性将由
org.springframework.boot.autoconfigure.jdbc.JdbcProperties.Template
使用基于内嵌数据库的DataSource
Spring Boot支持对H2、HSQL和Derby三种内嵌的数据库进行自动配置,只要Classpath下存在它们相关的驱动Class,Spring Boot将自动配置对应的DataSource。基于内嵌数据库的自动配置的DataSource是不需要配置用户名、密码等数据库连接信息的。有了DataSource后就可以进行与DataSource相关的操作了,进行单元测试时使用内嵌的数据库是一个不错的选择。
使用基于JNDI的DataSource
如果需要使用基于JNDI的DataSource,则可以通过
spring.datasource.jndi-name
属性指定DataSource对应的JNDI名称。
spring.datasource.jndi-name=java:jboss/datasources/customers
(注:本文基于Spring Boot 2.0.3所写)