この記事では、SpringブートJDBCアプリケーション+ Oracleデータベース+ Commons DBCP2接続プールの作成方法を説明します。

この記事で使用されているツール:

  1. 春のブート1.5.1.RELEASE

  2. Oracleデータベース11g Express

  3. Oracle JDBCドライバojdbc7.jar

  4. コモンズDBCP2 2.1.1

  5. Maven

  6. Java 8

1.プロジェクトの構成

標準のMavenプロジェクト構造。


image

プロジェクトの依存関係

  • Oracle JDBCドライバをダウンロードしてインストールします。** + Oracleのライセンス制限により、パブリックMavenリポジトリからOracle JDBCドライバを取得することはできません。代わりにOracleのWebサイトにアクセスして、ドライバをダウンロードし、リンクする必要があります。//maven/how-to-add-oracle-jdbc-driver-in-your-maven-local-repository/[ローカルMavenリポジトリに手動でインストールします]。

SpringブートJDBC

spring-boot-starter-jdbc

、Oracle JDBCドライバ(手動インストール)` ojdbc7`、Common DBCP2接続プールを宣言します。

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  http://maven.apache.org/maven-v4__0__0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mkyong</groupId>
    <artifactId>spring-boot-jdbc</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <!-- Exclude teh default Tomcat connection pool -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.tomcat</groupId>
                    <artifactId>tomcat-jdbc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- Oracle JDBC driver -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0</version>
        </dependency>

        <!-- Common DBCP2 connection pool -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.1.1</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <!-- Package as an executable jar/war -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

        </plugins>
    </build>

</project>

ターミナル

$ mvn dependency:tree[INFO]Scanning for projects...[INFO][INFO]------------------------------------------------------------------------[INFO]Building spring-boot-jdbc 1.0[INFO]------------------------------------------------------------------------[INFO][INFO]--- maven-dependency-plugin:2.10:tree (default-cli) @ spring-boot-jdbc ---[INFO]com.mkyong:spring-boot-jdbc:jar:1.0[INFO]+- org.springframework.boot:spring-boot-starter:jar:1.5.1.RELEASE:compile[INFO]|  +- org.springframework.boot:spring-boot:jar:1.5.1.RELEASE:compile[INFO]|  |  \- org.springframework:spring-context:jar:4.3.6.RELEASE:compile[INFO]|  |     +- org.springframework:spring-aop:jar:4.3.6.RELEASE:compile[INFO]|  |     \- org.springframework:spring-expression:jar:4.3.6.RELEASE:compile[INFO]|  +- org.springframework.boot:spring-boot-autoconfigure:jar:1.5.1.RELEASE:compile[INFO]|  +- org.springframework.boot:spring-boot-starter-logging:jar:1.5.1.RELEASE:compile[INFO]|  |  +- ch.qos.logback:logback-classic:jar:1.1.9:compile[INFO]|  |  |  +- ch.qos.logback:logback-core:jar:1.1.9:compile[INFO]|  |  |  \- org.slf4j:slf4j-api:jar:1.7.22:compile[INFO]|  |  +- org.slf4j:jcl-over-slf4j:jar:1.7.22:compile[INFO]|  |  +- org.slf4j:jul-to-slf4j:jar:1.7.22:compile[INFO]|  |  \- org.slf4j:log4j-over-slf4j:jar:1.7.22:compile[INFO]|  +- org.springframework:spring-core:jar:4.3.6.RELEASE:compile[INFO]|  \- org.yaml:snakeyaml:jar:1.17:runtime[INFO]+- org.springframework.boot:spring-boot-starter-jdbc:jar:1.5.1.RELEASE:compile[INFO]|  \- org.springframework:spring-jdbc:jar:4.3.6.RELEASE:compile[INFO]|     +- org.springframework:spring-beans:jar:4.3.6.RELEASE:compile[INFO]|     \- org.springframework:spring-tx:jar:4.3.6.RELEASE:compile[INFO]+- com.oracle:ojdbc7:jar:12.1.0:compile[INFO]\- org.apache.commons:commons-dbcp2:jar:2.1.1:compile[INFO]   +- org.apache.commons:commons-pool2:jar:2.4.2:compile[INFO]   \- commons-logging:commons-logging:jar:1.2:compile[INFO]------------------------------------------------------------------------

  • データベース接続プーリング** + Spring BootはデフォルトでTomcatに `tomcat-jdbc`をプールし、このシーケンスに従って接続プールを探します:

Tomcat pool -->> - HikariCP -->>  Commons DBCP -->>  Commons DBCP2

この公式のSpringブートのドキュメントを読む –

Connection本番データベースへ

3. JdbcTemplate

3.1 SpringBootは `JdbcTemplate`を自動的に登録し、あなたのbeanに注入します。

CustomerRepository.java

package com.mkyong.dao;

import com.mkyong.model.Customer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class CustomerRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

   //thanks Java 8, look the custom RowMapper
    public List<Customer> findAll() {

        List<Customer> result = jdbcTemplate.query(
                "SELECT id, name, email, created__date FROM customer",
                (rs, rowNum) -> new Customer(rs.getInt("id"),
                        rs.getString("name"), rs.getString("email"), rs.getDate("created__date"))
        );

        return result;

    }

}

