Search code examples
dropwizardjdbi

How do I log/print query and param for a Dropwizard application?


I'm using @BindBean to bind with the sql query. I can see using "org.skife.jdbi.v2": TRACE would only give me the query with params as "?" Any idea i can print all ?


Solution

  • You can log the sql by writing SqlCustomizer.

    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;
            }
        }
    
    }
    

    Just include this annotation and use this in SqlObject. In your case use this annotation like this,

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

    If you use custom loggers for logging, then beforeExecution method.