2010-01-12 16 views
24

Tengo un código existente que acepta un java.sql.ResultSet que contiene información recuperada de una base de datos Oracle. Ahora me gustaría reutilizar este código, pero me gustaría pasarle un objeto ResultSet que yo mismo creo a partir de algunos datos en memoria que no están afiliados a ninguna base de datos. ¿Existe una clase de framework Java existente que pueda usar para esto? ResultSet tiene muchísimos métodos, por lo que implementar mi propia clase para esto me pareció excesivo, aunque podía ignorar la mayoría de los métodos para mi caso específico.Cómo crear mediante programación un Java ResultSet a partir de datos personalizados sin base de datos

Estaba pensando en algo similar al antiguo objeto del conjunto de registros Microsoft ADO, donde podía crear los campos y completar los datos de fila para cada campo. Esta parecía una pregunta fácil de hacer, pero no he podido encontrar ningún buen puntero.

+1

¿Qué es 'java.sql.ResultData'? – skaffman

+0

Heh. Gracias ... Incluso después de corregir, estúpidamente lo llamé 'ResultData' en lugar de' ResultSet' ... ¡de vuelta a la edición ahora! –

+0

Esto podría ayudar también: http://stackoverflow.com/questions/878848/easy-way-to-fill-up-resultset-with-data –

Respuesta

15
  • Cree su propia clase AbstractResultSet , uno que (como AbstractQueue) implementa todos los métodos lanzando UnsupportedOperationException (Eclipse autogenera estos métodos en una fracción de segundo).
  • Ahora extienda AbstractResultSet. La subclase solo puede anular los métodos que le interesan implementar.
+0

Gracias. Terminé yendo por esta ruta. La clase AbstractResultSet es una buena capa para usar para el ruido de todas las instrucciones 'throw', y la clase de implementación final solo puede contener un código significativo. –

+0

Creé una esencia con eso https://gist.github.com/vilaca/3800337ccabea28a75d9165aaddefc9f –

0

Normalmente no respondo preguntas de Java, ya que no soy un desarrollador de Java, pero esto parece un defecto arquitectónico si necesita crear un objeto sql del código para pasar a un método con el fin de reciclar un método . Creo que le gustaría hacer que su método de recepción acepte alguna otra forma más específica de entrada (como una matriz de objetos definida personalizada) para que sea reutilizable, y luego analizar su ResultData en ese formato.

+0

Oops ... quise decir 'ResultSet ', y es una interfaz bastante que una clase concreta, así que pensé que estaría bien. ResultSet puede ser bastante variable en su contenido, por lo que hacer una lista no parece ser la mejor opción. –

1

Mi primera opción sería la de refactorizar el código para que se tarda Lista < Mapa < String, Object > > o algo apropiado (es decir, la lista de < Mapa < String, Object > > si los datos que se mueve alrededor no tiene estructura real u objetos completamente tipados si tiene estructura).

Si eso no es factible o eficiente en el tiempo, el truco "divertido" es consultar una base de datos H2 en memoria para obtener un ResultSet. Si no encuentra un talón razonable para ResultSet, puede crear instancias fácilmente, puede ser más rápido que rodar el suyo (arrastre el frasco, escriba 20 líneas de código para crear el DB y rellene una tabla).

+0

De acuerdo, eso es lo que estaba tratando de obtener en términos de java. +1 –

2

java.sql.ResultSet es una interfaz, por lo que podría crear su propia clase que implemente esa interfaz.

+1

Explicó explícitamente que implementar ResultSet es mucho trabajo (realmente lo es). – alex

+1

+1, aunque tiene una carga de métodos # & *! –

+0

Sería si estás tratando de lograr todas las funcionalidades de las clases ResultSet específicas de la base de datos, pero si solo estás intentando imitar un ResultSet para algunos casos específicos, entonces no debería ser difícil en absoluto. Es como él dijo. Él podría ignorar la mayoría de los métodos. – rayd09

7

Esta es una solución ligeramente de campo izquierdo, pero puede hacer uso de un marco de burla (por ejemplo, JMock). Estos marcos generalmente están destinados a la creación de implementaciones simuladas de interfaces para pruebas unitarias, pero no veo ninguna razón por la que pueda usar una para crear una "implementación parcial" de java.sql.ResultSet.

Por ejemplo, digamos que solo quería poner en práctica el método getString(), y nada más:

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

poco ortodoxo, y bastante engorroso, pero debería funcionar

Cuestiones relacionadas