Вы можете прокси-объект вашего соединения:
public class ConnectionProxy {
public ConnectionProxy(Object anObject) {
super(anObject);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(target, args);
String methodName = method.getName();
if (methodName.equals("createStatement")) {
result = ProxyBuilder.createProxy(result, new StatementProxy(result));
}
return result;
}
}
для перехвата любого вызова Statement.execute (String sql) :
public class StatementProxy {
public StatementProxy(Object anObject) {
super(anObject);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
return method.invoke(proxy, args);
} catch (SQLException sqle) {
if (method.getName().contains("execute")) {
String sql = "";
if (args != null && args[0] != null) {
sql = args[0].toString();
}
saveToFile(arg);
}
throw sqle;
}
}
}
где ProxyBuilder - простой вспомогательный класс:
public final class ProxyBuilder {
public static Connection tracingConnection(Connection connection) {
return createProxy(connection, new ConnectionProxy(connection));
}
static <T> T createProxy(T anObject, InvocationHandler invocationHandler) {
return createProxy(anObject, invocationHandler, anObject.getClass().getInterfaces());
}
static <T> T createProxy(T anObject, InvocationHandler invocationHandler, Class... forcedInterfaces) {
return (T) Proxy.newProxyInstance(
anObject.getClass().getClassLoader(),
forcedInterfaces,
invocationHandler);
}
}
Конечно, это не ваш окончательный код производства , но это хорошая отправная точка.