• Aucun résultat trouvé

Manuele Kirsch Pinheiro Maître de conférences en Informatique Centre de Recherche en Informatique Université Paris 1 – Panthéon Sorbonne

N/A
N/A
Protected

Academic year: 2022

Partager "Manuele Kirsch Pinheiro Maître de conférences en Informatique Centre de Recherche en Informatique Université Paris 1 – Panthéon Sorbonne"

Copied!
39
0
0

Texte intégral

(1)

Manuele Kirsch Pinheiro

Maître de conférences en Informatique Centre de Recherche en Informatique Université Paris 1 – Panthéon Sorbonne

Manuele.Kirsch-Pinheiro@univ-paris1.fr http://mkirschp.free.fr

(2)

Contenu prévisionnel

• Révision Programmation Orientée Objets

– Révision concepts de base (classe, objet, héritage, polymorphisme…)

• Structures des données en Java

– Array, List, Map, Set…

• Traitement d’exceptions

• Interface graphique

– AWT & Swing

– Traitement d’événements

• Design patterns

• Modèle MVC

• Architectures 2-tier et 3-tier

• Accès aux bases des

données en Java

(3)

• 2-couches

– Séparation entre interface et logique d’application – Réutilisation possible, mais limitée

• Dépendance application  interface

• Changement d’interface demande des modifications sur l’application

Couche interface Couche application

(4)
(5)

• Dépendances entre les couches

• Évolution des éléments difficile

– Évolution de l’interface

Ex. : migration AWT - Swing

– Évolution du comportement de l’interface

Ex. : vérification des données après une action

– Évolution de la couche application

Ex. : nouvelles fonctionnalité dans la couche métier

– Évolution du modèle de données

Ex. : changement de base des données

Réécriture

(6)

• Termes liés

– 3-tier, n-tier, multi-tier architecture

Objectif

– Une réelle séparation entre l’interface utilisateur, la logique de l’application (métier) et les données

Structure

– Couche présentation : interface

– Couche application : logique métier

– Couche données : données de l’application

(7)

Interface utilisateur Logique de présentation

Interface utilisateur Logique de présentation

Logique d’application (Business logic) Logique d’application

(Business logic)

Données de l’application Données de l’application

Couche présentation

Couche application

Couche données

(8)

• Couche présentation

– Présentation des données aux utilisateurs – Interaction avec les utilisateurs

• Couche application

– Représentation de la logique métier

– Contrôle des fonctionnalités de l’application

• Couche données

– Gestion des données – Serveurs de données

Interface utilisateur Logique de présentation

Interface utilisateur Logique de présentation

Logique d’application (Business logic) Logique d’application

(Business logic)

Données de l’application Données de l’application

(9)

Avantages

– Modularité

– Indépendance

• Chaque couche peut évoluer et être modifiée sans que cette évolution affecte les autres couches

• Changements technologiques sont possibles

Usage

– Développement d’applications réparties

– Programmation Client/Server

(10)

• Comparaison avec le modèle MVC

– Extension naturelle, même principe : division des responsabilités

– La couche de présentation ne communique jamais avec la couche des données

3-tier Linéaire

MVC

Triangulaire

(11)
(12)

• API d’accès aux bases de données

– Paquetage java.sql.*

– Connexion à une base de données – Manipulation d’une base de données

Query

Update

• Historique

– Première version en 1996 (J2SE 1.1) – JDBC 2 avec J2SE 1.2 en 1998

– JDBC 4 avec J2SE 6

(13)

• Les applications accèdent à la BD par un driver (JDBC

Driver)

– Apache Derby : derbyclient.jar – PostegreSQL : postgresql-8.3-

604.jdbc3.jar

• Les drivers sont proposés par les fournisseurs du SGBD

• Ces drivers ne sont pas

forcément 100% pure Java

(14)

JDBC peut être utilisé aussi bien en 2 couches

qu’en 3 couches

(15)

• Avant tout, il faut avoir une base de données disponible… 

– Exemple :

• Base de données « Dictionnaire » sur Apache Derby

• Sous NetBeans : onglet Services  JavaDB  Create…

(16)

• Création d’une table sous NetBeans

– Onglet Services

– Database connection  Connect

– Database connection  Table, puis Create Table

(17)

• Insertion de quelques données sous NetBeans

– Onglet Services

– Database connection  Connect

– Database connection  Table, puis Execute

Command

(18)

• Connexion à la BD passe par un URL JDBC

jdbc:driver:other stuff

• Paramètres de connexion propres au driver et à la base

jdbc:derby://localhost:1527/Dictionnaire

Driver

DB Server

Port

DataBase

(19)

• Connexion à travers la classe DriverManager

– Chargement dynamique du driver – Entrée des paramètres

– Création de la connexion  classe Connection

Class.forName(driver);

Connection conn =

DriverManager.getConnection(bdd, login, pass);

//on peut lire ces informations sur des proprietes String driver = "org.apache.derby.jdbc.ClientDriver";

String bdd = "jdbc:derby://localhost:1527/Dictionnaire";

String login = "dico";

String pass = "dico";

Connection conn = null;

try {

//Charge le pilote

Class.forName(driver);

//Crée la connection

conn = DriverManager.getConnection(bdd, login, pass);

. . .

} catch (ClassNotFoundException cnfe) { . . . } //on peut lire ces informations sur des proprietes String driver = "org.apache.derby.jdbc.ClientDriver";

String bdd = "jdbc:derby://localhost:1527/Dictionnaire";

String login = "dico";

String pass = "dico";

Connection conn = null;

try {

//Charge le pilote

Class.forName(driver);

//Crée la connection

conn = DriverManager.getConnection(bdd, login, pass);

. . .

} catch (ClassNotFoundException cnfe) { . . . }

(20)

• Toute connexion ouverte doit être fermée !

– conn.close ()

– Usage de la clause finally est suggérée

try {

Class.forName(driver);

conn = DriverManager.getConnection(bdd, login, pass);

. . .

} catch (ClassNotFoundException cnfe) { . . . } } catch (SQLException sqle) { . . . }

} finally {

if (conn != null) conn.close();

try {

Class.forName(driver);

conn = DriverManager.getConnection(bdd, login, pass);

. . .

} catch (ClassNotFoundException cnfe) { . . . } } catch (SQLException sqle) { . . . }

} finally {

if (conn != null) conn.close();

(21)

• Sous NetBeans, on peut obtenir les paramètres de connexion

– Onglet Services,

Database connection,

puis Proprieties

(22)

• On doit garantir que le .jar correspondant au driver est accessible

– Classpath – Projet

On vérifie si le driver est

disponible dans la plateforme.

On l’ajoute si nécessaire On vérifie si le driver est

disponible dans la plateforme.

On l’ajoute si nécessaire

On ajoute le jar

(Library) à notre projet On ajoute le jar

(Library) à notre projet

(23)

• La manipulation de la base de données se fait à travers la classe Statement

– Statement statement =conn.getStatement() – Une query SELECT

• ResultSet rs = statement.executeQuery (sql)

– Un update (INSERT, UPDATE…)

• int rs = statement.executeUpdate (sql)

– Générique

• boolean rs = statement.execute (sql)

(24)

• Les résultats d’une requête SELECT sont accessibles par un ResultSet

– resultSet.next() :

• avance sur l’ensemble des n-uplets

getString (colName) / getString(n) :

• récupère la valeur sur la colonne ‘colName’ ou la n-ème colonne

– Autres types de données

• getInt, getFloat, getByte, getDate, getObject…

String sql = "SELECT * FROM TABLE";

try {

Statement stat = conn.createStatement();

ResultSet rs = stat.executeQuery(sql);

while (rs.next()) {

String col = rs.getString("Colonne");

. . .

String sql = "SELECT * FROM TABLE";

try {

Statement stat = conn.createStatement();

ResultSet rs = stat.executeQuery(sql);

while (rs.next()) {

String col = rs.getString("Colonne");

. . .

(25)

• L’exécution d’une requête INSERT, UPDATE, DELETE… indique le nombre de lignes

(n-uplets) affectées

– int rs = statement.executeUpdate (sql)

String pattern = "INSERT INTO TABLE (Col1, Col2…) VALUES (val1, val2… )";

try {

Statement stat = conn.createStatement();

rows = stat.executeUpdate(sql);

. . .

} catch (SQLException ex) { . . . }

String pattern = "INSERT INTO TABLE (Col1, Col2…) VALUES (val1, val2… )";

try {

Statement stat = conn.createStatement();

rows = stat.executeUpdate(sql);

. . .

} catch (SQLException ex) { . . . }

(26)

• Base de données Dictionnaire sous Apache Derby

• Table FR (Id, Word)

– int id

– String (VarChar) Word

(27)

• Classe DicoBase : connexion et accès à la BD

Connexion Connexion

Déconnexion

Déconnexion

(28)

• Classe DicoBase : connexion et accès à la BD

Select

Select

Select

Select

(29)

• Classe DicoBase : connexion et accès à la BD

Insert

Insert

(30)

• Classe Main

(31)

• Créer une base des données pour les employés d’un département

• Ecrire une application capable d’insérer des

nouveaux employés sur la base

(32)

Properties

– Moyen de stocker les données de configuration – Configuration & préférences de l’utilisateur

• Format

– Ensemble de paires key = value – Stockés dans un fichier texte

• Conventions

– Fichier sur le répertoire de travail de l’utilisateur

– Nom du fichier : application.properties

(33)

• Classe Properties

– Permet la manipulation d’un ensemble de propriétés

Méthodes de manipulation des propriétés

– put (String key, String value)

• Ajout d’un paire key-value

– getProperty (String key)

– getProperty (String key, String defaultvalue)

• Lecture de la valeur d’un paire key-value

– load (InputStream in)

– store (OutputStream out, String header – store (OutputStream out)

• Sauvegarde / récupération des paires key-value

(34)

Définition des propriétés par défaut Définition des propriétés par défaut

Properties settings = new Properties(defaultsettings);

Création des propriétés Création des propriétés

settings.put (aKey, value);

Définition d’une propriété

Définition d’une propriété

(35)

Load à partir d’un fichier Load à partir d’un fichier

Sauvegarde sur un fichier Sauvegarde sur un fichier

Properties settings = new Properties(defaultsettings);

Settings.load(in);

Settings.store(out, comments);

(36)

Fichier Propriétés Fichier Propriétés

En-tête (comments)

settings.store(out, comments);

En-tête (comments)

settings.store(out, comments);

Propriétés définies dans settings

(les valeurs par défaut ne sont pas stockés) Propriétés définies dans settings

(les valeurs par défaut ne sont pas stockés)

(37)

• Les propriétés du systèmes sont accessible à travers la classe System

– System.getProperties (key)

• Quelques exemples :

– java.home java.version

– file.separator line.separator path.separator – os.arch os.name os.name

– user.dir user.home user.name

• Accès contrôlé par le SecurityManager

(38)

Trouver le répertoire de travail à l’aide de la propriété user.dir Bien définir le path à l’aide de la propriété file.separator

Trouver le répertoire de travail à l’aide de la propriété user.dir

Bien définir le path à l’aide de la propriété file.separator

(39)

• A partir du dernier exercice, garder les

informations relatives à la connexion à la base des données dans un fichier de propriétés

– Driver – URL – Login

– Password

Références

Documents relatifs

Si l’on s’intéresse à des options dont le paiement dépend de la trajectoire du sous-jacent (path- dependent), l’espace des états est celui des trajectoires. 1) Identifier les

Il y a trois niveaux de prix pour l’actif contingent à la date 2 (il est recombinant), celui correspondant à deux baisses consécutives, celui correspondant à une baisse suivie

(redirection) permet de rediriger la sortie d’une commande vers un

(les valeurs par défaut ne sont pas stockés) Propriétés définies dans settings. (les valeurs par défaut ne sont

• Construction d’une nouvelle classe d’exception pour le cas de factoriel négatif.

• A chaque clique sur le bouton, celui-ci doit afficher le texte afficher le texte écrit sur le champ texte. • Utiliser un listener dans la

– Vue 2 : un label qui affiche le volume, avec deux boutons, un pour l’incrémenter d’un point et. l’autre pour la décrémenter

• Le gestionnaire de corbeille gère les interactions entre les participants du workflow et le service d ’exécution. – Il peut être plus ou