Programmation Java - Spring et JDBCTemplate - Utilisez query, queryForList ou queryForRowSet?
Mon Java (JDK6) projet utilise Printemps et JDBCTemplate pour l'ensemble de sa base de données access. Nous avons récemment mis à niveau à partir du Printemps de 2,5 à Ressort 3 (RC1). Le projet ne prévoit pas l'utilisation d'un ORM comme Hibernate ni EJB.
Si j'ai besoin de lire un tas de dossiers, et faire un peu de traitement interne avec eux, il semble comme il y en a plusieurs (surchargé) méthodes: requête, queryForList et queryForRowSet
Quels devraient être les critères à utiliser l'un plutôt que l'autre? Existe-il des écarts de performances? Les meilleures pratiques?
Pouvez-vous recommander des références externes pour la recherche sur ce sujet?
source d'informationauteur Adrian
Vous devez vous connecter pour publier un commentaire.
Je trouve que la manière standard d'accès, la liste est par l'intermédiaire de la
query()
méthodes plutôt que l'une des autres approches. La principale différence entrequery
et les autres méthodes, c'est que vous aurez à mettre en œuvre l'une des interfaces de rappel (RowMapper
,RowCallbackHandler
ouResultSetExtractor
) pour gérer votre jeu de résultats.Un
RowMapper
est probablement ce que vous trouverez vous-même en utilisant la plupart du temps. Il est utilisé lors de chaque ligne de résultat correspond à un objet dans votre liste. Vous n'avez qu'à mettre en œuvre une méthode uniquemapRow
où vous spécifiez le type de l'objet qui va dans votre ligne et de le retourner. Le printemps a aussi unBeanPropertyRowMapper
qui peut remplir les objets dans une liste grâce à la correspondance de la fève de noms de propriété pour les noms de colonne (NB cette classe est pour la commodité de ne pas les performances).Un
RowCallbackHandler
est plus utile lorsque vous avez besoin de vos résultats afin d'être plus qu'une simple liste. Vous aurez à gérer le retour de l'objet vous êtes vous-même à l'aide de cette approche. J'ai l'habitude de me retrouver à l'aide de cela, lorsque j'ai besoin d'une carte de la structure que mon type de retour (c'est à dire pour des données groupées pour un arbre de table ou si je suis de la création d'un personnalisé du cache en fonction de la clé primaire).Un
ResultSetExtractor
est utilisé lorsque vous souhaitez contrôler l'itération des résultats. Vous implment une méthode uniqueextractData
qui sera la valeur de retour de l'appel àquery
. Je ne trouve que moi-même à l'aide de ce si je dois construire coutume, structure de données qui est plus complexe à construire à l'aide de l'une ou l'autre de rappel des interfaces.La
queryForList()
méthodes sont utiles que vous n'avez pas à mettre en œuvre ces méthodes de rappel. Il y a deux façons d'utiliser queryForList. La première est que si vous êtes seulement à l'interrogation d'une seule colonne de la base de données (par exemple une liste de chaînes de caractères), vous pouvez utiliser les versions de la méthode qui prend une Classe comme un argument de automatiquement de vous donner une liste uniquement les objets de ces classes.Lors de l'appel des implémentations de
queryForList()
vous obtiendrez une liste de retour avec chaque entrée est une carte de chaque colonne. Tout cela est agréable dans le que vous êtes sauvé la charge de l'écriture des méthodes de rappel pour aborder cette structure de données est assez lourd. Vous allez trouver vous-même faire beaucoup de casting depuis la carte, les valeurs sont de typeObject
.En fait, j'ai jamais vu le
queryForRowSet
méthodes utilisées dans la nature. Cela va charger la totalité du résultat de la requête dans uneCachedRowSet
objet wapped par un Ressort SqlRowSet. Je vois un gros inconvénient dans l'utilisation de cet objet, si vous êtes de passage leSqlRowSet
autour pour les autres couches de votre application, vous êtes couplage de ces couches de vos données d'accès de mise en œuvre.Vous ne devriez pas voir de toute les énormes différences de performances entre une de ces appels, sauf comme je l'ai mentionné à la
BeanPropertyRowMapper
. Si vous travaillez avec certains complexes de manipulation d'un grand ensemble de résultats, vous pourriez être capable d'obtenir des gains de performance à partir de l'écriture d'un optimiséeResultSetExtractor
pour votre cas spécifique.Si vous voulez en savoir plus je voudrais consulter la Spring JDBC documentation et la JavaDoc pour les classes je l'ai mentionné. Vous pouvez également jeter un oeil à quelques-uns des livres sur le Framework Spring. Si c'est un peu daté Développement Java avec le Framework Spring a un très bon article sur le travail avec JDBC cadre. La plupart de tous, je dirais juste essayer d'écrire un peu de code avec chaque méthode et de voir ce qui fonctionne le mieux pour vous.
Puisque vous êtes dans le merveilleux Génériques de la terre, ce que vous pouvez vraiment faire est d'utiliser
SimpleJdbcTemplate
et l'utilisation de sonquery()
méthodes pourLists
d'objets et dequeryForObject()
pour les objets individuels. Le raisonnement pour cela est tout simplement qu'ils sont encore plus facile à utiliser que ceux deJdbcTemplate
.Un petit plus de l'excellent réponses ci-dessus: d'autres méthodes, comme la queryForInt, queryForLong, queryForMap, queryForObject, etc. peut sembler une bonne option à la fois, si vous êtes en cours d'exécution d'une requête simple et s'attendent à une seule ligne.
Cependant, si vous pouviez obtenir 0 ou 1 rangées à l'arrière, le queryForList méthode est généralement plus facile, sinon vous auriez à attraper IncorrectResultSizeDataAccessException. J'ai appris à la dure.