Sie sind auf Seite 1von 8

Saloua Ben Yahia

TP1 Accs Base de Donnes 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. 2. 3. 4. Installer les environnements Crer la Base de Donnes Configurer Netbeans pour accder la base en Java Crer un client Local ensuite Distant pour accder la base, envoyer des requtes sql et afficher les rsultats selon le schma suivant. Dans un premier temps l'accs est Local c'est--dire la Base sera sur la mme machine que le client. Par la suite vous pouvez fair un test avec la machine de votre camarade.

Client Base de Donnes

Tlcharger la dernire version http://netbeans.org/downloads/index.html.

de

Netbeans

(7.1)

sur

le

site

Linstallation dun IDE J2EE ncessite un JDK. Choisir la version JDK 1.6.X qui est la plus stable et la tlcharger si ncessaire. 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 lIDE. Suivez les tapes et les options dinstallation. Crer votre projet JAVA/Application JAVA, choisir un nom, exmple TP1SYSREP

MANIPULATION 2 : Cration de la Base de Donnes


La Base de Donnes contient une seule table utilisateurs : Attention avec la base Derby loption auto_increment nexiste pas en mode wizard graphique. Il faut utiliser ncessairement le script de cration de la table donn ci-dessous. Le mme script est valable en base Mysql. On va utiliser Derby car elle intgre l'IDE Netbeans. Etape 1 : Crer la Base de Donnes DBUsers avec le login = root et password= root Respecter ces valeurs pour tres conforme au code ou bien changer les instructions ncessaires. Pour crer la Base de Donnes 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.

Etape 2 : 1. Cliquer sur le nouveau lien qui vient se crer "jdbc:derby://localhost:1527/DBUsers" et choisir connect. Une connection sera tablie. 2. Cliquez droit sur cette connection et choir execute command. Une fentre apparat pour saisir les script sql. 3. Crer la table Utilisateurs en copiant le script ci-dessous dans cette fentre et cliquer sur run sql (icne d'une BD avec un play vert ct).
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 donnes en utilisant l'une des deux possibilits 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. Excutant 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 Donnes via du code Java la classe du pilote doit tre accessible. Chaque fournisseur de Base de Donnes va fourni se Driver et gnralement ils est archiv dans un jar. Il faut donc configurer votre projet pour que ce Driver soit reconnu. Pour cela raliser les tapes suivantes: 1. Cliquer sur la racine de vore projet 2. Choisir proprits 3. Choisir Librairies/ajouter jar 4. Ensuite rajouter le jar derbyclient.jar qui vous est fourni 2/8

Saloua Ben Yahia

PARTIE B : Cration des classe d'Acces la Base MANIPULATION 4: Cration d'une classe qui ouvre une connection vers la Base
a/ Explication On n'est pas oblig de crer une classe part pour ouvrir une connection mais pour des raisons de qualit du code on va commencer par crer une premire classe qui ralise les tapes suivantes : Charge le driver qui est le pilote d'accs la Base. Avec la commande suivante. Le driver est la classe qui est fournie dans le jar derbyclient.jar et que vous avez dj rendu accessible. On peut aussi instancier ce driver en faisant un new(org.apache.derby.jdbc.ClientDriver(); Les deux mthodes 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 accder une Base il faut connatre son URL forme toujours de la manire 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 donnes reoit les requtes Le nom de la Base Le rle de cette classes est simplement d'ouvrir et de fournir des connections vers une base de donnes ayant l'URL suivante : jdbc:derby://localhost:1527/DBUsers. Remarquez que la Base peut ne pas tre sur le mme 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

b/Ralisation Dans votre projet Java, sous la partie sources packages et crer un nouveau package : app.accesbase. Sous ce rpertoire crer la classe suivante et copier le code source et tester l'excution. Toute classe java possdant main est excutable : L'excution se passe bien si aucune erreur n'est affiche dans la fentre 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: Cration de la classe Principale Utilisateur


Cette classe reprsente un Utilisateur et en particulier chaque enregistrement dans la Base. Chaque attribut est priv et possde un Get/set. Crer cette classe dans le mme 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: Cration d'une classe Cliente qui accde la Base


Toujours dans le mme package app.accesbase crer la classe suivante. Cette classe peut envoyer un certain nombre de requtes la base : LoadUser : Charger un utilisateur de la Table partir de son login/pass addUser : Ajouter un Utilisateur selectAll : Rcuprer la liste de tous les utilisateurs Pour envoyer une requte sql il faut passer par les tapes suivantes : 1. Rcuprer une Connection en appelant la Classe UtilitaireConnection 2. Crer un contexte logique d'excution : Statement 3. Une fois le statement est cr on envoie la requte sql et on rcupre le resultat. Le rsultat peut tre une liste : ResultSet c'est le cas pour la mthode 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. Excuter cette classe. Que va-t-elle afficher ? 2. Rajouter du code pour charger un Utilisateur en donnant son login/pass et afficher ses donnes 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 rseau ou le wifi. Notez l'adresse IP de la machine distante et modifier le code en consquence. Attention les firewall ou antivirus peuvent bloquer certains appels et faire chouer les accs. Quelle classe faut-il modifier pour que cela fonctionne.

PARTIE B : Cration des classe d'Acces la Base en Mode Optimis MANIPULATION 5: Cration d'une classe Cliente qui accde la Base de manire Optimise
Toujours dans le mme package app.accesbase crer la classe suivante. Cette classe offre exactement les mms oprations que la classe prcdente, sauf que dans ce cas les accs sont optimiss. En effet elle utilise les PreparedStatement. Ce sont des contextes d'excution pre-compils, pr prpars. Ils sont donc plus rapides que les statements de la classe prcdente. Une fois que le contexte est prpar 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. Excuter cette classe. Que va-t-elle afficher ? 2. Rajouter du code pour charger un Utilisateur en donnant son login/pass et afficher ses donnes 3. Tester avec une machine locale et distante 8/8

Das könnte Ihnen auch gefallen