9
votes

Quel type de structure de données devrais-je utiliser pour contenir des rangées de table?

Je suis nouveau à Java et je me rappelle simplement à interroger des bases de données. Jusqu'à présent, j'ai mes résultats dans un Restaurantstadata . Je pense que pour chaque ligne de l'ensemble de données, je devrais l'ajouter à une forme de collection? Quelqu'un peut-il me dire la meilleure pratique pour cela?

merci,
Jonesy


1 commentaires

Vos résultats sont probablement dans un résultateur plutôt qu'à des résultatsettadata.


8 Réponses :


6
votes

A Liste semble assez logique. Si vous n'allez pas avoir des duplicats et que vous n'êtes pas dérangé de l'ordre des résultats, alors peut-être un définir .

une implémentation pertinente de la liste :

  • ArrayList : Ceci est soutenu par un tableau, les recherches sur certains indices doivent être rapides

    implémentations pertinentes de définir :

    • hashset : soutenu par un hashmap donc o (1) temps d'insertion
    • arbreset : respecte la commande des données (à l'aide de la méthode comparète ) - ainsi itérant sur les données sera en ordre - le commerce est o (journal n) temps d'insertion

0 commentaires

1
votes

Vous pouvez créer une classe qui représente des entités du monde réelles. Plus tard, si vous souhaitez choisir une technologie / outil ou un outil comme Hibernate, vous pouvez utiliser les mêmes classes.


0 commentaires

8
votes

Créer un objet pour contenir les données. Boucle à travers les Resultset, créant un objet pour chacun, et stockez-les dans une arraylist ou HASHMAP, en fonction de la manière dont vous souhaitez utiliser les données. Cela vous permet de fermer la base de données et vous donne de bons objets sur lesquels vous pouvez créer des méthodes pour manipuler les données.

Il vous permet également d'écrire du code qui utilise l'objet qui n'a pas besoin de s'appuyer sur la base de données. Si vous souhaitez jamais sortir la base de données ultérieurement et passer aux fichiers texte ou quoi que ce soit, il est facile de le faire et vous pouvez toujours utiliser les mêmes objets et méthodes.


2 commentaires

Merci Erick. J'ai une table d'utilisateurs. J'ai fait une classe appelée afficheurs avec un constructeur pour récupérer les utilisateurs. Pour chaque utilisateur renvoyé dois-je créer un nouvel objet d'utilisateur de classe par exemple?


Ouais, quelque chose qui a les mêmes propriétés que les champs de la table de base de données ont du sens. De plus, typiquement, l'objet a un nom très similaire au nom de la table de base de données. J'utilise une classe de base de données distincte qui implémente des interfaces source pour les types de données que je veux tirer. Mais j'utilise très lourdement la base de données pour beaucoup de modules différents et je veux être source-agnostique.



1
votes

Premier, le RestaurantsTametadata classe Contient des informations sur les types et les propriétés des colonnes d'un objet ResultSet. " Donc, les résultats de votre requête sont dans les Resultset, pas dans l'objet RestaurantsTataData.

Vous pouvez voir le Récupération de valeurs des ensembles de résultats Didacticiel Java Pour plus d'informations sur la manière d'extraire vos données d'un résultateur. Vous devriez être capable de simplement faire boucler les Resulats, comme indiqué et placez vos enregistrements dans une liste ou une carte, en fonction de la manière dont vous souhaitez accéder aux données ultérieurement.


0 commentaires

7
votes

Habituellement, nous avons une classe avec des champs correspondant à une table. Ensuite, chaque fois que nous avons une ligne (complète) dans un ensemble de résultats, nous créons une instance de cette classe.

Exemple:

Considérez une table créée comme ceci: < / p> xxx

une classe de modèle serait comme ceci: xxx

maintenant si vous lisez des données et avez des résultatsset, vous créeriez Un nouvel objet client et définir les champs: xxx


8 commentaires

Dans cette situation, la requête doit-elle être dans la même classe que le code de création d'objets?


Non, mais je le conçois de cette façon, à moins que l'application ne soit aussi grande que la requête de séparation et la création d'instances de modèle. La liste peut être créée ailleurs, l'a ajouté là-bas pour montrer un extrait brève et tout à fait complet.


Ok merci, une autre question si cela ne vous dérange pas. Une fois que j'ai créé un objet de chaque enregistrement. Quel genre de choses puis-je faire avec cet objet? Typiquement c'est ..


Vous pouvez présenter les données sur une vue (formulaire, table, ...) ou créer un éditeur pour modifier les lignes de table DB existantes (via l'objet de modèle) ou créer de nouvelles entrées de table.


Merci dernière question que je jure! Je boucle à travers chaque ligne de création de l'objet puis de l'ajouter à une arrayliste. Je ferme ensuite la connexion de base de données. Je sais que tu veux accéder à mes objets à travers la flambée du tableau. Comment puis-je faire cela? Je ne peux que sembler imprimer l'emplacement des objets


Implémenter Tostring si vous voulez system.out.println (modèle) pour donner un résultat utile. J'ai édité mon code pour une base pour montrer une implémentation simple.


merci, alors comment puis-je boucler à travers chaque objet et afficher, disons que le prénom seulement. Puis encore avec le premier et le dernier?


Appelez simplement les six méthodes de getter (j'ai déjà ajouté une implémentation pour le champ FirstName, le reste est le même modèle). Nous ne faisons généralement pas de boucle dans les champs de modèle, nous appelons les getters. (dernière réponse ici - Veuillez ouvrir de nouvelles questions sur SO :-))



1
votes

Je suis généralement le même modèle que Andreas_d décrit.

L'objet utilisé pour contenir chaque ligne de données (dans ce cas, la classe client) est appelée objet de transfert de données (à).

Le code qui obtient la connexion à la base de données, interroge la base de données, remplit le TOS et les renvoie (généralement dans une liste), est appelé objet d'accès aux données (DAO).

Vous pouvez en savoir plus sur ce modèle de conception ici


0 commentaires

0
votes

Beaucoup de réponses ci-dessus conseils créant une classe pour contenir les colonnes d'une ligne et créer une liste de matrices des objets de classe. Ne devrions-nous pas nous inquiéter si le jeu de résultats est énorme, bien que seules moins de lignes soient traitées, ne cumulez pas de la mémoire consommée à moins que le collecteur des ordures ne recueille au même rythme auquel les objets sont créés.


0 commentaires

0
votes

J'ai eu cette question avec un résultateur qui comptait quelques douzaines de colonnes, écrire une classe avec tant de membres de nombreux membres travaillaient beaucoup trop pour me paresseux. J'ai donc itérisé les Resulatset à chaque champ dans un HASHMAP, l'étiquette de la colonne la clé et le champ étant la valeur. Puis chacun placez tous les hachées de chaque ligne dans une liste séparée et toutes les listes dans une liste principale.

a travaillé comme un charme. P>

 public MyTable makeChanges(){
    for(int i = 0; i < allRecords.size(); i++){
        Date startDate = (Date) allRecords.get(i).stream().filter((HashMap<String, Object> field) -> field.containsKey("StartDate")).findFirst().get().get("StartDate");
        int product = (int) allRecords.get(i).stream().filter((HashMap<String, Object> field) -> field.containsKey("pk_Product")).findFirst().get().get("pk_Product");
        // now do something....
    }
    return this;
}


0 commentaires