2010-08-18 11 views
9

Soy nuevo en Java y estoy empezando a consultar bases de datos. Hasta ahora tengo mis resultados en un ResultSetMetaData. Creo que para cada fila en el conjunto de datos, ¿debería agregarlo a alguna forma de colección? ¿Alguien puede decirme la mejor práctica para esto?¿Qué tipo de estructura de datos debo usar para mantener las filas de la tabla?

Gracias,
Jonesy

+0

Sus resultados son probables en un conjunto de resultados en lugar de un ResultSetMetaData. –

Respuesta

6

Normalmente tenemos una clase con campos que corresponden a una tabla. Luego, cada vez que tenemos una fila (completa) en un conjunto de resultados, creamos una instancia de esta clase.

Ejemplo:

Considérese una tabla creada de esta manera:

CREATE TABLE customer (First_Name char(50), Last_Name char(50), 
    Address char(50), City char(50), Country char(25), Birth_Date date); 

Una clase de modelo sería así:

public class Customer { 
    private String firstName; 
    private String lastName; 
    private String address; 
    private String city; 
    private String country; 
    private Date date; 


    public String getFirstName() { 
    return firstName; 
    } 
    // getters for all fields 

    public void setFirstName(String firstName) { 
    this.firstName = firstName; 
    } 
    // setters for all fields 

    public String toString() { 
    return String.format("[%s, %s, %s, %s, %s, %s]", firstName, 
      lastName, address, city, country, date); 
    } 
} 

Ahora si usted lee los datos y tener un conjunto de resultados , crearía un nuevo objeto de cliente y establecería los campos:

List<Customer> customers = new ArrayList<Customer>(); 
ResultSet rs = stmt.executeQuery("SELECT * from CUSTOMER;"); 
while (rs.next()) { 
    Customer customer = new Customer(); 
    customer.setFirstName(rs.get("First_Name")); 
    // ... and so on 

    customers.add(customer); 
} 
+0

en esta situación, ¿la consulta debe estar dentro de la misma clase que el código de creación del objeto? – iamjonesy

+0

No, pero lo diseñaría de esa manera, a menos que la aplicación sea tan grande que separe la consulta y la creación de instancias modelo. La lista se puede crear en otro lugar, simplemente se agregó allí para mostrar un fragmento breve y bastante completo. –

+0

ok gracias, otra pregunta si no te importa. Una vez que he creado un objeto de cada registro. ¿Qué tipo de cosas puedo hacer con ese objeto? normalmente es .. – iamjonesy

5

Un List parece bastante lógico. Si no va a tener duplicados, y no le molesta el orden de los resultados, entonces quizás un Set.

Una implementación correspondiente de List:

  • ArrayList: Esto está respaldado por una matriz, por lo que las búsquedas sobre índices particulares debe ser rápido

implementaciones relevantes de Set:

  • HashSet: respaldado por un HashMap así que O(1) inserción tiempo
  • TreeSet: Respeta el orden de los datos (utilizando el método compareTo) - por lo que se itera sobre los datos será el fin - el comercio minorista es el tiempo O(log n) inserción
1

Puede crear la clase que representa entidades del mundo real. Más tarde, si desea elegir la tecnología/herramienta de ORM, como Hibernate, puede usar las mismas clases.

8

Crea un objeto para contener los datos. Recorra el conjunto de resultados, cree un objeto para cada uno y guárdelos en una ArrayList o HashMap, según cómo desee utilizar los datos. Esto le permite cerrar la base de datos y le proporciona buenos objetos sobre los cuales puede construir métodos para manipular los datos.

También le permite escribir código que usa el objeto que no necesita depender de la base de datos. Si alguna vez desea extraer la base de datos más tarde y cambiar a archivos de texto o lo que sea, es fácil de hacer y aún puede usar los mismos objetos y métodos.

+0

gracias Erick. Tengo una tabla de usuarios. Hice una clase llamada DisplayUsers con un constructor para recuperar a los usuarios. para cada usuario devuelto debería crear un nuevo objeto de clase de Usuario, por ejemplo? – iamjonesy

+0

Sí, algo que tiene las mismas propiedades que los campos de la tabla de la base de datos tiene sentido. Además, normalmente, el objeto tiene un nombre muy similar al nombre de la tabla de la base de datos. Utilizo una clase de base de datos separada que implementa interfaces de origen para los tipos de datos que quiero extraer. Pero utilizo la base de datos en gran medida para muchos módulos diferentes y quiero ser independiente de la fuente. –

1

En primer lugar, la clase ResultSetMetaData contiene "información sobre los tipos y propiedades de las columnas en un objeto ResultSet". Por lo tanto, los resultados de su consulta se encuentran en el ResultSet, no en el objeto ResultSetMetaData.

Puede ver el tutorial de Java Retrieving Values from Result Sets para obtener información sobre cómo extraer sus datos de un ResultSet. Debería poder recorrer el ResultSet como se muestra y colocar sus registros en una lista o mapa, según cómo desee acceder a los datos más adelante.

1

Suelo seguir el mismo patrón que describe Andreas_D.

El objeto utilizado para contener cada fila de datos (en este caso, la clase Cliente) se conoce como Objeto de transferencia de datos (TO).

El código que obtiene la conexión de la base de datos, consulta el db, completa los TO y los devuelve (normalmente en una lista), se denomina objeto de acceso a datos (DAO).

Puede leer más sobre este patrón de diseño here

Cuestiones relacionadas