天天看點

Spring Boot(16)——使用DataSource使用DataSource

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