Un code plus compact, utilisation d'interfaces (surement)

Un code plus compact, utilisation d'interfaces (surement) - Java - Programmation

Marsh Posté le 03-07-2002 à 11:26:50    

Bon, allez, j'vais essayer d'expliquer mon pb.
J'ai une quizaine de tables SQL.
Dans chacune, je vais récupérer un ou une collection de bean que g créé, qui correspondent à peu près aux colones de chaque tables.
J'ai une classe JSQLRequest qui est chargée de faire toutes les requêtes.
Cette classe à toute sorte de méthode de ce genre:

Code :
  1. /** Récupère toutes les applications autorisées à la recherche pour une utilisateur donné.
  2.      * @param login login de l'utilisateur (code utilisateur) dont les données sont récupérées.
  3.      * @throws JLdsServletException Lancée si une erreur SQL est produite.
  4.      * @return une énumération (<CODE>Enumeration</CODE> ) de beans <CODE>Application</CODE>
  5.      */   
  6.     public Enumeration getAllAutorizedApplications (String login) throws JLdsServletException {
  7.      if (login == null)
  8.             return null;
  9.        
  10.         Object[] arguments = {login};
  11.         String formatStr = Resources.getResources ().getLabel ("sqlrequest.getallautorizedappli" );
  12.         String sqlQuery = MessageFormat.format(formatStr, arguments);
  13.        
  14.         Connection         c    = null;
  15.         Statement          stmt = null;
  16.         ResultSet          r    = null;
  17.         try {
  18.             c     = this.connectionPool.getConnection ();
  19.             stmt  = c.createStatement ();
  20.             r     = stmt.executeQuery (sqlQuery);
  21.            
  22.             Vector vectAutorizedApps = new Vector ();
  23.             while (r.next ()) {
  24.                 String codeApp = r.getString (1).trim ();
  25.                 String nomApp  = r.getString (2).trim ();
  26.                 vectAutorizedApps.add (new Application (codeApp, nomApp));
  27.                 }
  28.             return (vectAutorizedApps.elements ());
  29.         }
  30.         catch (SQLException e) {
  31.             throw new JLdsServletException ("Une erreur est survenue lors de l'execution/lecture des résultats, de la requète :\n\t" + sqlQuery, e);
  32.         }
  33.         finally {
  34.            try { if (r != null) r.close(); } catch (SQLException x) { throw new JLdsServletException ("Erreur de fermeture du ResultSet ( " + sqlQuery, x); }
  35.            try { if (stmt != null) stmt.close(); } catch (SQLException x) { throw new JLdsServletException ("Erreur de fermeture du Ctatement ( " + sqlQuery, x); }
  36.            try { if (c != null) c.close(); } catch (SQLException x) { throw new JLdsServletException ("Erreur de libération de la connection ( " + sqlQuery, x); }
  37.         }
  38.     }


Où seule les passages en gras diffèrent. vous voyez pas un moyen de ne pas réécrire tout ça pour chaque récupération de beans à partir de ma BD ?


Message édité par El_gringo le 03-07-2002 à 11:27:40
Reply

Marsh Posté le 03-07-2002 à 11:26:50   

Reply

Marsh Posté le 03-07-2002 à 11:28:58    

Ouuu que c'est moche ici...
Déja, mon code est pas super beau avec mon éditeur, ma alors, posté ici, c une catastrophe.
Enfin, si vous arrivez qd même à lire, et que ce code vous énerve pas trop, j'attend vos suggestions...

Reply

Marsh Posté le 03-07-2002 à 11:34:40    

bah y'a pas gd chose qui se repeterais, si ce n'est la repetition de le declaration du ResultSet, Connection etc, les catch, le finally. mais ça tu y couperas pas de toutes façons.
tu pourrais betement foutre ton code d'execution de requete dans une methode.

Reply

Marsh Posté le 03-07-2002 à 11:49:29    

--greg-- a écrit a écrit :

bah y'a pas gd chose qui se repeterais, si ce n'est la repetition de le declaration du ResultSet, Connection etc, les catch, le finally. mais ça tu y couperas pas de toutes façons.
tu pourrais betement foutre ton code d'execution de requete dans une methode.
 




 
...Qui rendrait un ResultSet ?
Mais, de toute façon, je pourrais pas inclure le try - catch - finally dedant. ça va pas réduire grand chose en fait.
J'viens d'avoir une idée qui me parait bien :
Chacun de mes beans va implémenter une interface JLdsBean, qui imposera la méthode

Code :
  1. public void setFromResultSet (ResultSet rs)


A ce moment là, je pourrait faire, dans JSQLRequest, une méthode

Code :
  1. public JLdsBean getOneBeanFromDB (JLdsBeans bean, String sqlQuery)


