2265U04 ? Langage Java 2006-10-05 Présentation du langage ...

Programmation d'interfaces graphiques (en Java). ..... Initiation à la programmation orientée objets; Les concepts suivants sont introduits : classes et objets, ...


un extrait du document



2265U04 – Langage Java


2006-10-05

Présentation du langage
Java est le dernier né de la famille des langages de programmation (comme Basic, Cobol, C, C++).

Il a des caractéristiques importantes pour sa réussite :
portabilité des applications (exécution au travers de la Virtual Machine, VM)
la possibilité de développer une application dans un environnement donné (ex : Mac) et d’ensuite la faire fonctionner dans un autre environnement (ex : PC).
toute application n’est pas portable d’un environnement à l’autre :
différence des matériels
Ex : processeurs
différence des systèmes d’exploitation




Portabilité source : l’application doit être refabriquée dans l’environnement ciblé.




Programmes sources ( Compilateur ( Programme exécutable en langage machine de la machine cible (pour un environnement donné et un système d’exploitation donné).

Le programme écrit en Java peut être exécuté dans n’importe quel environnement et quel système d’exploitation (100%).

Le langage crée un environnement virtuel VM Java entre l’application et les systèmes d’exploitation. Par conséquent, la portabilité devient 100%.

Dans le schéma traditionnel (de 3 couches), lorsque l’application fait une opération « 2 + 3 », c’est le processeur (ex : Intel) qui fait le calcul. Or, dans le schéma Java (de 4 couches), cette opération est faite au niveau virtuel VM Java (en servant bien sûr du processeur).

Source Java ( Compilateur ( Exécutable Java « .class » ( VM

Inconvénients :
un coût supplémentaire en temps d’exécution et en terme de stockage pour l’application Java car tout calcul se fait au niveau VM au lieu du processeur directement.
Auj., les limites en terme matériels ne posent plus de grands problèmes : la vitesse de calcul du processeur et la capacité de stockage.
Java n’est pas fait pour des applications de calculs très lourdes (ex : calculs scientifiques intensifs)
La performance de l’environnement virtuel
La performance accrue depuis ces dernières années
Java, orienté Objet
Ce qui n’est pas vraiment nouveau (ex : C++)
Java est plus qu’un langage (il est un environnement)
Avec Java, en plus du langage, on propose une bibliothèque de classes standardisée et très complète
Même si le langage est identique (ex : C, C++, etc.), lorsqu’on utilise des bibliothèques différentes, la portabilité peut être nulle.
« bibliothèque » : un ensemble de fonctions qu’on utilise pour faire des tâches courantes.
Ex : CreateWindow(…)

On appelle « Java Developpment Kit » (JDK) dans laquelle on trouve VM, outils et bibliothèques.

Un ensemble de spécifications (des composants) garantissant l’interopérabilité
Non seulement que l’application fabrique en Java est portable dans n’importe quel système d’explication, mais aussi les composants de cette application peuvent être « empruntés » dans d’autres applications en Java grâce aux spécifs (càd des règles de dialogue).

Ces spécifications sont des documents (ou des cahier de charge) qui normalisent les composants de Java. On parle alors de l’ « Architecture d’application », ou J2EE (un langage et des bibliothèques avec des spécifs).

Quasiment tous les acteurs (Sun, IBM, Orale, etc.) parlent de la même chose avec le terme J2EE (sauf Microsoft où l’on a « .NET »).

Java n’est pas « open source ». Il est à la propriété intellectuelle de Sun. Il est gratuit, mais on ne peut pas le modifier.

« .NET » est en langage « C# ».


Mise en œuvre
JDK
VM : java.exe
Bibliothèques : .jar
Outils de développement : compilateur.java ( .class
javac.exe

Juste pour tourner les applications en Java, il suffit installer JRE (càd VM + Bibliothèques sans Outils de développement)

Versions
Version en vigueur : Version 1.5.07
Téléchargeable sur le site de Sun

Un environnement de développement intégré (Integred Developpment Environment, IDE)
Eclipse (sponsor IBM) : logiciel libre
Dérivation commerciale : WSAD (IBM)
Netbeans (sponsor Sun)
Dérivation commerciale : Sun Java Studio

IDE est lui-même une application Java.


Exemple d’application Java
Une distinction :
stand-alone
Ex : Word, Excel
mode caractère
Test et pédagogie
mode graphique
Ex : Eclipse, Netbeans
composant
J2EE
Ex : applet, servlet


Exemple : application « Hello world » en mode caractère
class HelloWorldApp {
page 5
}

Rq : toute application Java est dans la classe.
« System » : c’est une classe
« .out » : c’est un objet
« .println( ) » : c’est une méthode


Résumé :
Les caractéristiques du langage JAVA :
Portabilité (à travers la VM)
Bibliothèque de classe très complète
Interopérabilité (à travers la même architecture d’application spécif, J2EE en vigueur)
Ex : J2EE (Sun) ( .NET (Microsoft)
Sur le plan fonctionnel, ils sont identiques.
Distinction : C++ & Java
En fonction du choix des logiciels :
Une grande partie des logiciels de base (càd le système lui-même) sont développés en langage C (ou C++).
Le langage Java est essentiellement utilisé dans le développement des modules d’applications, souvent orientée à l’utilisation sur le Web.
Ils sont des langages très proches l’un à l’autre (car ils sont des langages de 3ème génération, L3G), mais dans l’architecture matériel, le langage Java est à un niveau plus évolué que le langage C++.

Le langage 4ème génération (« L4G »)
Ce sont des langages de plus haut niveau. Ils sont utilisés dans le développement des applications de gestion. On peut faire des paramétrages.
Ex : SAP, Windev


Orientation objet

Dans l’histoire des langages, il y a des langages :
Les tous premiers langages (de « rien du tout ») (non structuré)
Ex : FORTRAN, COBOL
Les langages sont des règles
1970 ( la naissance de la programmation structurée
Ex : Pascal (un langage spécifique pour l’enseignement de l’algorithme), Boucle, Alternative
« Algorithme » : une suite ordonnée d’instruction pour passer à un résultat.
Langage C

« Programme = Algorithmes + Structure de données »

La modularité n’est pas assez fine et la réutilisation des modules est un problème : le changement de la structure de données limite la modularité de l’algorithme.
Pour avoir une bonne réutilisation des modules, il nécessite une modularité beaucoup plus fine, ce qui entraine une augmentation du nombre de toutes petites modules.
1980 ( Orientation objet
Ex : C++, Java
Le programme est vu comme résultant de l’interaction d’un ensemble d’objets.
C’est une modularité au niveau d’objet : on crée des tous petits objets.

Objet & classe
Objet
A l’exemple de moduliser un compte bancaire, un objet compose de 2 parties :
Données (interne) : attributs (ex : soldes, etc.)
Méthodes : comportements (ex : débiter, créditer, etc.)
Rq : les comportements vont changer l’état des données.

Ex : compte.debiter(1000)
D’où « compte » est un objet
« debiter » est une méthode

Classe
Définir le comportement commun à des objets simulaires
C’est un modèle pour créer des objets. En effet, l’objet est une instance de classe (instancier un objet ( créer un objet)

La classe prépare la base sur laquelle l’application se réalise
Ex : dans la classe « Compte », on définit les comportements « Solde », « débiter » et « créditer », etc. Ensuite, on peut instancier des objets pour faire de l’application :
C = newcompte( )
C.debiter(1000)

L’implémentation : c’est la réalisation effective de l’objet (il est fondamental).
La spécification : c’est la façon d’utiliser les objets (c’est le cahier de charge).

Pour les utilisateurs, ils ne voient que la spécification (càd des différentes méthodes qu’on peut appliquer sur l’objet) alors que seulement le développeur peut voir l’implémentation (de l’objet).

Résumé :
Conception objet :
Fonctionnement du système :
Caractéristiques des objets (définies par des classes)
Attributs
Méthodes
Rq : l’objet est une instance d’une certaine classe. On parle d’instancier un objet dans une classe.

2006-10-12

Exemples :
créer une classe « Employe » (le nom d’une classe commence tjs par le majuscule) dans un fichier « Employe.java »
Public class Employe {
Private String nom ;
Private double salaire ;
Public Employe (String n, double s) {
nom = n ;
salaire = s ;
}
Public String getNom ( ) {
Return nom ;
}
Public String getSalaire ( ) {
Return salaire ;
}
Public void setNom (String n) {
nom = n ;
}
Public void setSalaire (double s) {
salaire = s ;
}
Public void augmenterSalaire (double taux) {
salaire = salaire * (1. + taux) ;
}
}

Rq :
On travaille sur 2 attributs : nom et salaire.
« String » est une classe très utile pour traiter les caractères.
« Private » : inaccessible de l’extérieur de la classe
« double » est un type de base et non objet. Il y a des chiffres après la virgule.
Ex : « int » : le nombre entier ; « BigDecimal »
« Public Employe(double s) » : c’est appelé « Conducteurs »
Ex : C = new Employe (« demande », 1000)

« gether » ou « setter »
« getNom »

Rq :
à la fin de chaque ligne d’instruction, n’oublie pas de mettre « ; » (point virgule).

créer une application dans la classe « TestEmploye.java » avec une méthode « main »
Public class TestEmploye {
Public static void main (…) {
Employe1 e = new Employe2(“Durand”, 1000) ;
e.augmenterSalaire (0.1) ;
System.out.println(e.getNom( ) + “ ” + e.getSalaire( )) ;
}
}
Rq : « Employe1 » : type de l’objet
« e » : référence
« new » : opérateur d’instancier (l’opérateur permettant de créer)
« Employe2 » : classe
« (“Durand”, 1000) » : ?
Il n’y a pas d’espace entre les noms de classes ou de méthodes


Héritage
Héritage de classe
B hérite (ou dérive) de A et A est la classe de base de B

La classe B reprend toutes les caractéristiques de la classe A, plus d’autres choses (càd attributs et méthodes) en supplément.

Un A est un B (Faux)
Un B est un A (Vrai)

Un cadre est un emploi
Un emploi n’est pas forcément un cadre

L’héritage descendant permet la réutilisation
Ex : Cadre.java
Public class Cadre extends Employe {
Private int actions ;
getAction ( )
setAction ( )
}
Rq : « extends » : hérite de

Sens remontant

Ex :
Employe e = new Employe ( ) ‘banal
Cadre c = new Cadre ( ) ‘banal
Salarie s1 = new Employe ( ) ‘ « upcast » de généralisation / abstraction
Salarie s2 = new Cadre ( ) ‘ c’est le grand pas en avant

Rq : à partir d’un monde réel, on essaie de remonter vers le haut en abstrayant. Le « salarié » n’existe pas réellement (d’où vient la notion d’ « abstraction ») dans le monde réel où on trouve les « employés » et les « cadres ».
Ce qui diffère les deux, ce sont les comportements différents (ex : l’augmentation des salaires).
Après avoir posé la méthode dans la classe abstraite, on la redéfinit au niveau local de façon différente.

Polymorphisme

Rq : dans la classe « Salarié + non salarié », on définit la méthode « augmenterSalaire » (vide) et la redéfinit dans les classes « Employe » et « Cadre » (c’est une redéfinition des comportements, appelé « polymorphisme »).
Les méthodes redéfinies s’appliquent dans la classe considérée même la méthode est définie dans l’objet de base.

Ex :
Salarie s1 = new Employe ( ) ‘abstraction
s1.augmenterSalaire ( )
Salarie s2 = new Cadre ( ) ‘abstraction
s2.augmenterSalaire ( )

Héritage :
attributs et comportement supplémentaire
de la redéfinition de comportement

ce faisant, le travail de développeur est simplifié : avec la méthode initiale posée, chaque classe descendante peut en définir leur propre spécification.

2006-10-19

« Upcast » & « Downcast »
upcast d’abstraction
downcast de spécialisation
Ex : On a créé 2 salariés : s1 un employé et s2 un cadre
Cadre c2 = (Cadre) s2 ;
Rq : on spécialise le salarié en cadre.
downcast : on redéfinit l'objet pour une méthode spécifique à sa classe. On retransforme Salarié en cadre. c2 n'est pas un nouvel objet mais le même que s2

Cadre c1 = (Cadre) s1 ;
Rq : c’est un downcast illégal car s1 n’est pas un cadre (mais un employé)
Il est donc une erreur d’exécution (mais pas celle de compilation / syntaxe)

If (s2 instanceof Cadre) {
Cadre c2 = (Cadre) s2
}


CMS : Content Management System
Ex : Drupal

Les méthodes de la classe Object
(cf. documentation JDK : la redéfinition des méthodes de la calsse Object)

Méthode « toString »
Il y a des méthodes de la classe Object qu’il peut être judicieux, voire indispensable, de redéfinir dans la classe Salaire.
Sinon la méthode de Object s’appliquerait par défaut.

Ex : La méthode de « toString »
System.out.println(s1)
Par défaut dans Object, cela va afficher « Employe @3abc6673 » (afficher un objet est d’afficher son nom et son adresse)

Dans la classe « Salarie »
Public String toString ( ) {
Return “ Nom : ” + getNom( ) + “ Salaire : ” + getSalaire( ) ;
}

Méthode « equrals »
Qu’est-ce que l’égalité entre Object ? le même objet ?
Il y a 2 significations:
le même objet
Ex :
Salaire s1 = new Employe(“ Durand”) ;
Salaire s1 = s2;
Rq: il s’agit physiquement d’un seul objet avec deux références
le même contenu
Salaire s1 = new Employe(“ Durand”) ;
…(des instructions)
Salaire s2 = new Employe(“ Durand”) ;
Rq: il s’agit physiquement deux objets “Durand”. Mais d’un point de vue applicatif, ils seraient un même objet (car ils ont le même contenu).
Il est plus utile, voire indispensable (car il n’y a pas de doublonnage de notation, càd la même chose avec plusieurs noms)

Test de l’égalité
Ex : if (s1 = = s2)
Le même objet vrai si s1 et s2 se référencient à un même objet.
Rq : parfois, il est utile, mais souvent dangereux. Ce n’est pas ce que l’on veut généralement tester.
Ex : if (jour = = “ lundi ”)
Rq : on risque de voir renvoyé tjs « Faux » même si le jour vaut « lundi »

Pour éviter cette situation, on écrit : if (s1 equrals (s2)) ou if (jour equrals(“ lundi ”))
La méthode de « equrals » est censée vérifier le contenu des objets.

La méthode de « equrals » (égalité des contenus)
C’est une méthode très générale et il y a une définition dans la classe Object.
Par défaut, elle compare les références
Public boolean equrals (Object 0) {
return this = = O ;
}
Rq : « this » est l’un des objets et « O » est l’autre.
Si l’on veut comparer les contenus, il faut redéfinir cette méthode dans la classe « Salarie »
Comment ?

Cf. P.28 du document
Dans la classe « Salarie », faut-il définir :
Public boolean equrals (Salarie s) {…}
Ou
Public booblean equrals (Object o) {…} ?
Rq: le premier choix est trop banal et avec lequel on ne peut comparer que des salariés, donc qui a une valeur locale. Or, ce qu’on veut, c’est de comparer de façon plus générale des objets.
On doit choisir la seconde méthode est bonne pour la redéfinition d’un objet car elle permet d’une comparaison générale des objets de différentes natures (càd comparer sans savoir qu’il s’agit des employés ou des cadres ou mixte). Il y a une idée d’abstraction.

Public boolean equrals (object o) { // en fait, “o” est un salarié
if (this = = o) //si « this » et « o », c’est le même objet
return true
if (o ! = null) && o instanceof Salarie // c’est une protection
return getNom( ).equrals(((Salarie)o).getNom( )) ; // un downcast
return false
}

Rq: “= =” est le test d’égalité
“! =” est « ne pas égal »
« && » : « et »
« si o n’est pas nul et o est une instance de Salarie »

Interface (cf. P19 du document)
La définition d’une interface est similaire à celle d’une classe. Mais toutes les méthodes sont abstracts.
On n’hérite de rien de concret.
On hérite de la nécessité (ou obligation) de redéfinir toutes les méthodes de l’interface.

L’interface est un contrat logiciel (ou cahier de charge) qui est pur spécif.
Rq : son existence permet de modifier un composant de l’ensemble du logiciel sans avoir d’impacts sur d’autres composants.

Ex : extrait du JDK
Public interface Comparable {
Public int compareTo (object o) ;
}

Rq :
Le fait d’insérer « Public class Salarie implements Comparable {…} », nous oblige de définir « compareTo ».

Dans « Salarie »
Public int compareTo (object o) {
if (this = =0)
return 0 ; // « 0 » est zéro
return getNom( ).compareTo(((Salarie) o).getNom( )) ; // « compareTo » est un String implenté comparable

}

Rq : « int »
La comparaison entre les caractères se fait sur la base de la différence des codes correspondants.
Ex : Durant & Toto => Durrant – Toto = -1 ; A – B = -1



Gestion d’erreur par « Exception »
Dans la programmation en Java, il faut obligatoirement indiquer ce qu’on doit faire en cas d’erreur lors de l’exécution à défaut de quoi, le Java considère qu’il est une erreur de compilation.

2006-11-09

Accès aux bases de données en Java

BD :
Oracle
DB2
SQL Serveur
MySQL

Clients, serveur, multiutilisateurs


Access
DBase
 SHAPE \* MERGEFORMAT 

SQL
C’est un langage normalisé

Windows
 SHAPE \* MERGEFORMAT 

Dans le cas de Java
JDBC assure l’indépendance par rapport à la BD sous jacente.

 SHAPE \* MERGEFORMAT 
Rq : le driver JDBC est autosuffisant pour accéder à la BD Oracle sans que le client soit obligé de prendre Oracle.

?????????
Etapes :
Charger le driver JDBC adéquat
Obtenir une connection à la BD grâce au driver
Sur la connection, créer et soumettre des Statement (c’est des requêtes SQL)
Requête simple update
DROP TABLE xxx
CREATE TABLE xxx
INSERT INTO xxx
Rq : càd pas de tuples à retourner
Requête Select
SELECT * from xxx
Rq : il retourne un ResultSet (c’est un ensemble de tuples retournés)
Si select itérer sur le ResultSet

Rq : « charger » et « obtenir » sont assez dépendants de la BD utilisées


Charger le driver JDBC
Obtenir le driver
Rq : « xxx.Jar »
Java Archive
Connaître dans ce package le nom de la classe « Driver »
Provoquer le charge de la classe
Rq : la façon la plus simple de provoquer le chargement d’une classe par la machine virtuelle est tout simplement d’invoquer son nom : Class.forName(« nom de la classe »)
« forName » est la méthode de la classe « Class ».

Obtenir une Connexion à la base de données

Une classe DBManager
Son utilisation
DBManager.getInstance( ).getConnection( ) ;
Pattern « singleton »

Son implémentation

Travailler avec cette connexion (SQL)
Notion de Java Bean
Monde « objet » : Book, Category, Author
Persistance Table (BD relationnelle) : Book, Category, Author

DROP TABLE
Try…catch
Rq: essayer l’opération et s’il y a une erreur, exécuter l’opération de “catch”
CREATE TABLE category
Ici avec des variantes suivant le SGBD
INSERT
INSERT INTO category (title) values (« Informatique »)
Ici avec un PreparedStatement
Préparer un statement => une valeur substituable (« ? »)

p.setString (1, cl.getTitle)) ;
« 1 » correspond au premier « ? »

SELECT



JAVA Révision

2007-03-08

Langage JAVA
« orientée objet »
Portabilité totale des application JAVA d’un environnement à l’autre
Une portabilité immédiate : une application en JAVA peut s’exécuter sur n’importe quel système d’exploitation sans aucun changement.
Machine virtuelle
La machine virtuelle n’est pas portable et elle doit être sélectionnée en fonction du système d’exploitation de la machine.
Bibliothèque de classe
Interopérabilité
Normes J2EE / Architecture d’application
Ce n’est plus un langage, mais une spécification commune sur laquelle la plupart des applications développées en JAVA sont interopérables (sauf Windows)
« .NET »
C’est l’architecture JAVA proposée par Microsoft. Fonctionnellement, il est équivalent du J2EE
« C# » est l’équivalent du JAVA chez Microsoft.

Rq : pour avoir une application Web (ex : traitement de texte ou feuille de calcul sur le Web), on fait appel intensivement « JavaScript ».
Ex : Google Document et Tableur ( HYPERLINK "http://docs.google.com/" http://docs.google.com/)


Orienté objet
« classe » est le composant modulaire sur laquelle on travaille.
L’application est un ensemble des modules qui interagissent entre eux.

Notion de « Classe »
Dans les classes, on trouve :
attributs (càd propriétés)
c’est la partie donnée des objets
méthodes
c’est la partie ?
Dans la classe « Book », c’est une simple classe de contenu. Il est le même pour les classes « Category » et « Author ».

Relations entre objets
Ex : « comment modéliser la relation entre Book et Category ? »
« Collection Book » dans la classe « Category » alors « Collection Author dans la classe « Book ».

La classe « Commande »
Collection de commande d’items

La classe « CommandeItem »
book
Qté

La classe client


Héritage
Classe « Bean »
« extends »
Raisons :
Eviter d’écrire tjs les mêmes codes (càd faire de l’extension)
L’héritage nous permet de faire de l’abstraction
Càd, si l’on a un book, on peut le considérer comme un Bean.
Book b = new Book() ;
Bean x ;
x = b ; (c’est l’abstraction comme on prend un book en le considérant comme un Bean)

Ex : classe « Book »
Collection authors = new ArrayList()

Ex:
Collection a = new ArrayList()
Ou
ArrayList a = new ArrayList()
Rq: la réalité des objets nous importe peu et l’importance est le fonctionnalité générale des objets.
L’abstraction nous permet de changer la réalité sans changer de fonctionnalité.
spécification
Ex : Collection a = new ArrayList() ou Collection a = new LinkedList()

On ne peut pas instancier un objet abstrait, mais seulement des objets concrets. Donc, on ne peut pas avoir : Collection a = new Collection (ce qui est une erreur)

Bean b = new Book()
(upcast d’abstraction ou de généralisation)

Une classe Abstract
Une classe n’est faite que pour ????
Donc, il n’a pas de sens d’écrire : Bean b = new Bean()

« upcast » : une opération fondamentale du langage orienté objet => instancier l’objet et le généraliser

Book b = new Book() ;
Bean x ;
…
Book b = (Book) x ;
C’est « downcast » de specialisation.
Il faut que « x » soit effectivement un book pour que ce soit valide.
Sinon, il en déduit une erreur « illegal cast ».

On le fait pour redonner sa classe/spécialisation perdue dans sa généralisation afin de pratiquer par exemple des méthodes qui ne sont pas utilisables pour l’objet abstraire.

Les classes « Home »
Le rôle de ces classes est de pouvoir lire et écrire des objets dans la base de donnée.
C’est le mapping objet/relationnel
Ex : « Hibernate »

 SHAPE \* MERGEFORMAT 

« pourquoi la classe AbstractHome est abstraire ? »

Les méthodes abstractes ?
Méthode « get »
Méthode « set »

Application
bookHome.findOne(1)

return (Book) findOne(« select * from book where id = » +id) ; // BookHome (page 6)

executer l’odre sql // AbstractHome (page 3)

ResultSet r = s.executeQuery (sql)

return get (r) ; ( abstract et redéfinie dans BookHome

Methode get (r) // BookHome
Book book = new Book() ;
…
return book ;

« A quoi servent les méthodes get et set ? » et « pourquoi elles sont abstraires ? »

Examen d’appel Juin 2006

Q° 4)
Dans « Book »
Public boolean equals(Book b) {
} // il n’a pas d’intérêt
Ou
Public boolean equals(Object o) {
} // très important et ça redéfinti celle de object.
« o » est forcément un Book et on fait un « downcast » pour spécialiser l’objet pour pouvoir comparer les books.

Q°5)
« System » est une classe
« out » est un attribut de la classe « System » (pas un attribut d’objet)
« println » est une méthode d’ « out ».

Quand on affiche un objet, on fait appel la méthode « toString ».


Q°6)
…
c=b
System.out.println(c) ; // => c = b = toto => la référence “b” inchangée => affichage c =toto
b=a
System.out.println(c) ; // => b = a = tata => la reference “a” inchangée => affichage c =toto

Rq: l’affectation de référence ( l’affectation de contenu










PAGE 


PAGE 8



ODBC

API BD native

Protocole client/serveur

Application

Serveur BD

Réseau

Client BD

Base Access

Application

API BD (Application Programming Interface)

Protocole client/serveur

Réseau

Serveur BD

Client BD

Cadre
augmenterSalaire

Employé
augmenterSalaire

Salarié + non salarié
augmenterSalaire (vide)

Application

Remontante

Souvent abstraite => ne peut ê instanciée

Monde réel

Salarié + non salarié

Cadre

Employé

Classe B

Cadre

Employé

Classe A

VMJava

Matériels

Systèmes d’exploitation

Applications

Portabilité source

Portabilité nulle

Pour PC

Linux

Applications

Intel

Windows

Applications

Intel

Linux

Applications

Matériels

Systèmes d’exploitation

Applications

API ODBC

Drive JDBC specifique à la base utilisée

JBDC
(JDK)

commun

API JDBC

Réseau

SGBD X

Driver JDBC pour Base X

Java

AbstractHome

BookHome

AuthorHome

CategoryHome

(BookAuthorHome)