JAVA : Classe pour traiter les SELECT MySQL ?

Fermé
Pouzy - 12 juin 2008 à 17:01
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 - 12 juin 2008 à 22:57
Bonjour,

Je souhaite externaliser mes traitements SQL en JAVA parce que j'en ai beaucoup à faire. J'ai actuellement le code suivant pour me connecter à ma BDD :

	
					   Class.forName("com.mysql.jdbc.Driver");
				
					     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/table","***","***");
					      Statement stmt = null;
					      ResultSet rs = null;
					     
					                stmt = conn.createStatement();
					            
					                rs = stmt.executeQuery("SELECT * FROM test");
					                
					                		while (rs.next()) {
					                			  String test = rs.getString("test");
					                			}
					                break;
					  

(J'ai enlevé les gestion d'exceptions & fermeture des connexions pour garder un truc lisible)
Je souhaite en fait externaliser tout ça, de manière à n'avoir qu'un :

rs = classe.connexionsql("SELECT test from...");


Et donc que mon rs soit un ResultSet que je puisse exploiter via rs.next();
J'ai réussi avec le INSERT sans problème car il ne renvoie rien, mais je bloque sur le ResultSet. Quelqu'un a une idée ?

Merci :)
A voir également:

4 réponses

Utilisateur anonyme
12 juin 2008 à 21:07
Salut!

Pourquoi n'utilises-tu pas Hibernate?

;-)
HackTrack
0
Coucou,

Comment ça dégueulasse ? En fait je veux simplement pouvoir exécuter plusieurs SELECT dans des classes différentes sans avoir à me retaper les ResultSet & co.
Et pour le problème : j'ai essayé avec la classe qui retournerait le RS, mais j'ai un beau "Can't do jesaispluquoi when ResultSet is already closed".

D'où mon appel à l'aide :)

Merci !
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 328
12 juin 2008 à 22:57
Re,
Je dis que c'est pas top top car tu crées une classe qui fait le café, et qui t'autorise à faire n'importe quoi sans contrôle. En gros en l'utilisant tu peux exécuter n'importe quelle requête exécutable pas executeQuery donc niveau sécurité c'est pas ce qu'il y a de mieux. En plus elle n'est utilisable que de manière spécifique vu que tous tes paramètres de connexion sont intégrés au code.

Ceci dit, ça peut être pratique si ce n'est pas ton souci.

Pour répondre à ta question, c'est ce que je pensais : tu crées ta connexion, puis ton statement.
Tu exécutes ta requête et obtiens ton resultSet, mais celui-ci est détruit lorsque tu fermes ton statement. L'idée serait donc de copier son contenu dans une liste et de retourner une liste...

public static List<String> executeQuery(String request) {
...
 ResultSet rs = stmt.executeQuery(request);
 List<String> retour = new LinkedList<String>();
 while (rs.hasNext()) {
  retour.add( new String((String) rs.next()));
 }
 stmt.close();
 return retour;
}


Remarque : ça peut peut-être aussi marcher avec retour.add((String) rs.next()); mais je n'en suis pas sûr du tout.

Essaie ça et tiens nous au courant.

Concernant Hibernate, c'est pas forcément super facile au début, donc tu as raison de commencer comme tu fais, tu passeras à Hibernate plus tard (ceci dit Hibernate c'est vraiment méga balèze ;)

Cordialement,
0
Au fait, pour le Hibernate : je suis débutant en JAVA et j'ai fait quelques recherches dessus, je m'avoue un peu largué... :(
0
Marco la baraque Messages postés 996 Date d'inscription vendredi 9 mai 2008 Statut Contributeur Dernière intervention 5 novembre 2009 328
12 juin 2008 à 21:22
Bonsoir,
Qu'est ce qui te bloque ?
Tu peux très bien créer une classe avec une méthode statique "executeQuery" qui prend un String en entrée et qui retourne le resultset.
Je ne vois pas où est le problème (je me demande toutefois si le resultset n'a pas la durée de vie de ton statement, ce qui peut poser problème pour le retourner, auquel cas il faudrait copier les données de ton resultset dans une liste... mais sûrement que non).

Après ce que tu veux faire est dégueulasse mais c'est pas le sujet.
-1