Grenoble 1 IMA Informatique & Mathématiques Appliquées UNIVERSITE JOSEPH FOURIER Sciences, Technologie, Médecine Licence Professionnelle TAI Programmation Orientée Objets Gestion de comptes en banque (Philippe.Genoud@imag.fr) Pour la gestion des comptes de ses clients la banque IMA a mis en place une base de données relationnelle définissant les tables suivantes : Table COMPTES, stockes les données relatives aux comptes de la banque. Table CLIENTS, stocke les données relatives aux clients de la banque. Table COMPTES_CLIENTS, stocke les données relatives aux associations entre comptes et clients (permet de savoir à quels comptes un client a accès, et si il en est titulaire ou possède une procuration). 1 La banque IMA, souhaite développer différentes applications Java pour permettre l exploitation de cette base de données (entre autres est prévu le développement d une application WEB pour permettre à ses clients de consulter à distance l état de leurs comptes, et éventuellement effectuer des virements d un compte vers un autre). Pour la mise en œuvre de ces applications, les architectes logiciels de la banque IMA ont décidé de définir les classes d objets métiers suivantes : Compte : qui modélise un compte en banque. Cette classe permet de faire le lien entre une application Java et la table COMPTES dans la base de données gérant les comptes de la banque. ComptesAcessibles : qui modélise l ensemble des comptes accessibles par un client donné (information établie à partir de la table COMPTES_CLIENTS. 1 TINYINT(1) correspond à un type java boolean Page 1/5
Client : qui modélise un client (à partir des informations contenues dans la table CLIENTS). Par la suite nous ne nous intéresserons qu aux classes Compte et ComptesAccessibles. Une hiérarchie de classes d exceptions est également définie (voir annexe 1) : CompteException : classe d exception pouvant être levées par les méthodes de Compte et spécialisée en deux sous classes CompteNotFoundException (utilisée lorsqu un compte désigné par un numéro n est pas trouvé dans la base de données) et CompteOpException (lorsqu une opération sur un compte (dépôt, retrait, virement) ne peut être effectuée). 1) La classe Compte Les attributs (variables d'instance) : private DataSource datasource; la source de données pour l'accès à la base de données. private final int numero; le numéro du compte. private String titulaire; le nom du titulaire Constructeur : public Compte(DataSource ds, int no) throws SQLException, CompteNotFoundException Création d'un objet java représentant un compte donné et identifié par son numéro (paramètre no). Le paramètre ds référence une DataSource qui permet d accéder à la base de données stockant les comptes. Si il n existe pas de compte de numéro no dans la table COMPTES une CompteNotFoundException est levée. Une SQLException est levée si il y a un problème d'accès à la BD pour vérifier l'existence de ce compte. Méthodes publiques : public int getnumero()retourne le numéro du compte public String gettitulaire() retourne le nom du titulaire du compte public double getsolde() throws SQLException retourne le solde courant du compte (cette valeur est obtenue en interrogeant la table COMPTES). Une SQLException est levée si il intervient un problème d accès à la base de données. public double getdecouvertmax() throws SQLException retourne le découvert maximal autorisé pour ce compte (cette valeur est obtenue en interrogeant la table COMPTES). Une SQLException est levée si il intervient un public double getdebitmax() throws SQLException retourne le débit maximal autorisé pour ce compte (cette valeur est obtenue en interrogeant la table COMPTES). Une SQLException est levée si il intervient un public boolean estadecouvert() throws SQLException renvoie la situation de découvert du compte (true si le compte est à découvert, false sinon). Une SQLException est levée si il intervient un private double retraitmaxpossible() throws SQLException renvoie le montant maximal qu'il est possible de débiter à un instant donné sur ce compte. Ce montant est le minimum entre le débit maximal autorisé et la somme du solde du compte et du débit maximum autorisé. Une SQLException est levée si il intervient un public void crediter(double s) throws SQLException, CompteOpException dépose la somme s sur le compte (s doit être > 0). Le solde du compte est modifié dans la table COMPTES. Une SQLException est levée si un problème d'accès à la BD a lieu. Une CompteOpException est levée si le dépôt ne peut être réalisé (s <0). Page 2/5
public void debiter(double r) throws SQLException, CompteOpException débite le compte d'un montant r donné (le montant spécifié pour le retrait doit être inférieur au retrait maximal possible ou supérieur à 0). Le solde du compte est modifié dans la table COMPTES. Une SQLException est levée si un problème d'accès à la BD a lieu. Une CompteOpException est levée si le retrait ne peut être réalisé (r <0 ou r > au retrait maximal possible sur ce compte). public void virer(double r, Compte c) throws SQLException, CompteOpException effectue un virement d un montant r de ce compte vers le compte c. Une transaction est effectuée pour modifier les soldes des comptes dans la table COMPTES. Une SQLException est levée si un problème d'accès à la BD a lieu, la transaction est alors annulée. Une CompteOpException est levée si le virement ne peut être réalisé, (r <0 ou bien r > au retrait maximal possible sur ce compte). Question 1 : a) Quel est l intérêt d utiliser une variable d instance de type javax.sql.datasource plutôt qu une référence de type java.sql.connection pour les accès à la base de données? b) Quel est l intérêt de définir la hiérarchie d exceptions CompteException, CompteOpException, CompteNotFoundException? c) Ecrire le code de la classe CompteOpException. d) Ecrire le code du constructeur de la classe Compte. e) Ecrire le code des méthodes getsolde(), getdecouvermax() et getdebitmax(). Vous pouvez factoriser le code similaire en introduisant une méthode privée invoquée par ces trois méthodes. Dans ce cas vous écrirez également le code de cette méthode. f) Ecrire le code de la méthode debiter(). g) Ecrire le code de la méthode virer(double r, Compte c). 2) La classe ComptesAccessibles Attributs : private int idclient; l'identifiant du client associé à cette liste. private... lescomptes; la structure de données pour stocker l ensemble des comptes accessibles par le client idclient. Constructeur : public ComptesAccessibles(DataSource ds, int idclient) throws SQLException, CompteException, ClientNotFoundException Construit la liste des comptes accessibles pour le client dont l identifiant est idclient. ds est la référence d un objet DataSource permettant l'accès à la base de données. Recherche dans la table COMPTES_CLIENTS, tous les numéros de comptes pour lesquels CLIENT_ID=idClient, puis pour chacun des numéros trouvés crée l objet Compte correspondant et stocke sa référence dans une structure de donnée interne à ComptesAccessibles. Une SQLException est levée si une erreur intervient lors de l'accès à la base de données. Une CompteException est levée si l'un des comptes de la liste ne peut être créé. Méthodes publiques : public int nbcomptes() retourne le nombre de comptes présent dans l ensemble des comptes accessibles. public Compte compte(int no) recherche dans l ensemble des comptes accessibles le compte de numéro no. Retourne sa référence si il est présent, null si il n y est pas. public Iterator<Compte> iterator()retourne un itérateur pour le parcours de l ensemble des comptes accessibles. Page 3/5
Question 2 : a) Quel type java utiliseriez vous pour l attribut lescomptes? Pourquoi? b) Ecrire le code du constructeur de la classe ComptesAccessibles c) Ecrire le code des méthodes nbcomptes(), compte(int no) et iterator(). Question 3 : Quelles modifications apporteriez-vous aux classes Compte et ComptesAccessibles afin que l iterateur retourné par la méthode iterator() de cette dernière fournisse les comptes dans l ordre croissant de leurs numéros? Annexe : Hiérarchie des exceptions CompteException Annexe 2 : Quelques requêtes SQL Recherche dans la table COMPTES_BANQUE le solde du compte de numéro 1001 SELECT SOLDE FROM COMPTES_BANQUE WHERE NUMERO=1001 Recherche de tous les numéros de compte pour lequels le client 60097 a une autorisation d accès SELECT NUMERO FROM COMPTES_CLIENTS WHERE CLIENT_ID = 60097 Ajout de 1000 au solde du compte de numéro 1001 UPDATE COMPTES_BANQUE SET SOLDE = SOLDE+1000 WHERE NUMERO=1001 Page 4/5
Page 5/5