使用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所寫)