如何在JDBI sql api中打印@SqlQuery注释

我想知道jdbi sql api处理sql查询究竟是什么用于调试目的。 我的接口类如下

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

然后在另一个类中调用String result = myinterfaceclassobject.returnMeValue("Name",1);

我没有得到预期的答案所以我想看看实际上是什么进入sql查询。 那么有什么方法可以获得最终处理的查询吗?

您可以通过编写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方法。

使用像log4jdbc这样的东西要容易得多,使用Manikandan的方法也会慢慢减慢代码的速度。

但是,如果您仍想使用它并且您的项目语言级别不支持lambdas,则可以使用以下修改:

  @Override public SqlStatementCustomizer createForType(Annotation annotation, final Class sqlObjectType) { return new SqlStatementCustomizer() { @Override public void apply(SQLStatement sqlStatement) throws SQLException { sqlStatement.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 { } }); } }; } 

但是stmt.toString()不保证返回SQL语句,它取决于实现。 这对SQLite不起作用。