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

Développement Web en Java Discussion :

Action SQL générique


Sujet :

Développement Web en Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 25
    Points
    25
    Par défaut Action SQL générique
    Bonjour,

    Dans le cadre d'une application web, nous faisons des insertions, updates dans une base mysql. (Nous faisons aussi des select pour instancier des objets)
    Cependant, nous aimerions bien créer une classe générique, car nous réécrivons toujours les même fonctions, alors qu'il n'y a que les champs des tables et la façon de remplir les objet qui change.

    En gros, serait-il possible d'avoir une liste contenant les colonnes de la table avec leur types pour lorsque l'on fasse une insertion, on puisse utiliser une boucle qui face tout seul : statement.setString, statement.setInt...
    Et en lecture pour instancier l'objet, une boucle qui dit : C'est la colonne id alors on fait setId, c'est la colonne description alors setDescription.

    J'imagine que c'est un problème récurent, mais je n'ai pas trouvé de réponses.

    Nous aimerions aussi nous passer d'outils style hibernate.

    Merci.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    Citation Envoyé par Linkman_xbp Voir le message

    En gros, serait-il possible d'avoir une liste contenant les colonnes de la table avec leur types pour lorsque l'on fasse une insertion, on puisse utiliser une boucle qui face tout seul : statement.setString, statement.setInt...
    Et en lecture pour instancier l'objet, une boucle qui dit : C'est la colonne id alors on fait setId, c'est la colonne description alors setDescription.

    Merci.
    Ben oui c'est possible. Mais en se passant d'outils style hibernate, va falloir se retrousser les manches. La seule chose qui pourrait te coincer c'est les appel setter / getters à partir d'un nom de propriété. Dans ce cas je te recommande de jeter un œil à commons beanutils, qui contient déjà des méthodes pour convertir un objet et Map<clé,valeur> et vis versa.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 25
    Points
    25
    Par défaut
    Hum, je vais jeter un œil. Merci.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 33
    Points : 25
    Points
    25
    Par défaut
    Je reviens sur mon problème pour ceux qui rencontreraient le même.
    Après avoir regardé beanutils, je n'ai pas trouvé ce qui me convenait, du coup j'ai opté pour de la réflexion.

    Pour le moment, il n'y a que le code qui permet de remplir des objets à partir d'un resultset (donc on suppose que la requête a déjà été faite)

    Voici en brut ma fonction, si vous voyez des optimisations à faire, pourriez-vous m'en faire part.
    Je livrerai ensuite le code permettant de faire des insert et update en automatique.

    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
     
    public T fill(ResultSet res) 
    {
    	try
    	{
    		Method m = null; String methodName = "";
    		ResultSetMetaData metadata = res.getMetaData();	
    		Class<?> c = Class.forName("beans."+this.getClassName());
    		Object instance = c.getConstructor().newInstance();
     
    		for(int i = 0; i < metadata.getColumnCount(); i++)
    		{
    			int index = i+1;
     
    			StringBuilder result = new StringBuilder(metadata.getColumnName(index));
    			result.replace(0, 1, result.substring(0, 1).toUpperCase());
    			methodName = "set"+result.toString();
    			switch(metadata.getColumnType(index))
    			{
    				//Integer
    				case 4 :
    					m = c.getMethod(methodName, int.class);
    					m.invoke(instance, res.getInt(index));
    				break;
     
    				//Float
    				case 7 :
    					m = c.getMethod(methodName, float.class);
    					m.invoke(instance, res.getFloat(index));						
    				break;
     
    				//String
    				case 12 :
    					m = c.getMethod(methodName, String.class);
    					m.invoke(instance, res.getString(index));
    				break;
     
    				//Boolean
    				case -7 :
    					m = c.getMethod(methodName, int.class);
    					m.invoke(instance, res.getInt(index));
    				break;
     
    				//Timestamp
    				case 93 :
    					m = c.getMethod(methodName, java.util.Date.class);
    					m.invoke(instance, res.getDate(index));
    				break;
    			}
    		}			
     
    		return (T) instance;
    	}
    	catch (Exception e) {
    		Logs.error("ECHEC de remplissage de l'objet " + this.getClassName() + " : " + e.getMessage());
    		return null;
    	}
    }

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 807
    Points
    48 807
    Par défaut
    a vue de nez comme ça, je ne vois pas en quoi beanutils ne te convient pas:

    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
     
    		Object instance = ConstructorUtils.invokeConstructor(Class.forName("beans."+this.getClassName()),new Object[0]);
    		ResultSetMetaData metadata = res.getMetaData();	
                    Map<String,Object> datas= new HashMap<String,Object>();
                    for(int index = 1; index <= metadata.getColumnCount(); index++)
    		{
    			String property = metadata.getColumnName(index));
                            Object o = null;
    			switch(metadata.getColumnType(index))
    			{
    				//Integer
    				case 4 :
    					o = res.getInt(index);
    				break;
     
    				//Float
    				case 7 :
    					o = res.getFloat(index);
    				break;
     
    				//String
    				case 12 :
    					o = res.getString(index);
    				break;
     
    				//Boolean
    				case -7 :
    					o= res.getInt(index);
    				break;
     
    				//Timestamp
    				case 93 :
    					o = res.getDate(index);
    				break;
    				default:
    				        continue;
    			}
    			map.put(property,o);
    		}			
    		BeanUtils.populate(instance,map);

Discussions similaires

  1. Chaine SQL générique ne fonctionnant pas
    Par beegees dans le forum Langage
    Réponses: 3
    Dernier message: 30/10/2008, 16h17
  2. Classe SQL Générique : Garder Connexion à une DB ?
    Par ExSter dans le forum Accès aux données
    Réponses: 7
    Dernier message: 16/04/2008, 17h20
  3. Requête SQL générique
    Par xav13fr dans le forum Développement
    Réponses: 3
    Dernier message: 20/02/2008, 08h50
  4. Requête SQL générique
    Par xav13fr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 20/02/2008, 08h50
  5. Action SQL bouclée N fois
    Par ob1knob dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 29/11/2006, 10h02

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