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が出力されるようになります。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント