首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从java.sql.PreparedStatement获取查询

从java.sql.PreparedStatement获取查询
EN

Stack Overflow用户
提问于 2010-04-21 21:21:13
回答 7查看 352.3K关注 0票数 180

在我的代码中,我使用了java.sql.PreparedStatement

然后,我执行setString()方法来填充预准备语句的通配符。

在调用executeQuery()方法并执行查询之前,有没有办法检索(并打印出)最终的查询?我只是想要这是为了调试的目的。

EN

回答 7

Stack Overflow用户

发布于 2010-04-21 21:31:26

在设置了绑定值之后,您可以尝试在准备好的语句上调用toString()

代码语言:javascript
复制
PreparedStatement query = connection.prepareStatement(aSQLStatement);
System.out.println("Before : " + query.toString());
query.setString(1, "Hello");
query.setString(2, "World");
System.out.println("After : " + query.toString());

当您使用JDBC MySQL驱动程序时,这是有效的,但我不确定在其他情况下是否有效。您可能需要跟踪您所做的所有绑定,然后打印出来。

以上代码的输出示例。

代码语言:javascript
复制
Before : com.mysql.jdbc.JDBC4PreparedStatement@fa9cf: SELECT * FROM test WHERE blah1=** NOT SPECIFIED ** and blah2=** NOT SPECIFIED **
After : com.mysql.jdbc.JDBC4PreparedStatement@fa9cf: SELECT * FROM test WHERE blah1='Hello' and blah2='World'
票数 31
EN

Stack Overflow用户

发布于 2014-07-14 18:18:58

对于那些正在寻找Oracle解决方案的人,我从Log4Jdbc的代码中创建了一个方法。您将需要提供传递给preparedStatement的查询和参数,因为从它检索它们有点麻烦:

代码语言:javascript
复制
private String generateActualSql(String sqlQuery, Object... parameters) {
    String[] parts = sqlQuery.split("\\?");
    StringBuilder sb = new StringBuilder();

    // This might be wrong if some '?' are used as litteral '?'
    for (int i = 0; i < parts.length; i++) {
        String part = parts[i];
        sb.append(part);
        if (i < parameters.length) {
            sb.append(formatParameter(parameters[i]));
        }
    }

    return sb.toString();
}

private String formatParameter(Object parameter) {
    if (parameter == null) {
        return "NULL";
    } else {
        if (parameter instanceof String) {
            return "'" + ((String) parameter).replace("'", "''") + "'";
        } else if (parameter instanceof Timestamp) {
            return "to_timestamp('" + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS").
                    format(parameter) + "', 'mm/dd/yyyy hh24:mi:ss.ff3')";
        } else if (parameter instanceof Date) {
            return "to_date('" + new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").
                    format(parameter) + "', 'mm/dd/yyyy hh24:mi:ss')";
        } else if (parameter instanceof Boolean) {
            return ((Boolean) parameter).booleanValue() ? "1" : "0";
        } else {
            return parameter.toString();
        }
    }
}
票数 24
EN

Stack Overflow用户

发布于 2012-05-15 20:00:59

您可以将log4jdbc添加到项目中。这增加了sql命令执行时的日志记录,以及许多其他信息。

http://code.google.com/p/log4jdbc/wiki/FAQ

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2683214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档