読者です 読者をやめる 読者になる 読者になる

tyoshikawa1106のブログ

- Force.com Developer Blog -

Java:Spring JDBCの設定について

前回の続きです。

組み込みインメモリDBを使う設定

組み込みインメモリDBを使う設定についてです。「src/main/resources/application.yml」に以下の設定を行います。

spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    username: sa
    password:

組み込みインメモリDBの場合、アプリケーションを終了したタイミングでDBデータも削除されます。データを永続化するにはH2データベースを利用する設定が必要です。

H2データベースの利用設定

H2データベースの場合は、先ほどと同じ「src/main/resources/application.yml」に以下の設定を行います。

spring:
  datasource:
    driverClassName: org.h2.Driver
    url: jdbc:h2:file:/tmp/testdb
    username: sa
    password:

これでApp.javaを実行したタイミングでtestdb.h2.dbというファイルが作成されます。こうしておくとアプリケーションを終了してもデータが残るようになります。

補足

上記の永続化対応を行った場合、Schema.splからCREATE tableを実行したとき、すでにテーブルが作成済みだとエラーが発生します。次のように『IF NOT EXISTS』を追加すると回避できます。

Shema.sql
CREATE table IF NOT EXISTS customers(id int primary key auto_increment, first_name varchar(30), last_name varchar(30));

Log4JDBCでSQLログの出力

SQLログを出力する方法についてです。

pom.xmlの設定追加
<dependency>
  <groupId>org.lazyluke</groupId>
  <artifactId>log4jdbc-remix</artifactId>
  <version>0.2.7</version>
</dependency>
logback.xmlの準備

「src/main/resources/logback.xml」に以下の設定を書き込む。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <logger name="jdbc" level="OFF"/>
    <logger name="jdbc.sqltiming" level="DEBUG"/>
</configuration>

Log4JDBC用のDataSourceの定義

AppConfigクラスを作成
package com.example;

import net.sf.log4jdbc.Log4jdbcProxyDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class AppConfig {
    @Autowired
    DataSourceProperties dataSourceProperties;
    DataSource dataSource;

    @Bean
    DataSource realDataSource() {
        
        DataSourceBuilder factory = DataSourceBuilder
                .create(this.dataSourceProperties.getClassLoader()).url(this.dataSourceProperties.getUrl()).username(this.dataSourceProperties.getUsername()).password(this.dataSourceProperties.getPassword());
        this.dataSource = factory.build();
        return this.dataSource;
    }

    @Bean
    DataSource dataSource() {
        return new Log4jdbcProxyDataSource(this.dataSource);
    }
}

このAppConfigを読み込みためにApp.javaに@ComponentScanを付けます。

package com.example;

import com.example.domain.Customer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;

@EnableAutoConfiguration
@ComponentScan
public class App implements CommandLineRunner {
    @Autowired
    NamedParameterJdbcTemplate jdbcTemplate;

    @Override
    public void run(String... strings) throws Exception {
        String sql = "SELECT id, first_name, last_name FROM customers WHERE id = :id";
        SqlParameterSource param = new MapSqlParameterSource()
                .addValue("id", 1);
        
        Customer result = jdbcTemplate.queryForObject(sql, param,
                (rs, rowNum) -> new Customer(rs.getInt("id"), rs.getString("first_name"), rs.getString("last_name")) // (1)
        );
        
        System.out.println("result = " + result);
    }

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


これで準備完了です。アプリケーションを実行時にターミナルにログが出力されるようになります。
f:id:tyoshikawa1106:20151121170547p:plain


※今回使用したlog4jdbc-remixは開発が終了していてこれからはlog4jdbc-log412を使用した方がいいみたいです。

サンプルコード