* Осторожно: приведенный ниже код приведен в качестве примера. Не имеет
было проверено * Это может нанести вред себе или вашему компьютеру или даже ударить вас
в лицо.
Если вы хотите избежать изменения ваших SQL-запросов, но при этом хотите иметь чистый код (что означает, что ваш код остается поддерживаемым), вы можете разработать решение с использованием оболочек. То есть, используя небольшой набор классов, обертывающих существующие, вы можете достичь того, чего хотите, без проблем для остальной части приложения, которое все еще будет думать, что оно работает с реальным DataSource, Connection и Statement.
1 - реализовать класс StatementWrapper или PreparedStatementWrapper, в зависимости от того, что ваше приложение уже использует. Эти классы являются обертками вокруг обычных экземпляров Statement или PreparedStatement. Они реализуются просто как использование внутреннего оператора в качестве делегата, который выполняет всю работу, кроме случаев, когда это оператор QUERY (метод Statement.executeQuery ()). Только в этой конкретной ситуации оболочка окружает запрос двумя следующими строками: «SELECT * FROM (» и «) WHERE ROWNUM <» + maxRowLimit. Ниже приведен базовый код обертки кода для DataSourceWrapper. </p>
2 - написать еще одну оболочку: ConnectionWrapper, которая оборачивает Connection, который возвращает StatementWrapper в createStatement () и PreparedStatementWrapper в prepareStatement (). Это ранее закодированные классы, которые принимают в качестве аргументов конструкции DelegateConnection.createStatement () / prepareStatement () объекта ConnectionWrapper в качестве аргументов конструкции.
3 - повторите шаг с DataSourceWrapper. Вот простой пример кода.
public class DataSourceWrapper implements DataSource
{
private DataSource mDelegate;
public DataSourceWrapper( DataSource delegate )
{
if( delegate == null ) { throw new NullPointerException( "Delegate cannot be null" );
mDelegate = delegate;
}
public Connection getConnection(String username, String password)
{
return new ConnectionWrapper( mDelegate.getConnection( username, password ) );
}
public Connection getConnection()
{
... <same as getConnection(String, String)> ...
}
}
4 - Наконец, используйте этот DataSourceWrapper в качестве источника данных вашего приложения. Если вы используете JNDI (NamingContext), это изменение должно быть тривиальным.
Кодирование всего этого является быстрым и очень простым, особенно если вы используете интеллектуальную IDE, такую как Eclipse или IntelliJ, которая будет автоматически реализовывать методы делегирования.