IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Caster une liste


Sujet :

avec Java

  1. #1
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut Caster une liste
    Bonjour,

    J'ai une Classe B qui hérite de A
    Dans une autre classe, j'aimerai utiliser la méthode ci-dessous mais je ne peux renvoyer une list<B>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	private List<A> wrapListOfA(ResultSet rs) {
    		List<B>listOfB = new ArrayList();
    		return (List<B>)Wrapper.wrapListOfB(rs,listOfB);
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Type mismatch: cannot convert from List<B> to List<A>
    Pourtant la méthode ci-dessous fonctionne bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	private A wrapA(ResultSet rs) {
    		return (B)Wrapper.wrapB(rs,new B());
    	}
    Avez-vous une méthode pour caster une List<B> vers List<A>. A étant une super-classe de B.

    Merci pour votre aide

  2. #2
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Bonjour,

    Ce n'est pas parce que A est une superclasse de B que List<A> est une super classe de List<B>.
    Voici ce que vous pouvez faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private List<B> wrapListOfA(ResultSet rs) {
    		List<B> listOfB = new ArrayList();
    		return (List<B>)Wrapper.wrapListOfB(rs,listOfB);
    	}
     ....
    //Appel de wrapListOfA
    List<A> liste =  wrapListOfA(rs);
    B elem0 = (B)(liste.get(0));
    ...
    Ou sinon vous pouvez retourner simplement une List, mais je crois que c'est obsolète ...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Points : 402
    Points
    402
    Par défaut
    faudra que tu change ta méthode wrap et lui passer le Class en paramètre ou en générique càd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <T> T wrap(ResultSet rs) {
     //...
    }
    Faudra récupérer le T.class a partir du parametre générique T sinon il fault le passé autant que paramètre dans la méthode wrap càd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <T> T wrap(ResultSet rs, Class<T> cl) {
     //...
    }
    A++

  4. #4
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par pingoui Voir le message
    Avez-vous une méthode pour caster une List<B> vers List<A>. A étant une super-classe de B.

    Merci pour votre aide
    Ce n'est pas possible !
    Par contre tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	private List<A> wrapListOfA(ResultSet rs) {
    		List<B>listOfB = new ArrayList();
    		listOfB = Wrapper.wrapListOfB(rs,listOfB);
    		return new ArrayList<A>(listOfB)
    	}

  5. #5
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Merci pour votre aide.
    J'ai adopté la méthode ci-dessous

    Citation Envoyé par Rei Ichido Voir le message
    Ce n'est pas possible !
    Par contre tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	private List<A> wrapListOfA(ResultSet rs) {
    		List<B>listOfB = new ArrayList();
    		listOfB = Wrapper.wrapListOfB(rs,listOfB);
    		return new ArrayList<A>(listOfB)
    	}

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    J'aimerais faire une remarque sur le pourquoi du comment ce n'est pas possible.

    Si B est une classe fille de A, alors on peut dire qu'un B est un A particulier. Partout où on traite des A, on peut fournir un B à la place, ce n'est pas gênant, car un B est aussi un A.

    A contrario, un List<B> n'est pas du tout un List<A>.
    Exemple simple : quand on a un List<A>, on peut y insérer des A. Mais quand on a un List<B>... Un List<B> contient des B, pas des A ! Pas question d'y mettre des A ! Par conséquent, un List<B> ne peut pas faire tout ce qu'un List<A> peut faire. On ne peut donc pas substituer l'un à l'autre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Merci pour les précisions

    Pour ma culture, peut-on faire l'inverse ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	private List<B> getAllB() {	
    		List<A> listOfA = processReq(sqlReq,true);
    		return new ArrayList<B>(listOfA);
    	}
    A mon avis, non!
    Et je ferais comme cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	private List<B> getAllB() {	
    		List<A> listOfA = processReq(sqlReq,true);
    		List<Station> listOfStation = new ArrayList<Station>() ;
    		for (A aaaa : listOfA){
    			listOfB.add((B) aaaa);
    		}
    		return listOfB;
    	}
    Est-ce propre

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Dans le sens contraire, un List<A> n'est pas un List<B>. Quand on récupère les éléments d'un List<B>, on obtient des B. Or, quand on récupère les éléments d'un List<A>, on obtient des A, et les A ne sont pas des B.
    On ne peut pas non plus les substituer dans ce sens.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    private List<B> getAllB() {	
    		List<A> listOfA = processReq(sqlReq,true);
    		List<Station> listOfStation = new ArrayList<Station>() ;
    		for (A aaaa : listOfA){
    			listOfB.add((B) aaaa);
    		}
    		return listOfB;
    	}
    Est-ce propre
    Non seulement ce n'est pas propre, mais ça a bien peu de chances de marcher. On ne peut pas caster un A en B comme ça, sans savoir si c'est vraiment un B.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Vous pourriez faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	private List<B> getAllB() {	
    		List<A> listOfA = processReq(sqlReq,true);
    		List<Station> listOfStation = new ArrayList<Station>() ;
    		for (A aaaa : listOfA){
    			if (aaaa instanceof B) {
    				listOfB.add((B) aaaa);
    			}
    		}
    		return listOfB;
    	}
    Cela vous retournerai tous les B de votre liste ...

  10. #10
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Pour avancer d'un cran dans les possibilités des génériques : si, bien entendu, on ne peut affecter un List<B> à un List<A>, on peut en revanche affecter un List<B> à un List<? extends A>.

    Une belle façon d'écrire ta fonction serait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        private List<? extends A> wrapListOfA(ResultSet rs) {
            List<B>listOfB = new ArrayList();
            return (List<B>)Wrapper.wrapListOfB(rs,listOfB);
        }
    Mais bien entendu cela demande que du côté receveur, tu acceptes List<? extends A>

    Je suis d'ailleurs étonné que tu ais besoin de caster en List<B> dans un programme où tu travailles sérieusement avec des génériques. Avec une méthode wrapList générique, tu devrais t'en sortir
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  11. #11
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Citation Envoyé par sjrd Voir le message
    Pour avancer d'un cran dans les possibilités des génériques : si, bien entendu, on ne peut affecter un List<B> à un List<A>, on peut en revanche affecter un List<B> à un List<? extends A>.

    Une belle façon d'écrire ta fonction serait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        private List<? extends A> wrapListOfA(ResultSet rs) {
            List<B>listOfB = new ArrayList();
            return (List<B>)Wrapper.wrapListOfB(rs,listOfB);
        }
    Mais bien entendu cela demande que du côté receveur, tu acceptes List<? extends A>

    Je suis d'ailleurs étonné que tu ais besoin de caster en List<B> dans un programme où tu travailles sérieusement avec des génériques. Avec une méthode wrapList générique, tu devrais t'en sortir
    Bonjour et merci à tous pour votre aide.
    Cette idée de wrapList générique me plait bien.
    Demain je posterai un peu plus de code pour voir comment l'améliorer et faire quelque chose de propre

  12. #12
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Bonjour,
    Voici mon code (épuré) pour voir avec vous comment faire quelque chose de plus propre.

    Par rapport à mon exemple ci-dessus. La super-Classe (A) c'est "Entity" et une des classe qui en hérite, c'est "Station" (B)
    La super-Classe Entity ne fait pas grand chose. Les classes qui en hérites (Station,Departure, Zone)et la super-classe (Entity) sont dans un package "domain".

    Dans un package "dao"
    J'ai les classes correspondantes (StationDaoImpl, DepartureDaoImpl,ZoneDaoImpl) qui gèrent les requêtes sql.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    public class StationDaoImpl extends DaoTemplate implements IStationDao{
     
    	public StationDaoImpl() {
    		super();
    	}
     
    	public void addStation(Station station) {
    		// ici j'ajoute une station à la bdd
    	}
     
    	public void deleteStation(String stationId) {
    		//ici je supprime une station à la bdd
    	}
     
    	public List<Station> getAllStation(String zoneId) {
    		String sqlReq = "SELECT * FROM T_STATION WHERE ZONE_ID = "+zoneId;	
    		List<Entity> listOfEntity = processReq(sqlReq,true);
    		List<Station> listOfStation = new ArrayList<Station>() ;
    		for (Entity entity : listOfEntity){
    			if(entity instanceof Station){
    				listOfStation.add((Station) entity);
    			}
    		}
    		return listOfStation;
    	}
     
    	public Station getStation(String stationId) {
    		String sqlReq = "SELECT * FROM T_STATION WHERE STATION_ID = "
    				+ stationId;
    		Station station = (Station) processRequest(sqlReq,true);
    		return station;
    	}
     
    	public void updateStation(Station station) {
    		//ici je modifie une station
    	}
     
     
    	/**
             * Méthode permettant de transformer un resultSet en station
             * 
             * @return entity
             */
    	@Override
    	protected Entity wrapEntity(ResultSet rs) {
    		return (Station)Wrapper.wrapStation(rs,new Station());
    	}
     
    	/**
             * Méthode permettant de transformer un resultSet en une liste station
             * 
             * @return List<Entity>
             */
    	@Override
    	protected List<Entity> wrapListOfEntity(ResultSet rs) {
    		List<Station>listOfStation = new ArrayList<Station>();
    		listOfStation = Wrapper.wrapListOfStation(rs,listOfStation);
    		return new ArrayList<Entity>(listOfStation);
    	}
    }
    Les classes DepartureDaoImpl,ZoneDaoImpl sont identique à StationDaoImpl et héritent aussi d'un DaoTemplate(je ne sais pas si le nom de la super-classe est correcte)
    DaoTemplate gére l'accès à la bdd et execute les requêtes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    public abstract class DaoTemplate {
     
    	//Le driver emmbarqué
    	private String driver = "org.apache.derby.jdbc.EmbeddedDriver";
    	// Le nom de la base
    	private String dbName = "";
    	// l'URL de la base à utiliser
    	private String connectionURL = "jdbc:derby:" + dbName;
     
    	// Le Prepared Statement
    	private PreparedStatement psInsert;
    	//Le Resultat de la requête
    	private ResultSet resultSet;
     
    	/**
             * Cette methode ouvre une connexion sur la base,
             * execute une commande sql,
             * wrap le resultat pour recuperer un objet,
             * ferme la connexion
             * et renvoie un objet
             * 
             * @return result
             */
    	public Entity processRequest(String s,boolean returnNeeded) {
    		Entity entity = null;
    		//Connexion à la base
    		Connection connection = startDBConnexion();
    		//Execution de la requete
    		resultSet = executeCommande(connection,s,returnNeeded);
    		// Si la méthode demande de renvoyer un résultat
    		if(returnNeeded){
    			//Grace a l'appel de la methode abstraite wrapEntity, on recupere le bon Objet: Station, Equipement,...
    			entity = wrapEntity(resultSet);		
    		}
    		//Déconnexion de la base
    		stopDBConnexion(connection);
    		return entity;
    	}
     
    	/**
             * Cette methode ouvre une connexion sur la base,
             * execute une commande sql,
             * wrap le resultat pour recuperer une liste d'objet,
             * ferme la connexion
             * et renvoie la liste d'objet
             * 
             * @return result
             */
    	public List<Entity> processReq(String s,boolean returnNeeded) {
    		List<Entity> listOfEntity = null;
    		//Connexion à la base
    		Connection connection = startDBConnexion();
    		//Execution de la requete
    		resultSet = executeCommande(connection,s,returnNeeded);
    		if(returnNeeded){
    			//Grace a l'appel de la methode abstraite wrapListOfEntity, on recupere la bonne liste d'Objet: Station, Equipement,...
    			listOfEntity = wrapListOfEntity(resultSet);	
    		}
    		//Déconnexion de la base
    		stopDBConnexion(connection);
    		return listOfEntity;
    	}
     
    	/**
             * Execute la requete
             * @param connection
             * @param sqlRequest
             * @return resultSet
             */
    	protected ResultSet executeCommande(Connection connection,String sqlRequest,boolean returnNeeded) {
    		resultSet=null;
    		try { 
     
    			 psInsert = connection.prepareStatement(sqlRequest);
    			 if(returnNeeded){
    				 psInsert.executeQuery();
    				 resultSet = psInsert.getResultSet();
    			 } else {
    				 psInsert.executeUpdate();
    			 }
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return resultSet;
    	}
     
    	/**
             * Stop la connexion à la base
             * @param connection
             */
    	protected void stopDBConnexion(Connection connection) {
    //Stop la connexion à la bdd
    	}
     
    	/**
             * Démarre la connexion à la base
             * 
             * @return connection
             */
    	private Connection startDBConnexion() {
    //Démarre la connexion à la bdd
    	}
     
    	/**
             * Méthode abstraite pour wrapper un résultat de requête et renvoyer un objet
             * @param rs
             * @return entity
             */
    	protected abstract Entity wrapEntity(ResultSet rs);
     
    	/**
             * Méthode abstraite pour wrapper un résultat de requête et renvoyer une liste d'objet
             * @param rs
             * @return List<Entity>
             */
    	protected abstract List<Entity> wrapListOfEntity(ResultSet rs);
     
    }
    Et enfin le wrapper qui fait le lien entre un resultSet et un objet de type Station, Departure, Zone

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    	public static Station wrapStation(ResultSet rs, Station station) {
    		try {	
    			while (rs.next())
    				{
    					station.setStationId(rs.getInt(1)+"");
    					station.setStationName(rs.getString(2));			
    				}
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}		
    			return station;
    	}
     
    	public static List<Station> wrapListOfStation(ResultSet rs, List<Station> listOfStation) {
    		Station station;
    		try {	
    			while (rs.next())
    				{
    					station = new Station();
    				    station.setStationId(rs.getInt(1)+"");
    				    station.setStationName(rs.getString(2));
    					//ajout d'un poste à la liste des postes
    				    listOfStation.add(station);			
    				}
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			//libération des données stocké dans l'objet station
    			station = null;
    			return listOfStation;
    	}	
    //ici les autres méthode pour les depatures et zone
    }
    Comment optimiser mon code pour avoir quelque chose de propre

    D'avance merci pour vos conseils

  13. #13
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Eh bien ça me paraît très clair : tu générises la classe DaoTemplate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    public abstract class DaoTemplate<T extends Entity> {
     
        //Le driver emmbarqué
        private String driver = "org.apache.derby.jdbc.EmbeddedDriver";
        // Le nom de la base
        private String dbName = "";
        // l'URL de la base à utiliser
        private String connectionURL = "jdbc:derby:" + dbName;
     
        // Le Prepared Statement
        private PreparedStatement psInsert;
        //Le Resultat de la requête
        private ResultSet resultSet;
     
        /**
         * Cette methode ouvre une connexion sur la base,
         * execute une commande sql,
         * wrap le resultat pour recuperer un objet,
         * ferme la connexion
         * et renvoie un objet
         * 
         * @return result
         */
        public T processRequest(String s,boolean returnNeeded) {
            T entity = null;
            //Connexion à la base
            Connection connection = startDBConnexion();
            //Execution de la requete
            resultSet = executeCommande(connection,s,returnNeeded);
            // Si la méthode demande de renvoyer un résultat
            if(returnNeeded){
                //Grace a l'appel de la methode abstraite wrapEntity, on recupere le bon Objet: Station, Equipement,...
                entity = wrapEntity(resultSet);        
            }
            //Déconnexion de la base
            stopDBConnexion(connection);
            return entity;
        }
     
        /**
         * Cette methode ouvre une connexion sur la base,
         * execute une commande sql,
         * wrap le resultat pour recuperer une liste d'objet,
         * ferme la connexion
         * et renvoie la liste d'objet
         * 
         * @return result
         */
        public List<T> processReq(String s,boolean returnNeeded) {
            List<T> listOfEntity = null;
            //Connexion à la base
            Connection connection = startDBConnexion();
            //Execution de la requete
            resultSet = executeCommande(connection,s,returnNeeded);
            if(returnNeeded){
                //Grace a l'appel de la methode abstraite wrapListOfEntity, on recupere la bonne liste d'Objet: Station, Equipement,...
                listOfEntity = wrapListOfEntity(resultSet);    
            }
            //Déconnexion de la base
            stopDBConnexion(connection);
            return listOfEntity;
        }
     
        /**
         * Execute la requete
         * @param connection
         * @param sqlRequest
         * @return resultSet
         */
        protected ResultSet executeCommande(Connection connection,String sqlRequest,boolean returnNeeded) {
            resultSet=null;
            try { 
     
                 psInsert = connection.prepareStatement(sqlRequest);
                 if(returnNeeded){
                     psInsert.executeQuery();
                     resultSet = psInsert.getResultSet();
                 } else {
                     psInsert.executeUpdate();
                 }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return resultSet;
        }
     
        /**
         * Stop la connexion à la base
         * @param connection
         */
        protected void stopDBConnexion(Connection connection) {
    //Stop la connexion à la bdd
        }
     
        /**
         * Démarre la connexion à la base
         * 
         * @return connection
         */
        private Connection startDBConnexion() {
    //Démarre la connexion à la bdd
        }
     
        /**
         * Méthode abstraite pour wrapper un résultat de requête et renvoyer un objet
         * @param rs
         * @return entity
         */
        protected T wrapEntity(ResultSet rs) {
            T result = null;
     
            try {
                if (rs.next()) {
                    result = wrapSingleEntity(rs);
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
            return result;
        }
     
        /**
         * Méthode pour wrapper un résultat de requête et renvoyer une liste d'objet
         * @param rs
         * @return List<Entity>
         */
        protected List<T> wrapListOfEntity(ResultSet rs) {
            List<T> result = new LinkedList<T>();
     
            try {
                while (rs.next()) {
                    result.add(wrapSingleEntity(rs));
                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
     
            return result;
        }
     
        /**
         * Méthode abstraite pour wrapper un unique résultat de requête et renvoyer
         * un objet entité correspondant.
         * @param rs
         * @return entity
         */
        protected abstract T wrapSingleEntity(ResultSet rs);
    }
    Et puis tu écris tes sous-classes comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class StationDaoImpl extends DaoTemplate<Station> implements IStationDao{
     
        public List<Station> getAllStation(String zoneId) {
            String sqlReq = "SELECT * FROM T_STATION WHERE ZONE_ID = "+zoneId;    
            return processReq(sqlReq, true);
        }
     
        @Override
        public Station wrapSingleEntity(ResultSet rs) {
            Station station = new Station();
            station.setStationId(rs.getInt(1)+"");
            station.setStationName(rs.getString(2));            
            return station;
        }
    }
    Tu vas voir, ça va être beaucoup plus propre, d'un coup
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  14. #14
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Ah oui, c'est beaucoup plus propre

    Simple ! Efficace ! (Et pas chère, c'est la MAAF que je préfère)

    Merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. "Caster" le contenu d'une liste
    Par Santalyn dans le forum C#
    Réponses: 2
    Dernier message: 25/04/2010, 20h46
  2. Caster le résultat d'une liste en double
    Par Incinerator dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 24/11/2008, 12h28
  3. caster une List<Object> en List<..>
    Par K-Kaï dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2006, 17h43
  4. Générer une liste
    Par pfredin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/04/2003, 15h30
  5. tri d'une liste
    Par Guigui_ dans le forum Langage
    Réponses: 4
    Dernier message: 09/01/2003, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo