Data Mapper Pattern

Dificulté:

Avec ce pattern nous avons les classes métiers (adhérent et typeAdherent) qui contiennent les champs des tables de la base de données et les méthodes directement liées au métier.

Toutes les commandes SQL sont maintenant regroupées dans des classes à part. Toutes ces classes constituent une couche nommée « Data Access Layer ». Dans l’exemple on a créé un répertoire « DataAccessLAyer » qui contient toutes les classes contenant les commandes SQL (adherentDB et typeAdhesionDB).

Les classes métiers et l’interface graphique ne doivent jamais faire des requêtes SQL directement. Elles doivent toujours passer par la couche d’accès aux données.


La classe adherent

     public class Adherent
    {
        private int Id;
        private string Nom;
        private string Prenom;
        private string CodePostal;
        private string Ville;
        private DateTime AnneeNaissance;
        private TypeAdhesion TypeAdhesion;
        /// <summary>
        /// Constructeur 
        /// </summary>
        /// <param name="leNom">le nom</param>
        /// <param name="lePrenom">le prénom</param>
        /// <param name="leCodePostal">le code postal</param>
        /// <param name="laVille">la ville</param>
        /// <param name="lAnneeDeNaissance">la date de naissance</param>
        /// <param name="leType">le type de l'adhésion</param>
        public Adherent(string leNom, string lePrenom, string leCodePostal, string laVille, DateTime lAnneeDeNaisance, TypeAdhesion leType)
        {
            Id = -1;
            Nom = leNom;
            Prenom = lePrenom;
            CodePostal = leCodePostal;
            Ville = laVille;
            AnneeNaissance = lAnneeDeNaisance;
            TypeAdhesion = leType;
        }
        /// <summary>
        /// Constructeur avec un id
        /// </summary>
        /// <param name="lId">id de l'adhérent</param>
        /// <param name="leNom">le nom</param>
        /// <param name="lePrenom">le prénom</param>
        /// <param name="leCodePostal">le code postal</param>
        /// <param name="laVille">la ville</param>
        /// <param name="lAnneeDeNaissance">la date de naissance</param>
        /// <param name="leType">le type de l'adhésion</param>
        public Adherent(int id, string leNom, string lePrenom, string leCodePostal, string laVille, DateTime lAnneeDeNaisance, TypeAdhesion leType) :this(leNom, lePrenom, leCodePostal, laVille, lAnneeDeNaisance, leType)
        {
            Id = id;
        }
        /// <summary>
        /// Getter pour l'id
        /// </summary>
        /// <returns>l'id</returns>
        public int GetId()
        {
            return Id;
        }
        /// <summary>
        /// Getter pour le nom
        /// </summary>
        /// <returns>le nom</returns>
        public string GetNom()
        {
            return Nom;
        }
        /// <summary>
        /// Getter pour le prénom
        /// </summary>
        /// <returns>le nom</returns>
        public string GetPrenom()
        {
            return Prenom;
        }
        /// <summary>
        /// Getter pour  le code postal
        /// </summary>
        /// <returns>le CP de l'adhérent</returns>
        public string GetCodePostal()
        {
            return CodePostal;
        }
        /// <summary>
        /// Getter pour  la ville
        /// </summary>
        /// <returns>la ville de l'adhérent</returns>
        public string GetVille()
        {
            return Ville;
        }
        /// <summary>
        /// Getter pour  la date de naissance
        /// </summary>
        /// <returns>l'année de naissance</returns>
        public DateTime GetDateDeNaissance()
        {
            return AnneeNaissance;
        }
        /// <summary>
        /// Getter pour  le type d'adhesion
        /// </summary>
        /// <returns>le type de l'adhésion</returns>
        public TypeAdhesion GetTypeAdherent()
        {
            return TypeAdhesion;
        }
        /// <summary>
        /// Setter pour l'id
        /// </summary>
        public void SetId(int id)
        {
            Id = id;
        }
        /// <summary>
        /// Setter pour le nom
        /// </summary>
      
        public void SetNom(string nom)
        {
           Nom = nom;
        }
        /// <summary>
        /// Setter pour le prénom
        /// </summary>
        public void SetPrenom(string prenom)
        {
            Prenom = prenom;
        }
        /// <summary>
        /// Setter pour  le code postal
        /// </summary>
        public void SetCodePostal(string codePostal)
        {
            CodePostal = codePostal;
        }
        /// <summary>
        /// setter pour  la ville
        /// </summary>
        public void SetVille(string ville)
        {
            Ville = ville;
        }
        /// <summary>
        /// setter pour  la date de naissance
        /// </summary>
        public void GetDateDeNaissance(DateTime dateNaissance)
        {
            AnneeNaissance = dateNaissance;
        }
        /// <summary>
        /// Setter pour  le type d'adhesion
        /// </summary>
        public void GetTypeAdherent(TypeAdhesion type )
        {
            TypeAdhesion = type;
        }
    }

La classe AdherentDB qui contient les commandes SQL et les méthodes lire, ajouter, supprimer...

    /// <summary>
        /// La méthode GetAdherent retourne les informations sur un adherent. 
        /// </summary>
        /// <param name="id">l'id de l'adhérent</param>
        /// <returns>un adhérent</returns>
        public  Adherent GetAdherent(int id)
        {
            string connectionString = Initialisation.InitialiserConnexion();
            Adherent lAdherent = null;
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                connection.Open();
                string query = "SELECT idAdherent, nom, prenom, codePostal, ville, dateNaissance, typeAdhesion from adherent WHERE idAdherent = @id; ";
                //Create Command
                MySqlCommand cmd = new MySqlCommand(query, connection);
                cmd.Parameters.AddWithValue("@id", id);
                //Crée un data reader et exécute la commande
                using (MySqlDataReader dataReader = cmd.ExecuteReader())
                {
                    //Lit les données 
                    while (dataReader.Read())
                    {
                        int idAdherent = Convert.ToInt32(dataReader["idAdherent"]);
                        string nom = dataReader["nom"].ToString();
                        string prenom = dataReader["prenom"].ToString();
                        string cp = dataReader["codePostal"].ToString();
                        string ville = dataReader["ville"].ToString();
                        DateTime annee = Convert.ToDateTime(dataReader["dateNaissance"]);
                        int idType = Convert.ToInt32(dataReader["typeAdhesion"]);
                        TypeAdhesionDB typeDB = new TypeAdhesionDB();
                        TypeAdhesion leTypeDeAdherent = typeDB.GetTypeAdhesion(idType);
                        lAdherent = new Adherent(idAdherent, nom, prenom, cp, ville, annee, leTypeDeAdherent);
                    }
                }
            }
            return lAdherent;
        }
        /// <summary>
        /// La méthode GetAllAdherent retourne les informations sur tous les adhérents de la base.  
        /// </summary>
        /// <param name="id"></param>
        /// <returns>la liste de tous les adhérents</returns>
        public  List<adherent> GetAllAdherent()
        {
            string connectionString = Initialisation.InitialiserConnexion();
            List<adherent> listeDeTousLesAdherents = new List<adherent>();
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                connection.Open();
                string query = "SELECT idAdherent from adherent";
                //Create Command
                MySqlCommand cmd = new MySqlCommand(query, connection);
                //Crée un data reader et exécute la commande
                using (MySqlDataReader dataReader = cmd.ExecuteReader())
                {
                    //Lit les données 
                    while (dataReader.Read())
                    {
                        Adherent lAdherent = null;
                        int idAdherent = Convert.ToInt32(dataReader["idAdherent"]);
                        lAdherent = GetAdherent(idAdherent);
                        if (lAdherent != null)
                        {
                            listeDeTousLesAdherents.Add(lAdherent);
                        }
                    }
                }
            }
            return listeDeTousLesAdherents;
        }
        /// <summary>
        /// La méthode SaveAdherent crée un nouvel adhérent s'il n'existe pas et le modifie 
        /// s'il existe déjà dans la base. 
        /// </summary>
        public void Save(Adherent unAdherent)
        {
            string connectionString = Initialisation.InitialiserConnexion();
            string query;
            if (unAdherent.GetId() == -1)
            {
                //Création d'un nouvel adhérent    
                query = "insert into adherent (nom, prenom, codePostal, ville, dateNaissance, typeAdhesion) 
                values (@nom, @prenom, @codePostal, @ville, @dateNaissance, @typeAdhesion);";
            }
            else
            {
                //Modification d'un adhérent
                query = "update adherent 
                set  idAdherent = @id, nom = @nom, prenom = @prenom, codePostal = @prenom, 
                ville = @ville, dateNaissance = @dateNaissance, typeAdhesion = typeAdhesion 
                where idAdherent = @id";
            }
            using (MySqlConnection connection = new MySqlConnection(connectionString))
            {
                connection.Open();
                //Create Command
                MySqlCommand cmd = new MySqlCommand(query, connection);
                cmd.Parameters.AddWithValue("@id", unAdherent.GetId());
                cmd.Parameters.AddWithValue("@nom", unAdherent.GetNom());
                cmd.Parameters.AddWithValue("@prenom", unAdherent.GetPrenom());
                cmd.Parameters.AddWithValue("@codePostal", unAdherent.GetCodePostal());
                cmd.Parameters.AddWithValue("@dateNaissance", unAdherent.GetDateDeNaissance().ToString("yyyy-MM-dd"));
                cmd.Parameters.AddWithValue("@ville", unAdherent.GetVille());
                cmd.Parameters.AddWithValue("@typeAdhesion", unAdherent.GetTypeAdherent().idTypeAdhesion);
                //exécution la commande
                cmd.ExecuteNonQuery();
            }
        }
        /// <summary>
        /// TODO.  Supprimer adherent
        /// </summary>
        /// <param name="id"></param>
        public static void Delete(int id)
        {
        }
    }

L'utilisation du data mapper pour accéder aux données au niveau de la couche graphique

     public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            //Récupération de tous les adhérents et affichage dans une listView qui a pour nom listViewAdherents
            AdherentDB adhDB = new AdherentDB();
            List<adherent> lesAdherents = adhDB.GetAllAdherent();
            foreach (var item in lesAdherents)
            {
             
                ListViewItem listItem = new ListViewItem(item.GetNom());
                listItem.SubItems.Add(item.GetPrenom());
                listItem.SubItems.Add(item.GetVille());
                listItem.SubItems.Add(item.GetCodePostal());
                listItem.SubItems.Add(item.GetDateDeNaissance().ToShortDateString());
                listItem.SubItems.Add(item.GetTypeAdherent().Libelle);
           
                listViewAdherents.Items.Add(listItem);
            }
            //Exemple de création d'un nouvel adhérent (avec des données en dur) dans la base. 
            //On doit récupérer le type d'adhésion pour pouvoir créer l'adhérent.
            TypeAdhesionDB typeDB = new TypeAdhesionDB();
            TypeAdhesion t = typeDB.GetTypeAdhesion(1);
            Adherent a = new Adherent("tom", "tim", "445", "Paris", new DateTime(1980, 5, 6), t);
            adhDB.Save(a);
            
            
            //Modification de la ville d'un adhérent
            Adherent a1 = adhDB.GetAdherent(6);
            a1.SetVille("NY");
            adhDB.Save(a1);
        }
    }

L'exemple complet est sur GitHub.C'est la version qu'il vaut mieux utiliser pour développer l'application complète.