Подтвердить что ты не робот

Как программно создавать Java ResultSet из пользовательских данных без базы данных

У меня есть код, который принимает java.sql.ResultSet, который содержит информацию, полученную из базы данных Oracle. Теперь я хотел бы повторно использовать этот код, но я хотел бы передать ему объект ResultSet, который я создаю себе из некоторых данных в памяти, которые не связаны с какой-либо базой данных. Есть ли существующий класс Java-среды, который я могу использовать для этого? ResultSet имеет множество методов, поэтому реализация моего собственного класса для этого показалась излишним, хотя я мог игнорировать большинство методов для моего конкретного случая.

Я думал о чем-то вроде старого объекта Microsoft ADO recordset, где я мог создавать поля, а затем заполнять данные строк для каждого поля. Это казалось легкомысленным вопросом, но я не смог найти хороших указателей.

4b9b3361

Ответ 1

  • Создайте свой собственный класс AbstractResultSet, который (например, AbstractQueue) реализует все методы, бросая UnsupportedOperationException (Eclipse автоматически генерирует эти методы за одну секунду).
  • Теперь расширяем AbstractResultSet. Подкласс может переопределять только те методы, которые вам интересны при реализации.

Ответ 2

Это немного левое поле, но вы можете использовать фальшивую фреймворк (например, JMock). Эти рамки обычно предназначены для создания ложных реализаций интерфейсов для модульного тестирования, но я не вижу причин, по которым вы могли бы использовать их для создания "частичной реализации" java.sql.ResultSet.

Например, скажем, вы только хотели реализовать метод getString(), и ничего больше:

Mockery mockery = new Mockery();
final ResultSet resultSet = mockery.mock(ResultSet.class);

mockery.checking(new Expectations() {{
    allowing(resultSet).getString(1); will(returnValue("my first string"));
    allowing(resultSet).getString(2); will(returnValue("my second string"));
}});

// resultSet is now a java.sql.ResultSet object, which you can pass to your legacy code
resultSet.getString(1);

Скорее неортодоксальный и довольно громоздкий, но он должен работать

Ответ 4

java.sql.ResultSet - это интерфейс, поэтому вы можете создать свой собственный класс, который реализует этот интерфейс.

Ответ 5

Моим первым вариантом было бы реорганизовать код так, чтобы он взял List < Map < String, Object → > или что-то подходящее (то есть List < Map < String, Object > gt;), если перемещаемые данные не имеют реальной структуры или полностью типизированных объектов, если она имеет структуру).

Если это невозможно или эффективно, "забавный" взлом - это запросить базу данных H2 в памяти, чтобы получить ResultSet. Если вы не найдете разумного заглушки для ResultSet, вы можете легко создать экземпляр, это может быть быстрее, чем опрокинуть ваш собственный (вытащите банку, напишите 20 строк кода для создания db и заполнив таблицу).

Ответ 6

Я обычно не отвечаю на java-вопросы, так как я не разработчик Java, но это похоже на архитектурный недостаток, если вам нужно создать объект sql из кода, чтобы перейти в метод, чтобы переработать метод. Я бы подумал, что вы хотите, чтобы ваш метод приема принял другую более конкретную форму ввода (например, настраиваемый массив объектов), чтобы сделать ее повторно используемой, а затем проанализировать вашу ResultData в этом формате.