Vous êtes sur la page 1sur 8

Saloua Ben Yahia

TP1 Accès Base de Données en mode Local et Distant

Ce TP est utilisable avec toute autre base moyennant des modifications mineures sur le code (driver, URL de la base)

Objectifs

1. Installer les environnements

2. Créer la Base de Données

3. Configurer Netbeans pour accéder à la base en Java

4. Créer un client Local ensuite Distant pour accéder à la base, envoyer des requêtes sql et afficher les résultats selon le schéma suivant. Dans un premier temps l'accès est Local c'est-à-dire la Base sera sur la même machine que le client. Par la suite vous pouvez fair un test avec la machine de votre camarade.

Client

Base de Données
Base de
Données
avec la machine de votre camarade. Client Base de Données Télécharger http://netbeans.org/downloads/index.html . la

Télécharger

la

dernière

version

de

Netbeans

(7.1)

sur

le

site

L’installation d’un IDE J2EE nécessite un JDK. Choisir la version JDK 1.6.X qui est la plus stable et la télécharger si nécessaire. Remarque : vous pouvez recopier le code.

PARTIE A : Installation et Configuration de l'Environnement

MANIPULATION 1 : Installation de Netbeans

Installer le JDK et Netbeans et lancer l’IDE. Suivez les étapes et les options d’installation. Créer votre projet JAVA/Application JAVA, choisir un nom, exmple TP1SYSREP

MANIPULATION 2 : Création de la Base de Données

La Base de Données contient une seule table utilisateurs :

Attention avec la base Derby l’option auto_increment n’existe pas en mode «wizard » graphique. Il faut utiliser nécessairement le script de création de la table donné ci-dessous. Le même script est valable en base Mysql. On va utiliser Derby car elle intégrée à l'IDE Netbeans.

Etape 1 :

Créer la Base de Données DBUsers avec le login = root et password= root

êtres conforme au code ou bien changer les instructions nécessaires. Pour créer

Respecter ces valeurs pour

la Base de Données

1/8

Saloua Ben Yahia cliquer sous NetBeans sou l'onglet Services/DataBase/JAVADB, click droit et choisir create database. Donner le nom de la base DBUsers, le login : root et le password : root.

la base DBUsers , le login : root et le password : root. Etape 2 :

Etape 2 :

1. Cliquer sur le nouveau lien qui vient se créer "jdbc:derby://localhost:1527/DBUsers" et choisir connect. Une connection sera établie.

2. Cliquez droit sur cette connection et choir execute command. Une fenêtre apparaît pour saisir les script sql.

3. Créer la table Utilisateurs en copiant le script ci-dessous dans cette fenêtre et cliquer sur run sql (icône d'une BD avec un play vert à côté).

CREATE TABLE Root.Utilisateurs ("ID_USER" INT not null primary key GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), "NAME" VARCHAR(25), "EMAIL" VARCHAR(25), "VILLE" VARCHAR(25), "LOGIN" VARCHAR(25), "PASS" VARCHAR(25));

Etape 3 :

Remplir la table avec des données en utilisant l'une des deux possibilités suivantes :

Cliquer Droit sur la table Utilisateur et choisir view data. Vous verrez un tableau de la table que vous allez pouvoir rempli. Cliquer droit pour cela sur le tableau et choisir insert records et remplir avec des valeurs au choix.

Exécutant le script suivant :

INSERT INTO ROOT."Utilisateurs" (login, pass, email,ville) values('log1', 'pass1', 'email1','ville1'); INSERT INTO ROOT."Utilisateurs" (login, pass, email,ville) values ('log2', 'pass2', 'email2','ville2'); INSERT INTO ROOT."Utilisateurs" (login, pass, email,ville) values ('log3', 'pass3', 'email3','ville3');

MANIPULATION 3: Rajout du jar du Driver

Pour se connecter à une Base de Données via du code Java la classe du pilote doit être accessible. Chaque fournisseur de Base de Données va fourni se Driver et généralement ils est archivé dans un jar. Il faut donc configurer votre projet pour que ce Driver soit reconnu. Pour cela réaliser les étapes suivantes:

1. Cliquer sur la racine de vore projet

2. Choisir propriétés

3. Choisir Librairies/ajouter jar

4. Ensuite rajouter le jar derbyclient.jar qui vous est fourni

2/8

Saloua Ben Yahia

Saloua Ben Yahia PARTIE B : Création des classe d'Acces à la Base MANIPULATION 4: Création

PARTIE B : Création des classe d'Acces à la Base

MANIPULATION 4: Création d'une classe qui ouvre une connection vers la Base

a/ Explication On n'est pas obligé de créer une classe à part pour ouvrir une connection mais pour des raisons de qualité du code on va commencer par créer une première classe qui réalise les étapes suivantes :

Charge le driver qui est le pilote d'accès à la Base. Avec la commande suivante. Le driver est la classe qui est fournie dans le jar derbyclient.jar et que vous avez déjà rendu accessible. On peut aussi instancier ce driver en faisant un new(org.apache.derby.jdbc.ClientDriver(); Les deux méthodes sont identiques "Class.forName("org.apache.derby.jdbc.ClientDriver");

Une fois que le driver est chargé on va demander au DriverManager c'est-à-dire le Gestionnaire de Connection d'ouvri une connection vers la Base. Pour cela on doit forunir l'URL de la base, le login et le password. En fait pour accéder à une Base il faut connaître son URL formée toujours de la manière suivante

Jdbc : mot clef pour indiquer que c'est du java data base connectivity

Le mot qui suit est le nom du sgbd ici c'est derby mais si la base est oracle se sera le mot clef oracle, si la base est mysql le mot clef c'est mysql…

Ensuite on donne le nom su serveur sur lequel se trouve la base ou bien son adresse IP. Ici comme la Base est locale le nom est localhost mais on peut aussi donner l'adresse IP.

Le port est 1527 il s'agit du port surlequl la Base de données reçoit les requêtes

Le nom de la Base

Le rôle de cette classes est simplement d'ouvrir et de fournir des connections vers une base de données ayant l'URL suivante : jdbc:derby://localhost:1527/DBUsers. Remarquez que la Base peut ne pas être sur le même poste que le client dans ce cas il suffit de remplacer localhost par l'adresse IP ou le nom du serveur sur lequel se trouve la Base.

3/8

Saloua Ben Yahia

Saloua Ben Yahia b/Réalisation Dans votre projet Java, sous la partie sources packages et créer un

b/Réalisation Dans votre projet Java, sous la partie sources packages et créer un nouveau package : app.accesbase. Sous ce répertoire créer la classe suivante et copier le code source et tester l'exécution. Toute classe java possédant main est exécutable :

L'exécution se passe bien si aucune erreur n'est affichée dans la fenêtre d'output.

package app.accesbase; import java.sql.*; public class UtilitaireConnection { private static Connection conn; static{ try{ Class.forName("org.apache.derby.jdbc.ClientDriver"); conn =

DriverManager.getConnection("jdbc:derby://localhost:1527/DBUsers","root","

root");

}

catch(Exception e){ e.printStackTrace();

}

}

public static Connection getConnection(){

return conn;

}

public static void main(String [] args)

{Connection c = UtilitaireConnection.getConnection();

}

}

MANIPULATION 3: Création de la classe Principale Utilisateur

Cette classe représente un Utilisateur et en particulier chaque enregistrement dans la Base. Chaque attribut est privé et possède un Get/set. Créer cette classe dans le même package app.accesbase

package app.accesbase;

4/8

Saloua Ben Yahia

public class Utilisateur { private Integer idUser; private String login; private String pass; private String email; private String ville; public String getEmail() {return email;}

public void setEmail(String email) {this.email = email;} public Integer getIdUser() {return idUser;} public void setIdUser(Integer idUser) {this.idUser = idUser;} public String getLogin() {return login;} public void setLogin(String login) {this.login = login;} public String getPass() {return pass;} public void setPass(String pass) {this.pass = pass;} public String getVille() {return ville;} public void setVille(String ville) {this.ville = ville;

}

}

MANIPULATION 5: Création d'une classe Cliente qui accède à la Base

Toujours dans le même package app.accesbase créer la classe suivante. Cette classe peut envoyer un certain nombre de requêtes à la base :

LoadUser : Charger un utilisateur de la Table à partir de son login/pass

addUser : Ajouter un Utilisateur

selectAll : Récupérer la liste de tous les utilisateurs Pour envoyer une requête sql il faut passer par les étapes suivantes :

1. Récupérer une Connection en appelant la Classe UtilitaireConnection

2. Créer un contexte logique d'exécution : Statement

3. Une fois le statement est créé on envoie la requête sql et on récupère le resultat. Le résultat peut être une liste : ResultSet c'est le cas pour la méthode selectAll ou un entier ou rien si il s'agit d'une insertion par exemple.

package app.accesbase; import java.sql.*; import java.util.Vector; public class ClientBase{ public Utilisateur loadUser(String login, String pass){ Connection conn=UtilitaireConnection.getConnection(); Utilisateur u=null; try {

Statement stmt=conn.createStatement(); String query="select * from ROOT.\"Utilisateurs\" where login="+login+"and pass="+pass+"\""; ResultSet rsUser=stmt.executeQuery(query); if(rsUser.next()){ u=new Utilisateur(); u.setIdUser(new Integer(rsUser.getInt("ID_USER"))); u.setLogin(rsUser.getString("LOGIN")); u.setPass(rsUser.getString("PASS"));

5/8

Saloua Ben Yahia

u.setEmail(rsUser.getString("EMAIL"));

u.setVille(rsUser.getString("VILLE"));

}

}

catch (SQLException e) { e.printStackTrace();

}

return u;

}

public void addUser(String l,String p, String e,String v){ Connection conn=UtilitaireConnection.getConnection(); Utilisateur u=null; try {

Statement ps=conn.createStatement(); String query="insert into ROOT.\"Utilisateurs\"(LOGIN,PASS,EMAIL,VILLE) values("+l+","+p+","+e+","+v+")"; ps.executeUpdate(query);

}

catch (SQLException e2) {

e2.printStackTrace();

}

}

public Vector selectAll(){ Connection conn=UtilitaireConnection.getConnection();

Vector users=new Vector(); Utilisateur u=null; try {

Statement stmt=conn.createStatement(); String query="select * from ROOT.\"Utilisateurs\""; ResultSet rsUser=stmt.executeQuery(query); while(rsUser.next()){ u=new Utilisateur(); u.setIdUser(new Integer(rsUser.getInt("ID_USER"))); u.setLogin(rsUser.getString("LOGIN")); u.setPass(rsUser.getString("PASS")); u.setEmail(rsUser.getString("EMAIL")); u.setVille(rsUser.getString("VILLE")); users.add(u);

}

}

catch (SQLException e) { e.printStackTrace();

}

return users;

}

public static void main(String [] args)

{

//Instantiation de la classe

6/8

Saloua Ben Yahia

ClientBase cbs=new ClientBase(); //ajout d'un utilisateur

cbs.addUser("a", "b", "c", "d"); //affichage de tous les utilisateurs Vector v = cbs.selectAll(); for (int i=0; i<v.size(); i++){ System.out.println(v.elementAt(i));

}

}}

