如何为Dropwizard应用程序记录/打印查询和参数?

时间:2016-08-02 16:00:56

标签: dropwizard jdbi

我使用@BindBean与sql查询绑定。 我可以看到使用" org.skife.jdbi.v2":TRACE只会给我带参数的查询为"?"有什么想法我可以打印所有?

2 个答案:

答案 0 :(得分:1)

您可以通过编写SqlCustomizer来记录sql。

import org.skife.jdbi.v2.StatementContext;
import org.skife.jdbi.v2.sqlobject.SqlStatementCustomizer;
import org.skife.jdbi.v2.sqlobject.SqlStatementCustomizerFactory;
import org.skife.jdbi.v2.sqlobject.SqlStatementCustomizingAnnotation;
import org.skife.jdbi.v2.tweak.StatementCustomizer;

import java.lang.annotation.*;
import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.sql.SQLException;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SqlStatementCustomizingAnnotation(LogSqlFactory.Factory.class)
public @interface LogSqlFactory {

    static class Factory implements SqlStatementCustomizerFactory {

        @Override
        public SqlStatementCustomizer createForMethod(Annotation annotation, Class sqlObjectType, Method method) {
            return null;
        }

        @Override
        public SqlStatementCustomizer createForType(Annotation annotation, Class sqlObjectType) {
            return q -> q.addStatementCustomizer(new StatementCustomizer() {
                @Override
                public void beforeExecution(PreparedStatement stmt, StatementContext ctx) throws SQLException {
                    System.out.println(stmt.toString());
                }

                @Override
                public void afterExecution(PreparedStatement stmt, StatementContext ctx) throws SQLException { }

                @Override
                public void cleanup(StatementContext ctx) throws SQLException { }
            });
        }

        @Override
        public SqlStatementCustomizer createForParameter(Annotation annotation, Class sqlObjectType, Method method, Object arg) {
            return null;
        }
    }

}

只需包含此注释并在SqlObject中使用它。在您的情况下,使用此注释,

@LogSqlFactory 
public inteface myinteface{
@SqlQuery("select :c1 from tablename where cond = :cd")
   String returnMeValue(@Bind("c1") String c1, @Bind("cd") Integer cd);
}

如果使用自定义记录器进行记录,则使用beforeExecution方法。

答案 1 :(得分:0)

您使用的是Dropwizard的DBIFactory吗?它将JDBI配置为以开箱即用的方式记录。