2010-08-18 8 views

risposta

6

Di solito abbiamo una classe con campi che corrispondono a una tabella. Quindi, ogni volta che abbiamo una riga (completa) in un set di risultati, creiamo un'istanza di questa classe.

Esempio:

consideri una tabella creata in questo modo:

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

modello di una classe sarebbe come questo:

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

Ora, se si leggere i dati e hanno un ResultSet , dovresti creare un nuovo oggetto cliente e impostare i campi:

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

in questa situazione la query deve trovarsi nella stessa classe del codice di creazione dell'oggetto? – iamjonesy

+0

No, ma lo progetterei in questo modo, a meno che l'applicazione non sia così grande da separare la query e la creazione delle istanze del modello. L'elenco può essere creato altrove, ma è stato aggiunto qui per mostrare un breve e abbastanza completo snippet. –

+0

ok grazie, un'altra domanda se non ti dispiace. Una volta creato un oggetto per ogni record. che genere di cose posso fare con quell'oggetto? tipicamente questo è .. – iamjonesy

5

Un List sembra abbastanza logico. Se non hai intenzione di avere duplicati, e non sei preoccupato per l'ordine dei risultati, allora forse un Set.

Un rilevante attuazione List:

  • ArrayList: Questo è supportato da una matrice, così le ricerche su particolari indici dovrebbe essere rapido

implementazioni pertinenti Set:

  • HashSet: supportato da un HashMap quindi O(1) inserimento tempo
  • TreeSet: rispetta l'ordinamento dei dati (utilizzando il metodo compareTo) - quindi l'iterazione sui dati sarà in ordine - il compromesso è il tempo O(log n) inserimento
1

È possibile creare una classe che rappresenta entità del mondo reale. In seguito, se desideri scegliere la tecnologia/lo strumento ORM come ibernazione, puoi utilizzare le stesse classi.

8

Creare un oggetto per contenere i dati. Passa in rassegna il set di risultati, creando un oggetto per ciascuno e archiviandoli in ArrayList o HashMap, a seconda di come desideri utilizzare i dati. Ciò consente di chiudere il database e fornisce oggetti validi su cui è possibile creare metodi per manipolare i dati.

Consente inoltre di scrivere codice che utilizza l'oggetto che non ha bisogno di fare affidamento sul database. Se si desidera estrarre il database in un secondo momento e passare a file di testo o simili, è facile farlo e si possono comunque utilizzare gli stessi oggetti e metodi.

+0

grazie Erick. Ho una tabella di utenti. Ho creato una classe chiamata DisplayUsers con un costruttore per recuperare gli utenti. per ogni utente restituito dovrei creare un nuovo oggetto di classe User, ad esempio? – iamjonesy

+0

Sì, qualcosa che ha le stesse proprietà dei campi nella tabella del database ha senso. Inoltre, in genere, l'oggetto ha un nome molto simile al nome della tabella del database. Io uso una classe di database separata che implementa le interfacce di origine per i tipi di dati che voglio estrarre. Ma io uso il database molto pesantemente per molti moduli diversi e voglio essere indipendente dall'origine. –

1

Innanzitutto, la classe ResultSetMetaData contiene "informazioni sui tipi e le proprietà delle colonne in un oggetto ResultSet". Quindi i risultati della query sono nel ResultSet, non nell'oggetto ResultSetMetaData.

È possibile visualizzare il tutorial Java Retrieving Values from Result Sets per informazioni su come estrarre i dati da un ResultSet. Dovresti essere in grado di eseguire il looping del ResultSet come mostrato e inserire i tuoi record in un elenco o in una mappa, a seconda di come desideri accedere ai dati in seguito.

1

Di solito seguo lo stesso schema descritto da Andreas_D.

L'oggetto utilizzato per contenere ciascuna riga di dati (in questo caso, la classe Customer) viene indicato come oggetto di trasferimento dati (TO).

Il codice che ottiene la connessione al database, richiede il db, popola i TO e li restituisce (in genere in un elenco), viene definito DAO (Data Access Object).

Si può leggere di più su questo modello di progettazione here

Problemi correlati