3.2顧客モデル。

Customer.java

package com.mkyong.model;

import java.util.Date;

public class Customer {

    int id;
    String name;
    String email;
    Date date;

    public Customer(int id, String name, String email, Date date) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.date = date;
    }

   //getters and setters and toString...
}

4.データベースの初期化

SpringブートはデフォルトでdataSource初期化子を有効にし、クラスパスのルートから

schema.sql`と

data.sql`というSQLスクリプトをロードします。

4.1 `customer`テーブルを作成するためのSQLスクリプト。

schema.sql

CREATE TABLE CUSTOMER(
ID NUMBER(10) NOT NULL,
NAME VARCHAR2(100) NOT NULL,
EMAIL VARCHAR2(100) NOT NULL,
CREATED__DATE DATE NOT NULL,
CONSTRAINT CUSTOMER__PK PRIMARY KEY (ID)
);

4.2 `customer`テーブルに3行を挿入するSQLスクリプト。

data.sql

INSERT INTO "CUSTOMER" (ID, NAME, EMAIL, CREATED__DATE) VALUES(1, 'mkyong','[email protected]', TO__DATE('2017-02-11', 'yyyy-mm-dd'));
INSERT INTO "CUSTOMER" (ID, NAME, EMAIL, CREATED__DATE) VALUES(2, 'yflow','[email protected]', TO__DATE('2017-02-12', 'yyyy-mm-dd'));
INSERT INTO "CUSTOMER" (ID, NAME, EMAIL, CREATED__DATE) VALUES(3, 'zilap','[email protected]', TO__DATE('2017-02-13', 'yyyy-mm-dd'));

5.設定

Oracleとhttps://commons.apache.org/proper/commons-dbcp/configuration.html[dbcp2設定]を設定します。

application.properties

spring.main.banner-mode=off

# Set true for first time db initialization.
spring.datasource.initialize=true

spring.datasource.url=jdbc:oracle:thin:@localhost:1521:xe
spring.datasource.username=system
spring.datasource.password=password
spring.datasource.driver-class-oracle.jdbc.driver.OracleDriver

# dbcp2 settings
# spring.datasource.dbcp2.**

spring.datasource.dbcp2.initial-size=7
spring.datasource.dbcp2.max-total=20
spring.datasource.dbcp2.pool-prepared-statements=true

6. @SpringBootApplication

Springブートコマンドラインアプリケーション

SpringBootConsoleApplication.java

package com.mkyong;

import com.mkyong.dao.CustomerRepository;
import com.mkyong.model.Customer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.sql.DataSource;
import java.util.List;

import static java.lang.System.exit;

@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {

    @Autowired
    DataSource dataSource;

    @Autowired
    CustomerRepository customerRepository;

    public static void main(String[]args) throws Exception {
        SpringApplication.run(SpringBootConsoleApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {

        System.out.println("DATASOURCE = " + dataSource);

       ///Get dbcp2 datasource settings
       //BasicDataSource newds = (BasicDataSource) dataSource;
       //System.out.println("BasicDataSource = " + newds.getInitialSize());

        System.out.println("Display all customers...");
        List<Customer> list = customerRepository.findAll();
        list.forEach(x -> System.out.println(x));

        System.out.println("Done!");

        exit(0);
    }
}

デモ

それを実行すると、SpringBootは

schema.sql`と

data.sql`スクリプトを自動的にロードし、その結果を表示します。

ターミナル

DATASOURCE = org.apache.commons.dbcp2.BasicDataSource@4eb386df
Display all customers...
Customer{id=1, name='mkyong', email='[email protected]', date=2017-02-11}
Customer{id=2, name='yflow', email='[email protected]', date=2017-02-12}
Customer{id=3, name='zilap', email='[email protected]', date=2017-02-13}
Done!

デバッグ・セッションでブレークポイントを設定する場合は、Oracle Web管理者のセッション・ページを確認してください。


image

ソースコードをダウンロードする

ダウンロード:

spring-boot-jdbc-oracle-example.zip

(7 KB)

参考文献

  1. リンク://maven/how-to-add-oracle-jdbc-driver-in-your-maven-local-repository/[Maven

Oracle JDBCドライバをインストール]。 link://jdbc/connect-to-oracle-db-via-jdbc-driver-java/[接続先

JDBCドライバ経由のOracle DB]。

https:///////

ブート – SQLデータベースの操作]。

https:///////

ブート共通アプリケーションのプロパティ]。

http://docs.oracle.com/cd/E11882__01/appdev.112/e13995/oracle/jdbc/OracleDriver.html

[OracleDriver

データベース12.1.0.2 JDBCドライバ

DBCP2構成パラメータ]

リンク://タグ/接続プール/[接続プール]リンク://タグ/dbcp2/[dbcp2]

jdbc


oracle


spring boot


spring
jdbc