Spring BootのSQLを出力する方法

Spring BootのSQLを出力する方法

Spring Bootではクラスパス直下にsqlファイルを置くと勝手に読み込んで実行してくれるようです。

クラスパス直下とは「src/main/resoures」です。「src/main/resources/config」でも読み込んで実行はされました。

ちなみにSQLを出力するようにするにはpom.xmlに以下を追加します。

<dependency>
<groupId>org.lazyluke</groupId>
<artifactId>log4jdbc-remix</artifactId>
<version>0.2.7</version>
</dependency>

次に「src/main/resoures/log4j」配下に以下のlogging.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>

@EnableAutoConfigurationはデータソースを自動でDIコンテナに登録してくれましたが、Log4JDBCを使うためにはDataSourceを明示的に定義する必要があります。

package com.sql.config;
import javax.sql.DataSource;

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;

@Configuration
public class AppConfig{
@Autowired
DataSourceProperties dsp;
DataSource ds;

@Bean
DataSource getDataSource(){
DataSourceBuilder factory = DataSourceBuilder
.create(dsp.getClassLoader())
.url(dsp.getUrl())
.username(dsp.getUsername())
.password(dsp.getPassword());
ds = factory.build();
return ds;

}

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

これで明示的に登録することができました。

次にmainですが、これは先の投稿と同じです。

package com.sql;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;

import com.sql.domain.Customer;

@EnableAutoConfiguration
@ComponentScan
public class App{
@Autowired
private NamedParameterJdbcTemplate jdbc;

public void method() {
// プレースホルダ
SqlParameterSource param = new MapSqlParameterSource().addValue("p",1);
// 匿名クラスにする
Customer result = jdbc.queryForObject("SELECT ID , FIRSTNAME,LASTNAME FROM TBL_CUSTOMER WHERE ID=:p",param,
new RowMapper<Customer>(){
@Override
public Customer mapRow(ResultSet rs,int rownum) throws SQLException{
// コンストラクタ
return new Customer(rs.getInt("ID"),rs.getString("FIRSTNAME"),rs.getString("LASTNAME"));
}
}
);
System.out.println("result = " + result);
}

public static void main(String[] args) {
try (ConfigurableApplicationContext ctx = SpringApplication.run(App.class, args)) {
App m = ctx.getBean(App.class);
m.method();
}
}
}

これでコンソールにSQLが出力されるようになります。

Spring BootのSQLを出力する

コメント

タイトルとURLをコピーしました