JDBC de la Pagination
Je veux mettre en œuvre la pagination à l'aide de JDBC. La réelle chose que je veux savoir, c'est "Comment puis-je obtenir 50 premiers, puis 50 prochaines enregistrements de base de données pour les pages 1 et 2 respectivement"
Ma Requête est Select * from data
[tableau de données contient plus de 20 000 lignes]
Pour la page #1-je obtenir 50 enregistrements et pour la page #2 je veux obtenir à côté de 50 dossiers. Comment puis-je la mettre en œuvre efficacement dans JDBC?
J'ai cherché et trouvé que rs.absolute(row)
est le moyen de sauter la première page du dossier mais il faut une certaine quantité de temps sur de grands ensembles de résultats et je ne veux pas porter de ce laps de temps. Aussi, je ne veux pas utiliser rownum
et limit
+ offset
dans la requête car ils ne sont pas bon à utiliser dans une requête, je ne sais pas pourquoi, je ne veux pas l'utiliser dans la requête.
Quelqu'un peut m'aider comment faire pour obtenir limitée ResultSet
pour la pagination ou est-il un moyen de JDBC est de nous donner?
Vous devez vous connecter pour publier un commentaire.
Il n'existe pas de moyen efficace de le faire simplement à l'aide de JDBC. Vous devez formuler la limite à n lignes et commencer à partir de la i-ème élément de clauses directement à SQL pour qu'il soit efficace. Selon la base de données cela peut être assez facile (voir MySQL LIMITE-mot-clé), sur d'autres bases de données comme Oracle, il peut être un peu plus délicat (implique une sous-requête et à l'aide de rownum pseudo colonne).
Voir ce JDBC Pagination Tutoriel:
http://java.avdiel.com/Tutorials/JDBCPaging.html
Vous devriez requête seulement les données que vous fait besoin de l'afficher sur la page en cours. Ne pas les courriers de l'ensemble du jeu de données en Java mémoire et puis on le filtre de là. Il ne serait inutilement les choses plus lentement.
Si vous avez un moment difficile dans la mise en œuvre de ce bien et/ou de déterminer la requête SQL pour la base de données spécifique, alors jetez un oeil à ma réponse ici.
Mise à jour: depuis que vous utilisez Oracle, voici un Oracle ciblées extrait de ladite réponse:
Avertissement: Cet article de blog sur SQL pagination & JDBC la pagination est posté par moi.
Mépris Hibernate pagination, nous pouvons utiliser SQL pagination /JDBC pagination
SQL pagination
Il existe deux approches de base:
La façon de le faire est spécifique SQL
Pour MySQL /beaucoup d'autres SQLs il peut être fait avec limit et offset
Postgresql: http://microjet.ath.cx/WebWiki/ResultPaginationWithPostgresql.html
Dans Oracle, il utilise la même forme que pour gérer les "Top-requête N" par exemple, qui sont les 5 plus haut salarié, qui est optimisé
Voici une explication détaillée sur la LIGNE-NUM
Similaire à ce Thread
JDBC Pagination
La question vient à l'esprit est: lorsque j'exécute SQL, comment est le résultat chargé? Immédiatement ou sur demande? même chose que ce fil
Nous avons d'abord besoin de comprendre certaines bases de JDBC, comme à partir d'Oracle
Par javadoc: déclaration.execute()
Nous avons accès à des données dans le jeu de résultat par l'intermédiaire d'un curseur. Remarque ce curseur est différent de celui de la DB, alors que c'est un pointeur initialement positionné avant la première ligne de données.
Les données récupérer sur demande. alors que quand vous ne l'execute() de l'extraction pour la première fois.
Ensuite, le nombre de données est chargé? Il est configurable.
On peut utiliser l'API java setFetchSize() la méthode sur ResultSet pour contrôler combien de lignes sont extraites à partir de DB une fois par le pilote, comment taille les blocs qu'il récupère à la fois.
Par exemple, supposons le résultat total est de 1000. Si la taille de l'extraction est de 100, l'extraction de la 1ère ligne de charge de 100 lignes de la DB et 2 au 100e rang sera chargé à partir de la mémoire locale.à la requête de la 101st ligne 100 lignes seront charger en mémoire.
De JavaDoc
Note le mot "astuce" - il peut être remplacer par un pilote de mise en œuvre spécifiques.
C'est aussi ce que la "Limite de Lignes à 100" dans client SQL developer basé sur.
De remplir l'ensemble de la solution pour faire défiler les résultats, il faut considérer le jeu de résultats Types et ScrollableCursor de l'API de
On peut trouver un exemple de mise en œuvre de ce post dans oracle
qui est du livre Oracle Toplink Guide du Développeur
Exemple 112 Pilote JDBC Taille de l'Extraction
.....................
Après tout, les questions ébullition à
Qui est la meilleure façon de faire de la pagination?
Note SQL devrait être de l'ORDRE par faire sens dans le SQL approche,
Sinon, il est possible de montrer que certaines lignes de nouveau dans la page suivante.
Ci-dessous quelques points de Postgresql documentation sur Pilote JDBC et d'autres réponses
Tout d'abord, l'original de la requête besoin d'avoir une clause ORDER BY pour faire de la pagination de la solution de travail raisonnable. Sinon, il serait parfaitement valable pour Oracle de retourner la même 500 lignes de la première page, la deuxième page, et la n-ième page
La différence majeure est pour le pilote JDBC, il est nécessaire pour maintenir la connexion lors de l'extraction. Cela peut ne pas être approprié dans les apatrides application web, par exemple.
Pour SQL façon
la syntaxe SQL est spécifique et ne peut pas être faciles à entretenir.
Pour JDBC façon
la valeur par défaut (et n'est pris en charge par le serveur de versions 7.4 et
plus tard.
ferme les curseurs à la fin de la transaction, donc en mode autocommit, le
backend sera fermé le curseur avant que quelque chose peut être récupérée
à partir d'elle.
Jeu de résultats.TYPE_FORWARD_ONLY. C'est la valeur par défaut, donc pas de code
besoin d'être réécrit pour tirer parti de cette situation, mais cela signifie aussi
que vous ne pouvez pas faire défiler vers l'arrière ou autrement sauter partout dans la
ResultSet.
les déclarations s'enchaînent avec des points-virgules.
Quelques lectures complémentaires
Ce post est sur le réglage des performances optiques de l'extraction du
Si vous utilisez MySQL ou PostgreSQL limite et décalage sont vos mots-clés. MSSqlServer et Oracle ont des fonctionnalités similaires, mais je semble être un peu plus douloureux.
Pour MySQL et PostgreSQL ont un coup d'oeil ici:
http://www.petefreitag.com/item/451.cfm
Pour Oracle ont un coup d'oeil ici:
http://www.oracle-base.com/forums/viewtopic.php?f=2&t=8635
C'est le lien à un hibernate solution pour la pagination des résultats:
HQL - identificateur de ligne pour la pagination
Je sais que cette question est vieux, mais c'est la façon dont j'ai mis en place la pagination, j'espère que cela aide quelqu'un
la valeur 50 une constante nommée pageSize, de sorte qu'il peut être changé à n'importe quel nombre
Je comprendre implicitement que vous ne voulez pas de la connexion JDBC à avoir un seul gigantesque jeu de résultats qui vous garder ouvert pour un temps très long et naviguer lorsque requis.
L'approche habituelle consiste à ajouter le code SQL nécessaire pour obtenir uniquement un sous-ensemble de la demande complète, qui, malheureusement, est différente de la base de données de la base de données, et fera de votre SQL spécifiques au fournisseur. Si je me souviens bien, la LIMITE est utilisé par MySQL. Demandez pour la gamme appropriée pour chaque requête.
Je crois aussi que Hibernate contient une fonctionnalité qui vous permet de le faire pour les requêtes HQL, mais je suis pas familier avec elle.
Êtes-vous utiliser un ORM comme hibernate ou même Java Persistence API) ou tout simplement SQL?
Ma Réponse alors:
utiliser LIMIT et OFFSET
http://www.petefreitag.com/item/451.cfm
Ou à passer par ROWNUM Opérateur
Vous avez besoin d'un wrapper autour de votre SQL alors, mais fondamentalement c'est
Oracle prend en charge la norme ROW_NUMBER() de la fenêtre de fonction depuis 8i donc vous pouvez l'utiliser. Vous pouvez faire une requête paramétrée de sorte que vous suffit de définir le début et la fin de la ligne. E. g.
(Si vous n'êtes pas en utilisant des paramètres nommés, remplacer :démarrer/:fin avec le paramètre de position de l'espace réservé '?')
Voir SÉLECTIONNEZ SQL, Fonctions de la Fenêtre sur wikipédia.
L'article répertorie également les autres DBs qui prennent en charge la fonction ROW_NUMBER() standard de la fonction de fenêtrage.
Note,
setFetchSize(int)
n'est qu'une indication - dernière fois que je l'utilise avec MySQL par exemple, il n'était pas pris en charge. En regardant autour d'œil à la documentation d'Oracle, il ressemble à leur JDBC ne le soutenir. Je ne voudrais pas me citer sur ce point, mais il vaut la peine d'essayer au moins; et oui, cette réponse est fragile, mais il pourrait être assez moins casse-tête que la mise en œuvre de la solution solide.Essentiellement, vous pouvez envoyer la demande de tout, et vous obtenez seulement la taille de l'extraction dans la mémoire (vous n'êtes pas tenue sur les résultats précédents). Donc, si vous voulez définir votre taille de l'extraction à 50, faire de votre connexion/requête, afficher les 50 premiers résultats (provoquant l'autre chercher pour la prochaine bouchée de votre requête) et ainsi de suite.
D'entrée:
Résultat:
Avantage de la Requête pour:
Inconvénient:
Oracle Dependend
sélectionnez x.* à partir de (
sélectionnez c.pk_field,c.numeric_a, c.char_b, c.char_c
ROW_NUMBER( ) over(ORDER BY
décoder(?,'A1',to_char(c.numeric_a,'FM00000000'),'A2',c.char_b,'A3',c.char_c,'A') de l'asc ,
décoder(?,'D1',to_char(c.numeric_a,'FM00000000'),'D2',c.char_b,'D3',c.char_c,'A') desc,
c.pk_field asc
) En tant QUE "idx",
COUNT (*) OVER (ORDER BY 1) "cnt" from myTable c
où c.botte de foin=?
) x où x."idx" entre la plus grande(nvl(?,1),1) et nvl(?,1)-1+?
Vous pouvez utiliser la méthode ci-dessous pour cette.
pour récupérer le nombre n de dossiers.
La suite des codes java qui fonctionne bien: