
J2EE est une norme qui regroupe un ensemble de normes concernant les objets,
protocoles, ... permettant le développement d'application d'entreprise robuste, ainsi
que la création de serveur d'applications.
Contenu de la norme J2EE :
- Modèle de développement MVC (Model - View - Controler) via des API de base
- Model : EJB (Entreprise Java Bean) gestion des données et traitements
- View : JSP (Java Server Page) Gestion de l'affichage vers
le terminal client
- Controler : Servlet Interface entre les données et l'affichage.
- Ensemble de services
- JDBC : Accès aux données
- JNDI : Annuaire d'accès aux objets distribués
- JTA : Moniteur transactionnel
- XML : Représentation universelle des données
- ...
- Conteneurs d'objets :
- Moteur de servlet
- Moteur d'EJB
Serveur d'application :
Le rôle du serveur d'application est de faire fonctionner les applications
d'entreprises écrites en Java.
Le serveur d'application prend en charge l'environnement permettant
à l'application d'être disponible sur le web. C'est à dire qu'il fournit
un certain nombre de services :
- Service de nommage
- Service de gestion des transactions
- Service de loadbalancing / failover
- Service de sécurité
- Service d'administration
- Service d'accès aux données
- Service de gestion des messages
|
Modèle MVC : Servlet / EJB ou JavaBean / JSP
Principe de fonctionnement :
1 : Envoi d'une requette HTTP vers une servlet
2 : Interprétation de la demande par la servlet et
Redirection de la demande vers l'EJB ou le JavaBean
3 : Traitement de la demande avec ou sans accès à la BDD
4 : Renvoi du résultat vers la servlet
5 : Redirection du résultat vers un JSP
6 : Renvoi de la réponse vers le client
Schéma de fonctionnement :
|
Accès aux données : API JDBC (Java DataBase Connectivity)
Norme permettant de coder une seule fois pour accéder à toutes les bases de données
Packages de l'API :
- java.sql : Connexion, Lecture, Ecriture, métadonnées de façon classique.
- javax.sql : Gestion des pools de connexion et du 2 phases commit.
- Pilote JDBC : (p 38)
Il existe 4 types de pilotes JDBC. L'utilisation de l'un ou l'autre des types
n'influe pas sur le code développé.
- Type 1 : JDBC-ODBC
Le principe de ce type de pilote est de s'appuyer sur ODBC pour
accéder à la base de données.
ODBC étant peu performant, l'ajout d'une couche dégrade
les performances.
- Type 2 : JDBC-Pilote natif
Le pilote JDBC fait appel à des fonctions propriétaires de la BDD
et/ou au système d'exploitation.
- Type 3 : JDBC-Middleware
Le pilote fait appel à un logiciel qui lui fait appel à un pilote
de type 2.
- Type 4 : Ecrit entièrement en Java (donc portable)
Le pilote communique directement avec la BDD. La performance et la
simplicité de mise en oeuvre rendent ce pilote très attractif.
Classes permettant l'accès à une table :
- java.sql.DriverManager : Chargement du pilote JDBC
- java.sql.Connection : Obtention et gestion d'une connexion à la BDD
- java.sql.Statement : Permet d'exécuter des requêtes simples
- java.sql.PrepareStatement : Permet de créer des ordres SQL pré-compilés
- java.sql.CallableStatement : Permet d'exécuter des procédures stockées
- java.sql.ResultSet : Permet la lecture des enregistrements résultant de la requête.
|
JDBC par l'exemple :
Pour la totalité de la formation, nous allons utiliser le driver JDBC fournit par IBM
pour accéder à l'AS400.
Les classes de ce driver sont contenues dans un fichier jar : JT400.jar.
Il se situe dans l'IFS : /QIBM/ProdData/Public/HTTPA/Java/lib/jt400.jar
Ce driver est de type 4, c'est à dire entièrement écrit en Java.
Exemple :
|
Méta-Données d'une requête :
Méthode de la classe ResultSet permettant d'accéder à la définition de la donnée :
getMetaData(). Cette méthode retourne la classe ResultSetMetaData.
Méthode de la classe ResultSetMetaData :
- getColumnCount() int : retourne le nombre de colonnes de la requête.
- getColumnName(int i) String : Retourne le nom de la colonne
- getColumnLabel(int i) : Retrouve le label associé à la colonne (COLHDG)
- getColumnType(in i) int : Retourne le type de la colonne.
Les types des colonnes sont définis comme constantes dans la classe
java.sql.Types
- getPrecision(int i) : Longueur de la colonne
- getScale(int i) : Nombre de décimale de la colonne
Exercice
Corrigé
|
Requêtes paramétrées et précompilées :
Une classe similaire à la classe Statement permet l'utilisation de requêtes précompilées,
qui sont surtout utilisées pour le paramétrage des requêtes : PreparedStatement
Exemple d'utilisation :
|
La classe PreparedStatement :
Méthodes principales :
- getMetaData() ResultSetMetaData : Récupération de la méta-donnée
- close() : Fermeture du curseur
- clearParameters() : Suppression de toutes les valeurs des paramètres
- setXXX : Comme la classe ResultSet, la classe PreparedStatement contient
un ensemble de méthodes qui alimente les paramètres de la requête.
Chaque méthode contient deux paramètres :
- position du paramètre (type entier)
- Valeur du paramètre
Exemple de méthode :
- CHAR : setString(int pos, String valeur)
- Date : setDate(int pos, java.sql.Date date)
Une autre méthode générique permet d'alimenter tous les paramètres :
setObject(int pos, Object valeur, int type)
Il suffit d'indiquer en plus de la position et de la valeur, le type.
Exercice
Corrigé
|
Définition des données : MétaDonnée
Il est possible de retrouver la définition d'une table sans exécuter une requête SQL.
La classe Connection possède une méthode permettant d'obtenir une instance de
la classe DatabaseMetaData.
Cette classe permet de connaître :
- les colonnes d'une table
- les clés primaires d'une table
- Les clés étrangères d'une table
- Les index de la table
- les UDTs
- Les procédures stockées
- les droits sur les tables
- les tables
_ ....
Méthode de la classe :
- ResultSet getColumns(String catalog, String schemaPattern,
String tableNamePattern, String columnNamePattern)
Méthode qui retourne un ResultSet contenant la liste des colonnes
de la table et les informations liés aux colonnes (type, longueur, ...)
- String Catalog : représente le nom de la machine, peut être null
- String schemaPattern : Représente le nom de la bibliothèque, peut être null
- String tableNamePattern : nom de la table complet ou partiel, peut être null
- String columnPattern : nom de la colonne complet ou partiel
- ResultSet getPrimaryKeys(String catalog, String schema,
String table)
Méthode qui retourne un Resultset contenant la liste des colonnes qui
définissent la clé primaire de la table
- String Catalog : représente le nom de la machine, peut être null
- String schema : Représente le nom de la bibliothèque, peut être null
- String table : nom de la table
- ResultSet getExportedKeys(String catalog, String schema,
String table) throws SQLException;
Méthode qui retourne un Resultset contenant la liste des colonnes qui
définissent les clés étrangères de la table
- String Catalog : représente le nom de la machine, peut être null
- String schema : Représente le nom de la bibliothèque, peut être null
- String table : nom de la table
- ResultSet getIndexInfo(String catalog, String schema, String table,
boolean unique, boolean approximate)
Méthode qui retourne un Resultset contenant la liste des colonnes présentes
dans les index de la table.
- String Catalog : représente le nom de la machine, peut être null
- String schema : Représente le nom de la bibliothèque, peut être null
- String table : nom de la table
- boolean unique : indique que l'on ne souhaite voir que les index uniques
- boolean approximate : nom de la table
- ResultSet getTablePrivileges(String catalog, String schemaPattern,
String tableNamePattern)
Méthode retournant un ResultSet contenant les droits des tables
- String Catalog : représente le nom de la machine, peut être null
- String schemaPattern : Représente le nom de la bibliothèque, peut être null
- String tableNamePattern : nom de la table complet ou partiel
Utilisation de la classe :
java.sql.Connection dbCon;
//Obtention de la méta-donnée
java.sql.DatabaseMetadata dbm = dbCon.getMetaData();
//Liste des colonnes de la table vins
ResultSet rs = dbCon.getColumns(null,null,"Vins",null);
Exercice :
Corrigé
|
Les procédures stockées : classe CallableStatement
La classe java.sql.CallableStatement représente une procédure stockée dans le serveur
de données.
Syntaxe :
{call maProcedure[(?, ?, ...)]}
{? = call maProcedure[(?, ?, ...)]}
La première syntaxe ne retourne pas de valeur.
La seconde retourne une valeur.
Méthode de la classe :
Les méthodes de la classe CallableStatement sont les mêmes que pour les classes
PreparedStatement et ResultSet
La classe contient un ensemble de méthodes setXXX pour chaque types de données,
qui permettent d'alimenter les paramètres de la procédure.
La classe contient un ensemble de méthodes getXXX pour chaque types de données,
qui permettent de récupérer le résultat de la procédure.
Cependant il est possible de récupérer le résultat dans un ResultSet par la
méthode executeQuery().
Exercice :
Corrigé
Il est aussi possible d'appeler des procédures stockées par l'intermédiaire de la
classe PreparedStatement.
l'instruction call est un ordre standard SQL.
Même exemple avec appel par PreparedStatement.
|