文字列として生のSQLを取得することは難しいですが、log4jdbcを使うと簡単にログファイルやコンソールに生のSQLを出力でき、当方でも使っています。mavenプロジェクトにすると設定が楽です。
pom.xml:
xml
1 <dependency>
2 <groupId>org.apache.logging.log4j</groupId>
3 <artifactId>log4j-slf4j-impl</artifactId>
4 <version>${log4j.version}</version>
5 </dependency>
6 <dependency>
7 <groupId>org.apache.logging.log4j</groupId>
8 <artifactId>log4j-core</artifactId>
9 <version>${log4j.version}</version>
10 </dependency>
11
12 <!-- https://mvnrepository.com/artifact/com.googlecode.log4jdbc/log4jdbc -->
13 <dependency>
14 <groupId>com.googlecode.log4jdbc</groupId>
15 <artifactId>log4jdbc</artifactId>
16 <version>1.2</version>
17 </dependency>
log4j2.xml
XML
1 <Loggers>
2 <Root level="trace">
3 <AppenderRef ref="console" level="info"/>
4 <AppenderRef ref="file" level="info" />
5 </Root>
6
7 <!-- log4jdbcによるJDBC自動ログ出力の設定 -->
8 <!-- log4jdbcの詳細設定は log4jdbc.properties -->
9
10 <!-- コネクションの確立/切断 -->
11 <logger name="jdbc.connection" additivity="false" level="off" />
12 <!-- ResultSet に関する呼び出しを除く全ての JDBC の呼び出し -->
13 <logger name="jdbc.audit" additivity="false" level="off" />
14 <!-- ResultSet に関する呼び出し -->
15 <logger name="jdbc.resultset" additivity="false" level="off" />
16 <!-- SQL が実行される直前 -->
17 <logger name="jdbc.sqltiming" additivity="false" level="off" />
18 <!-- 実行される SQL -->
19 <logger name="jdbc.sqlonly" additivity="true" level="info" />
20 <!-- log4jdbc 自身のデバッグメッセージ -->
21 <logger name="jdbc.debug" additivity="false" level="off" />
22 </Loggers>
Java
1 Class.forName("net.sf.log4jdbc.DriverSpy");
2 connection = DriverManager.getConnection("jdbc:log4jdbc:oracle:thin:@localhost:1521", user, password);
3PreparedStatement select = null;
4
5 // 例:
6 select = connection.prepareStatement(
7 "select nvl(INSTRUCTOR_NAME, NAME) from ON_THE_JOB j"
8 + " left join INSTRUCTOR i on j.INDICATED_BY = i.INSTRUCTOR_ID"
9 + " left join FRESH_PERSON f on j.MODIFIED_BY = f.EMP_CODE"
10 + " where PHASE_NO = ? and EXERCISE_NO = ? and TARGET_NO = ? and TEAM = ? and j.LDF = 0"
11 + " and (INDICATED_BY is not null or MODIFIED_BY is not null)"
12 );
13
14 select.setInt(1, target.getPhaseNo());
15 select.setInt(2, target.getExerciseNo());
16 select.setInt(3, target.getTargetNo());
17 select.setString(4, target.getTeam());
18 ResultSet rs = select.executeQuery();
ログ出力例:
2019-10-12 15:42:22.445 | [http-nio-8090-exec-2] | INFO | jdbc.sqlonly | select nvl(INSTRUCTOR_NAME, NAME) from ON_THE_JOB j left join INSTRUCTOR i on j.INDICATED_BY
= i.INSTRUCTOR_ID left join FRESH_PERSON f on j.MODIFIED_BY = f.EMP_CODE where PHASE_NO = 4
and EXERCISE_NO = 0 and TARGET_NO = 16 and TEAM = 'A' and j.LDF = 0 and (INDICATED_BY is not
null or MODIFIED_BY is not null)