Jeu de résultats de Métadonnées à partir du Printemps JDBCTemplate méthodes de Requête
Est-il de toute façon je peux obtenir de l'objet resultset de l'un des jdbctemplate méthodes de requête?
J'ai un code comme
List<ResultSet> rsList = template.query(finalQuery, new RowMapper<ResultSet>() {
public ResultSet mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs;
}
}
);
Je voulais l'exécution de mes instruction sql stockée dans finalQuery Chaîne et obtenir le jeu de résultats. La requête est une jointure complexe sur 6 à 7 tables et je suis sélectionnez 4-5 colonnes de chaque table et voulait obtenir les métadonnées de ces colonnes pour transformer les données les types de données et de systèmes en aval.
Si c'est une simple requête et je suis aller chercher de former une seule table, je peux utiliser RowMapper#mapRow et à l'intérieur qu'maprow méthode, je peux appeler ResultsetExtractor.extractData pour obtenir la liste des résultats; mais dans ce cas j'ai des jointures complexes dans ma requête et je suis en train d'essayer d'obtenir de l'Objet resultset et à partir de ce jeu de résultats de métadonnées...
Le code ci-dessus n'est pas bon parce que, pour chaque résultat, il sera de retour le même objet resultset et je ne veux pas stocker dans la liste ...
Une fois de plus la chose est si maprow est appelée pour chaque résultat de ma requête JDBCTemplate près de la rs et de la connexion, même si ma liste a de référence à RS objet?
Est-il une méthode simple comme jdbcTemplate.queryForResultSet(sql) ?
Maintenant, j'ai mis en œuvre mes propres ResultSet Extracteur de processus et d'insérer des données dans des systèmes en aval
sourceJdbcTemplate.query(finalQuery, new CustomResultSetProcessor(targetTable, targetJdbcTemplate));
Ce CustomResultSetProcessor implémente ResultSetExtractor et dans extractData méthode que j'appelle 3 différentes méthodes 1 est d'obtenir ColumnTypes formulaire de rs.getMetaData() et la seconde getColumnTypes de métadonnées cible en cours d'exécution
SELECT NAME, COLTYPE, TBNAME FROM SYSIBM.SYSCOLUMNS WHERE TBNAME ='TABLENAME' AND TABCREATOR='TABLE CREATOR'
et dans la 3ème méthode, je suis la construction de l'instruction insert (établi) forme cible columntypes et enfin l'appel que l'utilisation de
new BatchPreparedStatementSetter()
{
@Override
public void setValues(PreparedStatement insertStmt, int i) throws SQLException{} }
Espère que cette aide à d'autres...
OriginalL'auteur sanumala | 2011-03-15
Vous devez vous connecter pour publier un commentaire.
Noter que le point de l'ensemble de Spring JDBC Modèle est qu'il se ferme automatiquement toutes les ressources, y compris
ResultSet
, après l'exécution de la méthode de rappel. Par conséquent, il serait préférable d'extraire les données nécessaires à l'intérieur d'une méthode de rappel et de permettre à Ressort pour fermer laResultSet
après.Si le résultat de l'extraction des données n'est pas un
List
, vous pouvez utiliserResultSetExtractor
au lieu deRowMapper
:Si je fais comme ci-dessous est-il une bonne idée
code
try{ con = jdbcTempalte.getDataSource().getConnection(); con.createStatement(); rs = st.executeQuery(finalQuery); rsmd = rs.getMetadata();code
je ne sais pas si j'obtiens de connexion modèle de formulaire et obtenir ce que jamais je veux et à proximité des ressources, pas sûr que ce soit une bonne idée ou pas... s'il vous plaît aiderLe point est que vous n'avez pas besoin de retourner n'importe quoi - vous pouvez mettre en œuvre votre logique qui ont besoin d'accéder
ResultSet
à l'intérieur d'une méthode de rappel.Est-il possible de retourner un
Map<String,List<Objects>>
. mon QuestionQue faire si je veux procces toutes les entrées de ma table, mais ma table cantains+ de 20 millions de lignes. Comment faire dans ce cas? J'utilise printemps JdbcTempate
OriginalL'auteur axtavt
Quelque chose comme ce serait également le travail:
OriginalL'auteur andrewrjones
Bien que je suis d'accord avec #axtavt que ResultSetExtractor est préféré au Printemps de l'environnement, il ne force pas, vous pouvez exécuter la requête.
Le code ci-dessous ne vous oblige pas à le faire, de sorte que le code du client n'est pas tenu de fournir les arguments les paramètres de la requête:
OriginalL'auteur Alexander