qui ressemblerai à celle que g poste avant, mais ou la 2e partie en gras serait remplacée par un appel à la méthode setFromResultSet.
c pas mal, non !?


Message édité par El_gringo le 03-07-2002 à 11:49:59
Reply

Marsh Posté le 03-07-2002 à 11:53:29    

un bean qui prend un resultset beurk.
 
Par contre un bean qui a des méthodes load, save, update ca c'est cool. Et tu peux faire appel à une classe d'utilistaires SQL pour la connection et les autre brols.


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 03-07-2002 à 11:57:02    

DarkLord a écrit a écrit :

un bean qui prend un resultset beurk.
 
Par contre un bean qui a des méthodes load, save, update ca c'est cool. Et tu peux faire appel à une classe d'utilistaires SQL pour la connection et les autre brols.




 
Et !? tu mettrais quoi comme paramètre de load ? c cette méthode qui serait chargée des accès BD !? j'croyais qu'y fallait pas faire ça non plus ds un bean.
Tu peut détailler un peu tt ça ?
Et une classe d'utilitaires SQL, genre !? j'vois pas bien ce qu'elle pourrait m'apporter comme utilitaire...

Reply

Marsh Posté le 03-07-2002 à 12:08:16    

bin normallement un bean contient toute les infos sur ce que tu veux décrire (un client, un colis, une société). Certains mettent également les méthodes d'accès au bean lui permettant de s'updater, se loader tout seul dans la bd.
 
Comme tout bean a un constructeur vide tu peux faire
 

Code :
  1. ClientBean client = new ClientBean();
  2. client.load(124644567);
  3. // où 124644567 est la clé primaire permettant de retrouver le client
  4. System.out.println("Loaded: "+client.getName());


 
Et pour la classe d'utilitaires c'est par exemple une classe qui te donnerait une instance de Connection sur laquelle tu pourrais déclarer ton statemment etc ...
 
Ainsi tu centralies l'information propre au bean dans le bean. Ceci n'est pas vraiment valalbe si tu veux commencer à sérialiser tes beans (auquel cas le bean doit rester purement un objet contennat des données). Dans ce cas tu dois faire appel à une classe de type helper (ClientBeanHelper) qui fera le job pour toi.
 


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 03-07-2002 à 12:24:37    

DarkLord a écrit a écrit :

bin normallement un bean contient toute les infos sur ce que tu veux décrire (un client, un colis, une société). Certains mettent également les méthodes d'accès au bean lui permettant de s'updater, se loader tout seul dans la bd.
 
Comme tout bean a un constructeur vide tu peux faire
 

Code :
  1. ClientBean client = new ClientBean();
  2. client.load(124644567);
  3. // où 124644567 est la clé primaire permettant de retrouver le client
  4. System.out.println("Loaded: "+client.getName());


 
Et pour la classe d'utilitaires c'est par exemple une classe qui te donnerait une instance de Connection sur laquelle tu pourrais déclarer ton statemment etc ...
 
Ainsi tu centralies l'information propre au bean dans le bean. Ceci n'est pas vraiment valalbe si tu veux commencer à sérialiser tes beans (auquel cas le bean doit rester purement un objet contennat des données). Dans ce cas tu dois faire appel à une classe de type helper (ClientBeanHelper) qui fera le job pour toi.
 
 




 
haaa... là t chiant ! Au début, j'avais fait un truc comme ça (méthode load) et tu m'as dit que, non, c'est mauvais, et que je devais pas faire ça. Du coup, j't'ai écouté, g recommencé en sortant les accès BD du bean. Et maintenant tu me dis que c pas bien grave !?

Reply

Marsh Posté le 03-07-2002 à 12:29:33    

j'ai dis ca dépend ce que tu veux faire. si tu as présenté ton projet comme utilisant la serialization ou autre, c'est normal que je te l'ai déconseillé. Je connais pas ton projet moi.
 
Et puis si je suis chiant, je ne te réponds plus comme ca le problème est résolu  :kaola:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 03-07-2002 à 13:58:40    

DarkLord a écrit a écrit :

j'ai dis ca dépend ce que tu veux faire. si tu as présenté ton projet comme utilisant la serialization ou autre, c'est normal que je te l'ai déconseillé. Je connais pas ton projet moi.
 
Et puis si je suis chiant, je ne te réponds plus comme ca le problème est résolu  :kaola:  




 
Nooooon, 'faut pas te vexer Darky... mais sur ce coup là, j'étais pas content, comprend moi. :sweat:  
Mais 'faut pas que tu m'laisses, j'ai besoin de toi moi. :D

Reply

Marsh Posté le 03-07-2002 à 13:58:40   

Reply

Marsh Posté le 03-07-2002 à 16:04:42    

:bounce: spéciale dédicace à Darklord

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed