Affichage des données de la base de données dans JTable
Je suis en train d'écrire un programme à l'aide de jdbc qui sera une interface de base de données(qch comme application CRUD). Je suppose que je dois écrire une classe(par exemple,DBCLass
) qui permettra de faire toutes les opérations avec la base de données(select, update, insert, delete
et peut-être une autre logique qui sera réduite à ces opérations). L'interface utilisateur se compose d'un ensemble de tables et de quelques boutons. L'utilisation d'un Jtable j'ai besoin d'implémenter une classe e.g Model
) qui est une sous-classe AbstractTableModel. Afin que cette classe affiche mes données à l'utilisateur. J'ai besoin de mettre en œuvre un tel modèle pour toutes les tables de ma base de données de schéma. Je ne veux pas écrire la logique dans les classes qui affichent des données de l'utilisateur et je pense qu'il n'est pas très bonne chose pour écrire le code de la logique dans ces classes. Mais il est également incorrect de charger toutes les données de la table db à la mémoire(par exemple, liste de tableaux), puis l'afficher dans Model
.
Donc, je veux un conseiller qui est la meilleure façon de résoudre ce type de problème.
edit:
Un petit exemple:
Statement stmt = ....;
ResaultSet rs = stmt.executeQuery("SELECT * FROM table1");
javadoc dit que la méthode executeQuery retourne un jeu de résultats à l'objet qui contient les données produites par la requête donnée. Donc, Si nous avons beaucoup de données(dont la taille est plus que permis de gagner en taille de notre machine virtuelle), notre programme va échouer.
Donc ma question est toujours d'actualité
OriginalL'auteur maks | 2011-03-18
Vous devez vous connecter pour publier un commentaire.
Télécharger la source pour SQuirreL SQl et avoir un regard sur le tableau de mise en œuvre.
Des choses à noter:
Tables de base de données ne sont pas Java JTables. Une table dans une base de données est en fait un ensemble (la malédiction de l'imbécile qui a utilisé le mauvais terme) avec les éléments et chaque élément possède des propriétés (généralement appelé "colonnes" qui n'est pas un JColumn ce qui explique pourquoi il est si dur à la carte les deux).
Un ensemble peut atteindre n'importe quelle taille. Il n'a pas d'ordre intrinsèque. Vous pouvez faire beaucoup d'opérations définies comme: union, différence, sous-ensemble.
Par conséquent, il est pas une table, surtout pas d'une INTERFACE utilisateur table.
Il n'est pas facile de l'INTERFACE utilisateur paradigme qui cartes "set" à la "table". Vous pouvez
Charge des enregistrements N et page dans les résultats.
Vous pouvez charger plus que l'utilisateur fait défiler
Vous pouvez compter la taille de l'ensemble et ajuster la barre de défilement en conséquence. En tant que l'utilisateur fait défiler à travers les données, il est récupérée à partir de la base de données et affichées.
Pour + contre:
Solution 1 est la plus simple à mettre en œuvre, et celui qui les utilisateurs déteste le plus. Pourquoi ont-ils besoin d'attendre pour voir à nouveau des données lorsque les revenir en arrière? C'est particulièrement frustrant si chaque extraction prend 15 secondes. Page ... attendez ... page ... oups! Il était là! Putain! Attendre attendre attendre ... back ... attendez ... aaargh.
Également des bases de données ont souvent un moment difficile à la page de données. Pour certaines requêtes, les performances peuvent être désastreuses.
La Solution 2 est simple à mettre en œuvre, surtout si vous pouvez garder la
ResultSet
jamais ouvert. Mais 100% du temps, vous ne pouvez pas. Il va commencer à manquer si vous la laisser ouverte pour quelques heures ou une journée. Après ce temps, la DB va penser "oh, c'est mort Jim" et de fermer la connexion et votre utilisateur recevra un joli message d'erreur et vous obtiendrez une colère utilisateur.Si vous avez besoin de la page ici, aussi, mais pas aussi souvent. Sur le côté positif, les utilisateurs n'ont pas besoin d'attendre de nouveau pour les données qu'ils ont déjà. Un énorme point: Si l'ensemble contient des millions de lignes, les utilisateurs comprennent intuitivement qu'ils ont besoin d'attaquer le problème sous un angle différent qu'ils ont faites défiler vers le bas. Finalement, ils seront fatigués et demander une meilleure solution (au lieu d'être en colère contre vous parce que votre stupide programme ne peut pas afficher de 15 millions de lignes en moins de 0.0000000001 s).
Solution 3 est pire que le #2, encore une fois. Si le tableau grandit, l'INTERFACE utilisateur sera inutilisable: Même en cherchant à faire défiler savez vous déplacer à un endroit aléatoire dans le tableau. Il rend votre souris inutile. Et vos utilisateurs en colère.
Donc j'ai l'habitude de tenter une solution:
Lit de 1000 lignes, max. De Plus j'ai arrêter au bout de 100 lignes (de sorte que l'utilisateur dispose d'au moins certaines données), si la lecture des lignes prend plus de 1 seconde. Généralement, la requête est lente et la lecture de l'ensemble de résultats prend pratiquement pas de temps, mais j'aime être défensif ici.
Sur le dessus de chaque colonne est un filtre et un "order by" qui peuvent être mappées directement en SQL. De cette façon, je peux vous assurer que si vous voulez que les données triées en fonction d'une colonne, c'est trié par toutes les valeurs (et pas seulement ceux que vous pouvez voir sur l'écran).
Cela permet aux utilisateurs de couper de grandes quantités de données pertinentes à des sous-ensembles.
Oui, mais c'est lent si la requête est plus complexe. Je suggère d'insérer un cache entre la table et la base de données qui peut retenir, disons, 100 lignes.
OriginalL'auteur Aaron Digulla
Table De Base De Données a quelques idées.
OriginalL'auteur camickr
Maks,
Voici un autre exemple sur sql générique à la table de mise en œuvre:
http://www.oreillynet.com/pub/a/oreilly/java/news/javaex_1000.html
Il peut être un bon endroit pour chercher votre réponse.
Aussi, ce local de question/réponse, peut vous aider à ResultSet taille: Java JDBC Chargement Paresseux ResultSet
Espère que cette aide,
Robert
OriginalL'auteur R. Simac
Ce blog explique comment paresseux pour charger des données dans un modèle de table: JTable Lié à une Base de données Avec le Chargement Paresseux
OriginalL'auteur Aaron Digulla
Vous souhaitez utiliser le
DBTable
composant de la QuickTable projet.Cochez cette DONC réponse avec des exemples de l'utilisation de code.
OriginalL'auteur Stephan
Voici une classe qui extrait des données de lignes et de colonnes à partir de la base de données.
Regarder table = new JTable(lignes(), les colonnes());
Vous chargez trou de données de table de base de données de la mémoire. Si vous avez 1 million de disques dans votre table, votre programme ne fonctionnera pas
OriginalL'auteur Ali Ben Messaoud