Java DataBase Connections



Documents pareils
Introduction à JDBC. Accès aux bases de données en Java

Java DataBaseConnectivity

Programmation d application Bases de données avec Java

TP Programmation Java / JDBC / Oracle

Application BdD et JDBC. Introduction 1/28. I Dans tout les cas, une seule problématique. I Quelques alternatives :

OpenPaaS Le réseau social d'entreprise

Accès aux bases de données

La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 francois.jannin@inp-toulouse.fr 1

JDBC le langage Java XVI-1 JMF

1. Langage de programmation Java

Application web de gestion de comptes en banques

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

JDBC JDBC. Java DataBase Connectivity

Connexion à SQL Server 2005 à partir du serveur d application SJSAS 9 Utilisation d une interface JDBC

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Java Database Connectivity (JDBC) - Langage SQL

Java - MySQL. Code: java-mysql

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Tutoriel d installation de Hibernate avec Eclipse

Notes de cours : bases de données distribuées et repliquées

Exercices sur SQL server 2000

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

Java et les bases de données

Exploitation de bases de données relationnelles et orientées objet IFT287

1. Base de données SQLite

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

Plan. Accès aux données dans le framework.net. ADO.NET Entity Framework LINQ ADO.NET ADO.NET. 1. ADO.NET Mode connecté Mode non connecté

Dialogue avec la base de données

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Chapitre 10. Les interfaces Comparable et Comparator 1

Configurer la supervision pour une base MS SQL Server Viadéis Services

Olivier Mondet

Threads. Threads. USTL routier 1

Bases de données avancées

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Bases de Données relationnelles et leurs systèmes de Gestion

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Construire une base de donnée pour bibliothèque

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Compte-rendu de projet de Système de gestion de base de données

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Premiers Pas en Programmation Objet : les Classes et les Objets

La base de données XML exist. A. Belaïd

Connectivité aux bases de données Java (JDBC)

Le langage SQL pour Oracle - partie 1 : SQL comme LDD

Paradox 9. Guide de l utilisateur jpdox Web Utilities

Programmer en JAVA. par Tama

PDO : PHP Data Object 1/13

PHP 5. La base de données MySql. A. Belaïd 1

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

MySQL avec Mac OS X. Quelques manipulations avec le terminal sont nécessaires si une version de MySQL est déjà lancée:

TP Contraintes - Triggers

Mysql. Les requêtes préparées Prepared statements

Cours Bases de données 2ème année IUT

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Le langage SQL (première partie) c Olivier Caron

Paginer les données côté serveur, mettre en cache côté client

Corrigé des exercices sur les références

Panorama des Bases de Données

La programmation orientée objet Gestion de Connexions HTTP Manipulation de fichiers Transmission des données PHP/MySQL. Le langage PHP (2)

Devoir Data WareHouse

Corrigés détaillés des exercices

as Architecture des Systèmes d Information

CREATION WEB DYNAMIQUE

Langage SQL : créer et interroger une base

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Héritage presque multiple en Java (1/2)

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Bases de données relationnelles

Projet de programmation (IK3) : TP n 1 Correction

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Connexion à une base de données. Connexion à une base de données. Connexion à une base de données Développement d'une application

Plan du cours. Historique du langage Nouveautés de Java 7

Once the installation is complete, you can delete the temporary Zip files..

Comment Accéder à des Bases de Données MySQL avec Windows lorqu'elles sont sur un Serveur Linux

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

Package Java.util Classe générique

Une introduction à Java

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

PHP. PHP et bases de données

Modernisation, développement d applications et DB2 sous IBM i Technologies, outils et nouveautés Volubis.fr

Programmation par les Objets en Java

Cours Bases de données 2ème année IUT

SQL Historique

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

ORACLE 10G DISTRIBUTION ET REPLICATION. Distribution de données avec Oracle. G. Mopolo-Moké prof. Associé UNSA 2009/ 2010

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

FileMaker 13. Guide de référence SQL

Instructions Mozilla Thunderbird Page 1

Partie 0 : Gestion des tablespace et des utilisateurs... 3

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Un ordonnanceur stupide

Transcription:

Java DataBase Connections JDBC est une api permettant l'utilisation de bases de données indépendamment du type de SGBD utilisé. Il suffit d'indiquer le driver correspondant au gestionnaire de bases de données utilisé et de faire les requêtes en SQL standard. Y. Parchemal UPD 2010 ch.. 5-2

$<bd> JDBC Utilisation de plusieurs classes et interfaces du package java.sql java.sql.drivermanager Une classe d'utilitaire permettant en particulier d'obtenir une connexion à la base de données Des interfaces, en particulier : java.sql.connection java.sql.statement : les requêtes java.sql.resulset : les résultats des requêtes Y. Parchemal UPD 2010 ch.. 5-3

Les différentes étapes pour utiliser une base de données 1 Charger la classe correspondant au driver souhaité Class.forName("oracle.jdbc.driver.OracleDriver") 2 Obtenir une connexion à la base de données Connection connexion = DriverManager.getConnection(,, ); 3 Construire et exécuter une requête Statement stmt=connexion.createstatement( ); ResultSet rs = stmt.executequery(" "); ou int count = stmt.executeupdate(" "); 4 Traiter le résultat obtenu en utilisant les méthodes de ResultSet. 5. Fermer le statement et la connexion connexion.close( ); Y. Parchemal UPD 2010 ch.. 5-4

1. Charger le bon driver jdbc Le driver JDBC est une classe implémentant l'interface java.sql.driver. Elle est spécifique à un SGBD précis. Pour indiquer le driver utilisé, on utilise la méthode Class.forName. Elle permet le chargement dynamique de classe (nous revenons en détail sur ce point dans la suite du cours). exemple de chargement de driver : Class.forName("com.mysql.jdbc.Driver");// pour mysql Class.forName("oracle.jdbc.driver.OracleDriver");// pour oracle Class.forName("jdbc.odbc.JdbcOdbcdriver");// pour odbc Class.forName("org.postgresql.Driver"); // pour postgresql Y. Parchemal UPD 2010 ch.. 5-5

2. Se connecter à la base de données Connexion connexionavecmysql = DriverManager.getConnection("jdbc:mysql://localhost/pary","root","aw3peZ"); La syntaxe des urls url avec ODBC : "jdbc:odbc:nomdemabase" url avec Postgres : "jdbc:postgresql://urlserveur/nomdemabase" url avec mysql : "jdbc:mysql://urlserveur/nomdemabase" class DriverManager{.../** Attempts to establish a connection to the given database URL. The * DriverManager attempts to select an appropriate driver * from the set of registered JDBC drivers. * @ param url - a database url of the form jdbc:subprotocol:subname * @ param user - the database user on whose behalf the connection is being made * @ param password - the user's password * @ return a connection to the URL * @ throw SQLException if a database access error occurs */ public static Connection getconnection(string url,string user,string password) throws SQLException { Y. Parchemal UPD 2010 ch.. 5-6

Problèmes Problèmes classiques classiques lors des premières utilisation de jdbc Les problèmes classiques avant d'arriver à exécuter un programme utilisant jdbc : - la classe du driver et les classes associées (regroupées dans un jar) doivent être dans le classpath au moment de l'exécution - l'url de la base doit être écrite correctement - l'user et son password doivent être enregistrés dans le SGBD - la base doit être utilisable à partir du poste où l'on exécute le programme Java Y. Parchemal UPD 2010 ch.. 5-7

Exemple : se connecter à une base de données public static void main(string [ ] args) { try { // Tout d'abord chargement dynamique du driver Class.forName("com.mysql.jdbc.Driver"); // puis appel de la méthode getconnexion String nombase="pary"; String hostname="www.ens.math-info.univ-paris5.fr"; String urlbd = "jdbc:mysql://"+hostname+"/"+nombase; String user="pary"; String password="xxxxxxxx"; Connection connection=drivermanager.getconnection(urlbd,user,password ); System.out.println("Connexion réalisée!"); connection.close( ); catch (SQLException e){ System.out.println("Connexion non effectuée!"); e.printstacktrace( ); catch (ClassNotFoundException e){ System.out.println("Vérifier que la classe du driver est dans le classpath"); e.printstacktrace( ); Y. Parchemal UPD 2010 ch.. 5-8

3 exécution de requêtes // tout d'abord, récupération d'un Statement à partir de la connexion Statement stmt = connection.createstatement( ); // puis exécution de la requête en utilisant : a) executeupdate pour les requêtes de mise à jour de la base INSERT, CREATE, DELETE... b) executequery pour les requêtes interrogeant la base SELECT Y. Parchemal UPD 2010 ch.. 5-9

3a executeupdate // tout d'abord, récupération d'un Statement à partir de la connexion Statement stmt = connection.createstatement( ); // puis exécution de la requête int count = stmt.executeupdate( "INSERT INTO QUESTION(intitule,reponse,auteur,niveau)"+ "VALUES (\"Les classes sont toujours abstraites\",\"non\",\"pary\",1)" ); /** Executes the given SQL statement, which may be an INSERT, UPDATE, or DELETE statemen * or an SQL statement that returns nothing, such as an SQL DDL statement. * @param sql - an SQL INSERT, UPDATE or DELETE statement * or an SQL statement that returns nothing * @ return either the row count for INSERT, UPDATE or DELETE statements, * or 0 for SQL statements that return nothing * @ throws SQLException - if a database access error occurs or the given SQL statement produces a ResultSet object */ public int executeupdate(string sql) throws SQLException Y. Parchemal UPD 2010 ch.. 5-10

3a exemple de création de table avec executeupdate //La fonction ci dessous permet de créer la table question si elle n'existait pas déjà /** crée les tables nécessaires pour les comptes en utilisant la 'connection' fournie*/ private static void createifnotexiststablequestion(connection connection) throws SQLException{ Statement statement = connection.createstatement( ); String request = "CREATE TABLE question" + " (intitule VARCHAR(80),reponse VARCHAR(80),"+ "auteur VARCHAR(80),niveau INTEGER not NULL)"; try{statement.executeupdate(request); catch (SQLException ignored) { System.out.println(request);ignored.printStackTrace( ); finally {if (statement!=null) statement.close( ); Y. Parchemal UPD 2010 ch.. 5-11

3b executequery Statement stmt = connection.createstatement( ); ResultSet rs= stmt.executequery("select intitule,reponse FROM question"); // Interface Statement /** Executes the given SQL statement, which returns a single ResultSet object. * @param sql - an SQL statement to be sent to the database sql, typically a static SQL SELECT statement * @ return a ResultSet object that contains the data produced by the given query; never null * @ throws SQLException - if a database access error occurs or the given SQL statement produces anything other than a single ResultSet object */ public ResultSet executequery(string sql) throws SQLException{ Y. Parchemal UPD 2010 ch.. 5-12

4 Utiliser le ResultSet ResultSet rs= stmt.executequery("select intitule,reponse FROM question"); La méthode next de ResultSet permet de parcourir une à une les lignes du résultat. La méthode getobject de ResultSet permet de récupérer la valeur d'une colonne sur la ligne courante. while (rs.next( )){ Object obj1 = rs.getobject(1);// l'intitulé Object obj2 = rs.getobject(2);// la réponse System.out.println("("+obj1+","+obj2+")") ; La méthode next permet de passer à la ligne suivante. Elle rend false s'il n'y a pas de ligne suivante Le premier appel à next permet de se positionner sur la première ligne Y. Parchemal UPD 2010 ch.. 5-13

Quelques méthodes de l'interface java.sql.resultset /** deplace le curseur vers la ligne suivante @return vrai si il y a une ligne suivante @exception SQLException si une erreur survient lors de l'accès à la base*/ public boolean next( ) throws SQLException /** rend l'objet de la colonne n 'numcol' de la rangée courante de ce ResultSet @exception SQLException si une erreur survient lors de l'accès à la base*/ public Object getobject(int numcol) throws SQLException /** rend l'objet de la colonne de nom 'nomcol' de la rangée courante de ce ResultSet @exception SQLException si une erreur survient lors de l'accès à la base*/ public Object getobject(string nomcol) throws SQLException Il existe aussi de nombreuses autres méthodes similaires getstring, getdouble( ) utilisable pour certains types de données SQL Y. Parchemal UPD 2010 ch.. 5-14

Quelques correspondances entre type SQL et type Java SQL classe de getobject( ) Autre fonction utilisable CHAR String String getstring( ) VARCHAR String String getstring( ) INTEGER Integer int getint( ) REAL Float float getfloat( ) DOUBLE Double double getdouble( ) TIMESTAMP java.sql.timestamp TimeStamp gettimestamp( ) ResultSet rs= stmt.executequery("select niveau,auteur FROM question"); while (rs.next( )){ int niveau = rs.getint(1); String auteur = rs.getstring(2); System.out.println("( niveau : "+niveau+" auteur :"+auteur+")") ; Y. Parchemal UPD 2010 ch.. 5-15

extraits de la documentation en ligne de ResultSet public interface ResultSet A table of data representing a database result set, which is usually generated by executing a statement that queries the database. A ResultSet object maintains a cursor pointing to its current row of data. Initially the cursor is positioned before the first row. The next method moves the cursor to the next row, and because it returns false when there are no more rows in the ResultSet object, it can be used in a while loop to iterate through the result set. A default ResultSet object is not updatable and has a cursor that moves forward only. Thus, it is possible to iterate through it only once and only from the first row to the last row. The ResultSet interface provides getxxx methods for retrieving column values from the current row. Values can be retrieved using either the index number of the column or the name of the column. In general, using the column index will be more efficient. Columns are numbered from 1. For maximum portability, result set columns within each row should be read in left-to-right order, and each column should be read only once. Y. Parchemal UPD 2010 ch.. 5-16

Avec createstatement PreparedStatement String srequete="select intitule, reponse FROM question "+ "WHERE question.niveau= 4 AND question.auteur='dupond' " Statement stmt = connexion.createstatement( ); ResultSet result = stmt.executequery(srequete); Avec preparedstatement String srequete="select intitule, reponse FROM question "+ "WHERE question.niveau=? AND question.auteur=? " PreparedStatement stmt = connexion.preparestatement(srequete); stmt.setint(1,4);//niveau = 4 stmt.setstring(2,"dupond");// auteur = dupond ResultSet result = stmt.executequery( ); Y. Parchemal UPD 2010 ch.. 5-17

$<bd> L'interface ResultSetMetaData ResultSetMetaData permet de connaître le nombre de colonnes, le nom des colonnes,... La méthode getmetadata de l'interface ResultSet permet de récupérer une instance de ResultSetMetaData. /** @return le nombre de colonne du ResultSet de ce ResultSetMetaData*/ public int getcolumncount( ) throws SQLException { /**@return le nom d'affichage de la colonne n 'column' de ce ResultSetMetaData ATTENTION : les colonnes sont numérotées à partir de 1!*/ public String getcolumnlabel(int column) throws SQLException /** Get the designated column's specified column size. * For numeric data, this is the maximum precision. * For character data, this is the length in characters... */ public int getprecision(int column) throws SQLException; Y. Parchemal UPD 2010 ch.. 5-18

$<bd> Transactions : commit et rollback // par défaut, un commit est exécuté après chaque requête // on demande ici que ce ne soit pas le cas connection.setautocommit(false); // dans ce cas, la transaction ne prend fin // qu'après l'appel à commit ou rollback // commit pour la valider connection.commit( ); // rollback pour la rejeter connection.rollback( ); Y. Parchemal UPD 2010 ch.. 5-19

Chargement dynamique Lors de l'exécution d'un programme Java, les classes ne sont pas toutes chargées en mémoire. Les classes sont chargées lorsque c'est nécessaire : - quand la construction d'une instance(directe ou indirecte) est demandée - quand une méthode de la classe doit être utilisée - quand la méthode class.forname("nomdelaclasseacharger") est appelée La méthode Class.forName permet de forcer le chargement dynamique de classe Y. Parchemal UPD 2010 ch.. 5-20

$<chargedyn> Bloc static La définition d'une classe peut contenir des blocs statics. public class C1{ private String s; private static Date datechargement; static { // nous sommes à l'intérieur d'un bloc static // (ils sont déclarés au même niveau que les membres de la classe) System.out.println("Chargement de la classe C1 en cours"); // on peut dans un bloc static initialiser des données membres statics par exempl datechargement=new Date( ); // on peut aussi appeler des méthodes d'autres classes C2.prevenirQueC1EstChargee( ); // en fait, on peut faire ce que l'on veut // après, la définition de la classe continue public C1(String nom){... LES BLOCS STATICS SONT EXECUTES UNE FOIS AU MOMENT DU CHARGEMENT DE LA CLASSE Y. Parchemal UPD 2010 ch.. 5-21

$<chargedyn> Chargement dynamique des drivers jdbc La méthode Class.forName permet le chargement dynamique de classe Les blocs statics de la classe concernée sont donc exécutés. Revenons à nos drivers jdbc... Toutes les classes de drivers ont un bloc static qui fait les 2 opérations suivantes: - création d'une instance de la classe en chargement - appel d'une méthode de la classe DriverManager prenant en paramètre cette instance et ayant pour rôle de l'insérer dans la liste des drivers disponibles. Ainsi, au moment de l'appel de getconnection de DriverManager, le driver est connu et la connexion au SGBD peut être effectué. Y. Parchemal UPD 2010 ch.. 5-22

$<chargedyn> Class.forName et import Pourquoi Class.forName("com.mysql.jdbc.Driver"); et pas import com.mysql.jdbc.driver;? import <nomdeclasse> ; C'est un alias évitant de mettre le nom complet des classes dans le programme : cela ne garantie en rien que la classe sera chargée import com.mysql.jdbc.driver; // insuffisant ici car on veut que la classe soit chargée pour être enregistrée auprès du DriverManager avant l'appel de getconnection. Autre différence : - import nécessite de mettre le nom de la classe "en dur" dans le programme, or la classe du Driver est souvent mise dans un fichier de configuration String classname = lirefichier("conf.xml"); Class.forName(className); Cela permet d'utiliser le même programme avec des SGBD différents sans aucune modification Y. Parchemal UPD 2010 ch.. 5-23

Un exemple complet utilisant jdbc : la classe CompteBD Nous allons définir une classe CompteBD avec les fonctionnalités habituelles (ajout d'une opération, consultation du solde...) et sauvegarde en base de données Nous allons voir : 1. Une exemple d'utilisation de la classe CompteBD 2. La base de données utilisée 3. La définition de la classe BD une classe qui encapsule les informations de connection pour obtenir facilement des Statement 4. La définition de la classe CompteBD Y. Parchemal UPD 2010 ch.. 5-24

Utilisation de la classe CompteBD public static void main(string[ ] args) throws Exception { // creation des tables à la première exécution CompteBD.creerLesTablesSiEllesNexistentPas( ); // on récupère les comptes de Dupond et Durand CompteBD c1=comptebd.getcomptebyname("dupond",true); CompteBD c2=comptebd.getcomptebyname("durand",true); // on effectue des opérations et on affiche des infos // (il faudrait un menu à la place ) c1.addoperation(120); c2.addoperation(210); System.out.println(c1.getNomTitulaire( )+" "+c1.getsolde( )+ " "+c1.getdecouvertautorise( )); System.out.println(c2.getNomTitulaire( )+" "+c2.getsolde( )+ " "+c2.getdecouvertautorise( )); Y. Parchemal UPD 2010 ch.. 5-25

La base de données associée 3 tables mémorisation du solde mémorisation du découvert mémorisation des opérations solde decouvert operation nom VARCHAR(80) montant INTEGER nom VARCHAR(80) montant INTEGER nom VARCHAR(80) montant INTEGER Les montants sont enregistrés en centimes d'euros. Y. Parchemal UPD 2010 ch.. 5-26

La classe BD /** une classe qui encapsule les informations de connection pour obtenir facilement des connexions et les fermer après usage */ class BD { static { try {Class.forName("com.mysql.jdbc.Driver"); catch (ClassNotFoundException e) {e.printstacktrace(); /** rend une connection à la base de données*/ public static Connection getconnection( ) throws SQLException{ return DriverManager.getConnection("jdbc:mysql"+"://localhost/comptebd", "root", ""); /** pour fermer d'un coup le statement */ public static void close(statement statement) throws SQLException{ if (statement!=null) statement.close(); /** pour fermer d'un coup la connexion*/ public static void close(connection connection) throws SQLException{ if (connection!=null) connection.close(); Y. Parchemal UPD 2010 ch.. 5-27

Méthodes statiques de la classe CompteBD Création des tables /** précise les informations de connexion à la base et crée si besoin les tables */ public static void creerlestablessiellesnexistentpas( ) throws SQLException{ Récupération de comptes existants, création de comptes /** rend le compte dont le titulaire est nommé 'nomtitulaire' Si create == true, crée le compte s'il n'existe pas */ public static CompteBD getcomptebyname(string nomtitulaire,boolean create) throws SQLException{ Savoir si un compte existe private static boolean iscompteexistedanslabase(string nomtitulaire) throws SQLException{ Y. Parchemal UPD 2010 ch.. 5-28

Les méthodes d'instance de la classe CompteBD /** ajoute une opération de 'montant' euros sur ce compte */ public void addoperation(double montant) throws SQLException{ /** retourne le solde de ce compte */ public double getsolde( ) throws SQLException{ /** retourne le découvert autorise pour ce compte */ public double getdecouvertautorise( ) throws SQLException{ /** teste si le solde de ce compte est insuffisant */ public boolean issoldeinsuffisant( ) throws SQLException{ /** le découvert autorise pour ce compte devient égal à 'decouvertautorise'*/ public void setdecouvertautorise(double decouvertautorise) throws SQLException { /** retourne le nom du titulaire de ce compte */ public String getnomtitulaire( ) { /** retourne une chaîne illustrant l'historique des opérations sur ce compte */ public String gethistorique( ) throws SQLException{ Y. Parchemal UPD 2010 ch.. 5-29

La classe CompteBD : les attributs Le seul attribut d'instance est nomtitulaire Le solde, le découvert autorisé et l'historique sont mémorisés dans la base de données /** le titulaire de ce compte*/ private String nomtitulaire; Y. Parchemal UPD 2010 ch.. 5-30

Création des tables de la base /** précise les informations de connexion à la base et crée si besoin les tables */ public static void creerlestablessiellesnexistentpas( )throws SQLException{ Connection connection = BD.getConnection(); Statement statement = connection.createstatement( ); //création des 3 tables,si elles existaient déjà, une SQLException sera alors lancée // par jdbc. On attrape l'erreur dans le bloc catch. try{ statement.executeupdate("create TABLE decouvert " + "(nom VARCHAR(25) PRIMARY KEY,montant INTEGER not NULL)"); statement.executeupdate("create TABLE solde " + "(nom VARCHAR(25) PRIMARY KEY,montant INTEGER not NULL)"); statement.executeupdate("create TABLE operation " + "(nom VARCHAR(25),montant INTEGER not NULL)"); catch (SQLException exp) {exp.printstacktrace( )); finally {BD.close(statement); BD.close(connection); Y. Parchemal UPD 2010 ch.. 5-31

La classe CompteBD : le constructeur /** rend le compte dont le titulaire est nommé 'nomtitulaire Si create == true, crée le compte en base s'il n'existe pas */ public static CompteBD getcomptebyname(string titulaire,boolean create) throws SQLException{ if (iscompteexistedanslabase(titulaire) create) // creation de l'instance correspondante return new CompteBD(titulaire); else throw new RuntimeException("Compte inexistant: "+titulaire); Y. Parchemal UPD 2010 ch.. 5-32

La classe CompteBD : le constructeur /** creation d'un Compte avec initialisation éventuelle de la BD */ private CompteBD(String nomtitulaire)throws SQLException{ this.nomtitulaire=nomtitulaire; if (! iscompteexistedanslabase(nomtitulaire)){ Connection connection=null; Statement statement=null; try {connection = BD.getConnection(); statement = connection.createstatement( ); // L'initialisation consiste à mettre le solde et le découvert à zéro. statement.executeupdate("insert INTO solde (nom,montant) VALUES ('" + nomtitulaire + "',0)"); statement.executeupdate("insert INTO decouvert (nom,montant) VALUES ('" + nomtitulaire + "',0)"); finally {BD.close(statement); BD.close(connection); Y. Parchemal UPD 2010 ch.. 5-33

iscompteexiste /** teste si le compte correspond à 'nomtitulaire' existe en base */ private static boolean iscompteexistedanslabase(string nomtitulaire)throws SQLException{ boolean existe=false; Connection connection=null; PreparedStatement statement=null; try { connection = BD.getConnection(); statement = connection.preparestatement( "SELECT montant FROM solde WHERE nom=?"); statement.setstring(1,nomtitulaire); // le critère d'existence est : y a-t-il un solde pour ce compte? ResultSet rs= statement.executequery( ); existe= rs.next( ); finally {BD.close(statement); BD.close(connection); return existe; Y. Parchemal UPD 2010 ch.. 5-34

La classe CompteBD : la méthode addoperation /** enregistre une opération de 'montant' Euros sur ce compte * @param montant le montant en euros de l'opération */ public void addoperation(double montant)throws SQLException{ Connection connection=null; PreparedStatement statement=null; try { connection = BD.getConnection(); statement = connection.preparestatement( "INSERT INTO operation(nom,montant) VALUES (?,?)"); statement.setstring(1, this.nomtitulaire); statement.setint(2,(int)montant*100); statement.executeupdate(); finally {BD.close(statement); BD.close(connection); this.setsolde(this.getsolde( )+montant); Y. Parchemal UPD 2010 ch.. 5-35

setdecouvertautorise /** modifie le découvert autorisé sur ce compte */ public void setdecouvertautorise(double decouvertautorise)throws SQLException{ Connection connection=null; PreparedStatement statement=null; try {connection = BD.getConnection(); statement = connection.preparestatement( "UPDATE decouvert SET montant=? WHERE nom=?"); statement.setint(1,(int)decouvertautorise*100); statement.setstring(2, this.nomtitulaire); statement.executeupdate(); finally {BD.close(statement); BD.close(connection); setsolde se définit de la même façon Y. Parchemal UPD 2010 ch.. 5-36

La classe CompteBD : la méthode getsolde /** retourne le solde de ce compte * @return le solde de ce compte */ public double getsolde( ) throws SQLException{ double solde; Connection connection=null; PreparedStatement statement=null; try {connection = BD.getConnection(); statement = connection.preparestatement( "SELECT montant FROM solde WHERE nom=?"); statement.setstring(1, this.nomtitulaire); ResultSet rs = statement.executequery( ); if (rs.next( )) solde= rs.getint(1)/100.0; else throw new RuntimeException("Compte inexistant: "+this.nomtitulaire); finally {BD.close(statement); BD.close(connection); return solde; getdecouvertautorise de définit de la Y. Parchemal même UPD 2010 façon ch.. 5-37

gethistorique /** retourne l'historique des opérations effectuées sur ce compte * @return l'historique des opérations effectuées sur ce compte */ public String gethistorique( ) throws SQLException{ ArrayList histo = new ArrayList( ); Connection connection=null; PreparedStatement statement=null; try {connection = BD.getConnection(); statement = connection.preparestatement( "SELECT montant FROM operation WHERE nom =?" ); statement.setstring(1, this.nomtitulaire); ResultSet rs = statement.executequery( ); while (rs.next( )) { double montant=rs.getint(1)/100.0; histo.add(new Double(montant)); finally {BD.close(statement); BD.close(connection); return(histo.tostring( )); Y. Parchemal UPD 2010 ch.. 5-38

La classe CompteBD :les autres méthodes /** teste si le solde de ce compte est insuffisant */ public boolean issoldeinsuffisant( ) throws SQLException { return this.getsolde( ) < - this.getdecouvertautorise(); public String getnomtitulaire( ) {return this.nomtitulaire; public String tostring( ){ return("compte de "+this.nomtitulaire); Y. Parchemal UPD 2010 ch.. 5-39