2010-06-14 3 views
8

나는 MySQL 서버와 함께 PreparedStatement과 함께 일하고있다.PreparedStatement가 실행하려고하는 전체 쿼리를 가져올 수 있습니까?

예 :

String myQuery = "select id from user where name = ?"; 
PreparedStatement stmt = sqlConnection.prepareStatement(myQuery); 
stmt.setString(1, "test"); 
stmt.executeQUery(); 
ResultSet rs = stmt.getResultSet(); 

가 어떻게 MySQL 서버에서 실행하는 것입니다 전체 SQL 쿼리를받을 수 있습니까?

감사합니다.

답변

11

JDBC 사양에는 필수 사항이 아니지만 PreparedStatementtoString은 실행될 쿼리 정렬을 반환하고 MySQL의 Connector/J는 이러한 동작을 수행합니다 (또는 적어도 몇년 전).

String myQuery = "select id from user where name = ?"; 
PreparedStatement stmt = sqlConnection.prepareStatement(myQuery); 
stmt.setString(1, "test"); 
System.out.println(stmt); // May do what you want! 
+0

감사합니다! stmt.toString()이 문제를 해결했습니다. – ufk

+0

stmt.toString()이 작동하지 않는 경우이 문서에서 제공하는 솔루션을 따르십시오. http://www.javaworld.com/javaworld/jw-01-2002/jw-0125-overpower.html?page= 1 –

+0

Postgres 드라이버 (9.1)에서도 작동합니다. –

3

Java는 생성자가 아닙니다. Prepared 문은 MySQL 내에서 지원되므로 Java는 매개 변수와 함께 실제 매개 변수화 된 SQL ("name =?"사용자의 select ID)을 매개 변수와 함께 MySQL에 직접 전송합니다.

+0

실제로 일부 JDBC 드라이버는 클라이언트 측에서 작업을 수행하고 서버에 완전히 매개 변수화 된 쿼리를 전송합니다 (MySQL 드라이버가 어떤 방식으로 사용하는지 모릅니다). 어쨌든 "완전한"SQL 문을 얻는 표준화 된 방법은 없습니다. –

+0

@Joachim Sauer : MySQL Connector/J 3.1 이상은 서버 측 준비 문을 사용자에게 제공합니다. – Powerlord

3

무엇인지 알려줄 수 있습니다. MySQL은 server-side prepared statements을 지원하기 때문입니다

PREPARE stmt FROM 'select id from user where name = ?' 
SET @a = 'test' 
EXECUTE stmt USING @a 

: 당신이 커넥터/J 3.1 이상으로 MySQL을 4.1 이상을 사용하는 경우, 그것은 뭔가를 할 것이다.

당신은 정말 실행됩니다 쿼리를 얻을 수 있지만 데이터베이스가 당신을 위해 호출을 기록합니다 로그의 API가

4

(는 바이너리 프로토콜을 사용하지만이 코드는 점을 만들기 위해 그냥 가능성) log4jdbcp6spy입니다.

2

안녕하세요 PreparedStatement의에서 SQL을 가져 다음 코드를 구현합니다. 항아리와 드라이버를 사용할 필요가 없습니다. 여기에 모든 대답에서

public void printSqlStatement(PreparedStatement preparedStatement, String sql) throws SQLException{ 
     String[] sqlArrya= new String[preparedStatement.getParameterMetaData().getParameterCount()]; 
     try { 
       Pattern pattern = Pattern.compile("\\?"); 
       Matcher matcher = pattern.matcher(sql); 
       StringBuffer sb = new StringBuffer(); 
       int indx = 1; // Parameter begin with index 1 
       while (matcher.find()) { 
      matcher.appendReplacement(sb,String.valueOf(sqlArrya[indx])); 
       } 
       matcher.appendTail(sb); 
       System.err.println("Executing Query [" + sb.toString() + "] with Database[" + "] ..."); 
       } catch (Exception ex) { 
        System.err.println("Executing Query [" + sql + "] with Database[" + "] ..."); 
      } 

    } 
0

약간 다른 접근 방법, 이클립스에서 디버깅 옵션을 잘 알고있는 경우

. 당신이 시도 할 수 있습니다 다음

  1. 오른쪽 응용 프로그램을 클릭 stmt.executeQUery();

  2. 에서 중단 점을 설정, Debug As 즉이 SpringBoot 앱 등이있을 수 있습니다 귀하의 경우 적용 할 수있는 무엇이든 Java Application (또는 선택 말할

  3. 질문에 언급 된 코드로 안내하는 단계 수행

  4. Variables tab을이클립스의, 당신은 당신이 필요로하는 모든 SQL 쿼리 것 stmt의 값으로 볼 무엇이든

  5. (코드에 따라) myQuery, stmt 같은 변수를 찾을 수 있습니다.이 변수를보고 계속하지 않으려면

또한, 항상 당신은 Java Logging을 시도하고 로그에 전체 SQL 쿼리를 인쇄 할 수 있습니다.

관련 문제