Beruflich Dokumente
Kultur Dokumente
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.
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.
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');
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
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(); } }
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; } }
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
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