복붙노트

[SQL] 봄의 JdbcTemplate의 기본 SQL을보고?

SQL

봄의 JdbcTemplate의 기본 SQL을보고?

나는 JdbcTemplate을하고하는 NamedParameterJdbcTemplate의 경이로움에 대해 배우고 있어요. 내가 무엇을보고 같은 I,하지만 실행이 끝나는 것을 기본 SQL을 볼 수있는 쉬운 방법은 무엇입니까? 나는 (예를 들어, 디버그하기 위해 외부 도구에서 생성 된 SQL을) 디버그 목적으로이를보고 싶습니다.

해결법

  1. ==============================

    1.봄 문서는이 DEBUG 수준에서 로그인 한 말한다 :

    봄 문서는이 DEBUG 수준에서 로그인 한 말한다 :

    XML 측면에서, 당신은 같은 로거 뭔가를 구성해야합니다 :

    <category name="org.springframework.jdbc.core.JdbcTemplate">
        <priority value="debug" />
    </category>
    

    이 주제는하지만 한 달 전에 여기에서 논의되었다 그것은 쉽게 최대 절전 모드에서와 같이 작동시킬 수 없습니다 보인다 및 / 또는 예상 된 정보를 반환하지 않았습니다 : 각 P6Spy로를 사용하는 제안에 따라 스프링 JDBC는 log4j에와 SQL을이 항목을 기록하지 않습니다 이는 또한이 문서에 따라 봄에 통합 할 수 있습니다.

  2. ==============================

    2.org.springframework.jdbc-3.0.6.RELEASE.jar와 나를 위해이 작동합니다. 나는 봄 문서에서이 어디 (어쩌면 난 그냥 게으른를) 찾을 수 없습니다하지만 난 TRACE 레벨이 마법을했다는 것을 (시행 착오를) 발견했다.

    org.springframework.jdbc-3.0.6.RELEASE.jar와 나를 위해이 작동합니다. 나는 봄 문서에서이 어디 (어쩌면 난 그냥 게으른를) 찾을 수 없습니다하지만 난 TRACE 레벨이 마법을했다는 것을 (시행 착오를) 발견했다.

    나는의 log4j를 구성하는 SLF4J (1.6.4) 및 속성 파일과 함께 log4j에-1.2.15을 사용하고 있습니다 :

    log4j.logger.org.springframework.jdbc.core = TRACE
    

    이 표시 SQL 문이 같은 바인딩 매개 변수를 모두 :

    Executing prepared SQL statement [select HEADLINE_TEXT, NEWS_DATE_TIME from MY_TABLE where PRODUCT_KEY = ? and NEWS_DATE_TIME between ? and ? order by NEWS_DATE_TIME]
    Setting SQL statement parameter value: column index 1, parameter value [aaa], value class [java.lang.String], SQL type unknown
    Setting SQL statement parameter value: column index 2, parameter value [Thu Oct 11 08:00:00 CEST 2012], value class [java.util.Date], SQL type unknown
    Setting SQL statement parameter value: column index 3, parameter value [Thu Oct 11 08:00:10 CEST 2012], value class [java.util.Date], SQL type unknown
    

    확실하지 SQL 형 알 수없는 약하지만 우리가 여기 무시할 수 추측

    (당신이 바인딩 된 매개 변수 값에 관심이하지 않는 경우 즉,) 그냥 SQL의 경우 DEBUG는 충분합니다.

  3. ==============================

    3.매개 변수 값은 TRACE 수준에 인쇄 될 것으로 보인다. 이것은 나를 위해 일한 :

    매개 변수 값은 TRACE 수준에 인쇄 될 것으로 보인다. 이것은 나를 위해 일한 :

    log4j.logger.org.springframework.jdbc.core.JdbcTem plate=DEBUG, file
    log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=TRACE, file
    

    콘솔 출력 :

    02:40:56,519 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 1, parameter value [Tue May 31 14:00:00 CEST 2005], value class [java.util.Date], SQL type unknown
    02:40:56,528 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 2, parameter value [61], value class [java.lang.Integer], SQL type unknown
    02:40:56,528 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 3, parameter value [80], value class [java.lang.Integer], SQL type unknown
    
  4. ==============================

    4.나는 봄 부팅 응용 프로그램이 줄을 사용 :

    나는 봄 부팅 응용 프로그램이 줄을 사용 :

    logging.level.org.springframework.jdbc.core = TRACE
    

    이 방법을 아주 보편적이고 나는 보통 내 응용 프로그램 내 다른 클래스를 사용합니다.

  5. ==============================

    5.이 log4j2 및 XML 매개 변수와 함께 나를 위해 일한 :

    이 log4j2 및 XML 매개 변수와 함께 나를 위해 일한 :

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="debug">
        <Properties>
            <Property name="log-path">/some_path/logs/</Property>
            <Property name="app-id">my_app</Property>
        </Properties>
    
        <Appenders>
            <RollingFile name="file-log" fileName="${log-path}/${app-id}.log"
                filePattern="${log-path}/${app-id}-%d{yyyy-MM-dd}.log">
                <PatternLayout>
                    <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
                    </pattern>
                </PatternLayout>
                <Policies>
                    <TimeBasedTriggeringPolicy interval="1"
                        modulate="true" />
                </Policies>
            </RollingFile>
    
            <Console name="console" target="SYSTEM_OUT">
                <PatternLayout
                    pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
            </Console>
        </Appenders>
        <Loggers>
    
            <Logger name="org.springframework.jdbc.core" level="trace" additivity="false">
                <appender-ref ref="file-log" />
                <appender-ref ref="console" />
            </Logger>
    
            <Root level="info" additivity="false">
                <appender-ref ref="file-log" />
                <appender-ref ref="console" />
            </Root>
        </Loggers>
    
    </Configuration>
    

    결과 콘솔 및 파일 로그했다 :

    JdbcTemplate - Executing prepared SQL query
    JdbcTemplate - Executing prepared SQL statement [select a, b from c where id = ? ]
    StatementCreatorUtils - Setting SQL statement parameter value: column index 1, parameter value [my_id], value class [java.lang.String], SQL type unknown
    

    그냥 복사 / 붙여 넣기

    HTH

  6. ==============================

    6.의 log4j.xml에 추가하십시오

    의 log4j.xml에 추가하십시오

    <!--  enable query logging -->
    <category name="org.springframework.jdbc.core.JdbcTemplate">
        <priority value="DEBUG" />
    </category>
    
    <!-- enable query logging for SQL statement parameter value -->
    <category name="org.springframework.jdbc.core.StatementCreatorUtils">
        <priority value="TRACE" />
    </category>
    

    당신의 로그의 외모와 같은 :

    DEBUG JdbcTemplate:682 - Executing prepared SQL query
    DEBUG JdbcTemplate:616 - Executing prepared SQL statement [your sql query]
    TRACE StatementCreatorUtils:228 - Setting SQL statement parameter value: column index 1, parameter value [param], value class [java.lang.String], SQL type unknown
    
  7. ==============================

    7.나는 100 % 당신이 일반적으로 방금 그를 기록 할 경우에 JdbcTemplate을에 (파라미터 또는되지 않음) SQL 쿼리로 전달됩니다 이후에 점점하는지입니다. 당신이자는 PreparedStatements이 있고 실행되고있는 하나의 알 수없는 경우, toString 메소드는 잘 작동합니다. 우리가 주제에있는 동안하지만,뿐만 아니라 바인딩 된 매개 변수 각각의 시간을 볼 당신이 자동으로 쿼리를 기록하게됩니다 여기에 좋은 JDBC 로거 패키지가있다. 매우 유용한. 출력은 다음과 같은 :

    나는 100 % 당신이 일반적으로 방금 그를 기록 할 경우에 JdbcTemplate을에 (파라미터 또는되지 않음) SQL 쿼리로 전달됩니다 이후에 점점하는지입니다. 당신이자는 PreparedStatements이 있고 실행되고있는 하나의 알 수없는 경우, toString 메소드는 잘 작동합니다. 우리가 주제에있는 동안하지만,뿐만 아니라 바인딩 된 매개 변수 각각의 시간을 볼 당신이 자동으로 쿼리를 기록하게됩니다 여기에 좋은 JDBC 로거 패키지가있다. 매우 유용한. 출력은 다음과 같은 :

    executing PreparedStatement: 'insert into ECAL_USER_APPT
    (appt_id, user_id, accepted, scheduler, id) values (?, ?, ?, ?, null)'
         with bind parameters: {1=25, 2=49, 3=1, 4=1} 
    
  8. from https://stackoverflow.com/questions/1932208/seeing-the-underlying-sql-in-the-spring-jdbctemplate by cc-by-sa and MIT license