Question :

1. Exécuter cette classe. Que va-t-elle afficher ?

2. Rajouter du code pour charger un Utilisateur en donnant son login/pass et afficher ses données

3. On veut que le client et la Base soient sur deux machines distinctes. Utilisez la machine de votre camarade en mode connecté via un réseau ou le wifi. Notez l'adresse IP de la machine distante et modifier le code en conséquence. Attention les firewall ou antivirus peuvent bloquer certains appels et faire échouer les accès. Quelle classe faut-il modifier pour que cela fonctionne.

PARTIE B : Création des classe d'Acces à la Base en Mode Optimisé

MANIPULATION 5: Création d'une classe Cliente qui accède à la Base de manière Optimisée

Toujours dans le même package app.accesbase créer la classe suivante. Cette classe offre exactement les mêms opérations que la classe précédente, sauf que dans ce cas les accès sont optimisés. En effet elle utilise les PreparedStatement. Ce sont des contextes d'exécution pre-compilés, pré préparés. Ils sont donc plus rapides que les statements de la classe précédente. Une fois que le contexte est préparé il suffit de lui passer des valeurs en remplacement des ?.

package app.accesbase; import java.sql.*; import java.util.Vector; public class ClientBase{ public Utilisateur loadUser(String login, String pass){ Connection conn=UtilitaireConnection.getConnection(); Utilisateur u=null; try {

PreparedStatement ps=conn.prepareStatement("select * from ROOT.\"Utilisateurs\" where login=? and pass=?");

ps.setString(1,login);

ps.setString(2,pass);

ResultSet rsUser=ps.executeQuery(); if(rsUser.next()){ u=new Utilisateur(); u.setIdUser(new Integer(rsUser.getInt("ID_USER"))); u.setLogin(rsUser.getString("LOGIN")); u.setPass(rsUser.getString("PASS")); u.setEmail(rsUser.getString("EMAIL")); u.setVille(rsUser.getString("VILLE"));

}

} catch (SQLException e) {

7/8

Saloua Ben Yahia

e.printStackTrace();

}

return u;

}

public void addUser(String l,String p, String e,String v){ Connection conn=UtilitaireConnection.getConnection(); Utilisateur u=null; try {

PreparedStatement ps=conn.prepareStatement("insert into ROOT.\"Utilisateurs\"(LOGIN,PASS,EMAIL,VILLE) values(?,?,?,?)");

ps.setString(1,l);

ps.setString(2,p);

ps.setString(3,e);

ps.setString(4,v);

ps.executeUpdate();

}

catch (SQLException e2) {

e2.printStackTrace();

}

}

public Vector selectAll(){ Connection conn=UtilitaireConnection.getConnection();

Vector users=new Vector(); Utilisateur u=null; try {

PreparedStatement ps=conn.prepareStatement("select * from ROOT.\"Utilisateurs\""); ResultSet rsUser=ps.executeQuery(); while(rsUser.next()){ u=new Utilisateur(); u.setIdUser(new Integer(rsUser.getInt("ID_USER"))); u.setLogin(rsUser.getString("LOGIN")); u.setPass(rsUser.getString("PASS")); u.setEmail(rsUser.getString("EMAIL")); u.setVille(rsUser.getString("VILLE")); users.add(u);

}

}

catch (SQLException e) { e.printStackTrace();

}

return users;

}

public static void main(String [] args)

{

ClientBasePS cbs=new ClientBasePS(); cbs.addUser("a", "b", "c", "d"); Vector v = cbs.selectAll(); for (int i=0; i<v.size(); i++){ System.out.println(v.elementAt(i)); }}

Question :

1. Exécuter cette classe. Que va-t-elle afficher ?

2. Rajouter du code pour charger un Utilisateur en donnant son login/pass et afficher ses données

3. Tester avec une machine locale et distante

8/8