Vous êtes sur la page 1sur 5

LA PERSISTANCE DES DONNEES

Nous verrons ici l’ensemble des moyens pouvant être utilisé pour stocker les données
d’un programme de manière durable, de telle sorte que lors du prochain lancement
du programme et même après extinction de la machine les données de la dernière
instance du programme soit toujours accessibles.
Pour cela il est possible d’utiliser

Les fichiers : utilisé quand la quantité de données à stocker n’est pas très
importante et les données n’ont pas vraiment une relation entre elles.

Les bases de données : qui sont entre autres plusieurs fichiers mis en relation et
dont l’accès nous est fourni suivant certains mécanismes transparent à l’utilisateur.

LES FICHIERS
L’accès aux fichiers en java se fait via un type d’objet manipulant les flux (Stream en
anglais). Les classes permettant de manipuler les flux sont généralement retrouvées
dans le package « java.io », avec io mis pour « input output » (entrée sortie en
français). On distingue
FileOutputStream : pour manipuler les flux de sorties. Elle est utilisée pour écrire
dans les fichiers
FileInputStream : pour manipuler les flux d’entrées. Elle est utilisée pour lire le
contenu d’un fichier
DataOutputStream : un peu plus de haut niveau que FileOutputStream, permet
aussi de manipuler les flux de sorties.
DataInputStream : qui est l’équivalent de DataOutputStream mais pour les flux
d’entrée.
L’utilisation de DataOutputStream et DataInputStream est généralement conseillée
pour la manipulation des fichiers binaires.
FileWritter : qui permet aussi de manipuler les flux de sorties, pour les fichiers
textes.
BufferedReader : pour la lecture d’un fichier texte
Il est possible de doter un flux d’un tampon. Il s’agit d’un emplacement mémoire qui
sert à optimiser les échanges avec le flux. Les informations sont d’abord enregistrées
dans le tampon, et ce n’est que lorsque ce dernier est plein qu’il est "vidé" dans le
flux.

Exemple 1 : lecture écrire dans un fichier binaire


try {

Scanner scanner = new Scanner(System.in);

ICT2 Université de Yaoundé 1 2021 - 2022


/* initialisation du flux de sortie*/
String fileName = "file.dat";

DataOutputStream outputStream = new DataOutputStream(new


FileOutputStream(fileName));

System.out.println("Veuillez entrer quelques choses");


String content = scanner.nextLine();

/* écriture du contenu dans le fichier*/


outputStream.writeChars(content);

/* fermeture du flux de sortie


* NB: il faut toujours effectuer cette tache*/
outputStream.close();

/* lecture du contenu du fichier de sortie */


DataInputStream inputStream = new DataInputStream(new FileInputStream(fileName));
System.out.println( " le contenu du fichier est " + inputStream.readLine());
inputStream.close();

} catch (IOException e){


e.printStackTrace();
}

Exemple 2 : lecture écriture dans un fichier texte


try {

Scanner scanner = new Scanner(System.in);

/* initialisation du flux de sortie*/


String fileName = "file.txt";

PrintWriter printer = new PrintWriter(new FileWriter(fileName));

System.out.println("Veuillez entrer quelques choses");


String content = scanner.nextLine();

/* écriture du contenu dans le fichier*/


printer.println(content);

/* fermeture du flux de sortie


* NB: il faut toujours effectuer cette tache*/
printer.close();

/* lecture du contenu du fichier de sortie */


BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
System.out.println( " le contenu du fichier est " + bufferedReader.readLine());
bufferedReader.close();

} catch (IOException e){


e.printStackTrace();
}

ICT2 Université de Yaoundé 1 2021 - 2022


LES BASES DE DONNEES
Comme décrit brièvement plus haut, une base de données est un ensemble de fichier
transparent pour l’utilisateur.
Nous allons essayer de nous connecter à une BD que nous avons créée en utilisant
java.
try {

// initialisation de la connexion avec la BD


Class.forName("org.postgresql.Driver");
System.out.println("Driver O.K.");

String url = "jdbc:postgresql://localhost:5432/ICT2";


String user = "postgres";
String passwd = "root";

// connexion à la BD
Connection conn = DriverManager.getConnection(url, user, passwd);
System.out.println("Connexion effective !");

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

Ce code nous montre comment se connecter à une BD. Un Object Connection est créé,
c’est lui l’intermédiaire entre la BD et notre programme. Toutes nos requêtes
passeront par ce dernier.

Lecture des données dans la BD


Pour ce faire nous utiliserons les objets des classes
 Statement : qui permet d’exécuter les requêtes SQL. Lors de la récupération
de l’objet statement à l’objet connection, il est possible de préciser certaines
options.
 ResultSet.TYPE_FORMARD_ONLY : les résultats obtenus à partir de cet
object ne seront accessibles que dans un sens (de la première donnée vers
la dernière)
 ResultSet. TYPE_SCROLL_SENSITIVE : les résultats obtenus peuvent être
parcouru dans tous les sens, il est possible de se positionner à n’importe
quel endroit dans le jeu de donnée résultant, et si pendant la lecture, des
changements surviennent dans la BD, les mises à jour seront
automatiquement prises en compte.
 ResultSet : qui désigne l’ensemble de données reçu de la BD
 ResultSetMetaData : qui contient les métadonnées du résultat de la requête
qui a été effectué. Une instance de cette classe peut contenir le type en BD des
champs recueillis, le nombre de colonne récupéré de la BD, le schéma de la
table que nous avons interrogé…
//Création d'un objet Statement
Statement state = conn.createStatement();
//L'objet ResultSet contient le résultat de la requête SQL

ICT2 Université de Yaoundé 1 2021 - 2022


ResultSet result = state.executeQuery("SELECT * FROM etudiant");
//On récupère les MetaData de la reponse a notre requêtes.
ResultSetMetaData resultMeta = result.getMetaData();

System.out.println("\n**********************************");
//On affiche le nom des colonnes
for(int i = 1; i <= resultMeta.getColumnCount(); i++) {
System.out.print("\t" + resultMeta.getColumnName(i).toUpperCase() + "\t *");
}

System.out.println("\n**********************************");

// on parcours le contenu de notre object result autant de fois qu'il y a d'élément


while(result.next()){
for(int i = 1; i <= resultMeta.getColumnCount(); i++)
System.out.print("\t" + result.getObject(i).toString() + "\t |");

System.out.println("\n---------------------------------");
}

result.close();
state.close();

Ici nous avons fait une requête simple.


Il existe un autre type de requête appelé « Requête préparée ». Préparé parce que la
requête est construite et compilée bien avant et ses paramètres (si elle en a) sont
fournies un peu plus tard. Ce style de requête est conseillé lorsque des données
externes sont nécessaires pour la requête, car l’Object utilisé saura mieux formaté
ces dernières.
Pour tester cet object nous allons récupérer « tous les étudiants qui ont un nom ou un
prénom contenant une chaine de caractère entrée par l’utilisateur »
// Nous préparons la requête qui sera exécuté. les point d'interrogation désigne les zones à
compléter avant l'exécution de la requête
String query = "SELECT * FROM etudiant where nom_etudiant LIKE ? OR prenom_etudiant
LIKE ?";

//Création d'un objet Statement


PreparedStatement state = conn.prepareStatement(query);
System.out.println("Veuillez entrer une chaine de carractere");
String string = scanner.nextLine();

//on defini les paramètres supplémentaire.

state.setString(1,"%"+string+"%");
state.setString(2,"%"+string+"%");

//on execute la requete


ResultSet result = state.executeQuery();
Le parcours se fait comme dans l’exemple précédent.

ICT2 Université de Yaoundé 1 2021 - 2022


Exemples d’insertion d’un nouvel étudiant
// nous préparons la requête
String query = "INSERT INTO etudiant (nom_etudiant, prenom_etudiant, date_naissance,
description) VALUES (?,?,?,?)";

//Création d'un objet Statement


PreparedStatement state = conn.prepareStatement(query);

// on récupère les éléments ,nécessaires pour compléter la requête


System.out.println("Nom du nouvel etudiant");
String string = scanner.nextLine();
state.setString(1,string);

System.out.println("Prenom du nouvel etudiant");


string = scanner.nextLine();
state.setString(2,string);

System.out.println("date de naissance du nouvel étudiant : c'est un nombre ");


string = scanner.nextLine();
state.setInt(3,Integer.parseInt(string));

System.out.println("Une description pour ce jeune prodige ");


string = scanner.nextLine();
state.setString(4,string);

//L'objet ResultSet contient le résultat de la requête SQL


int idNewEtudiant = state.executeUpdate();

Nous remarquons ici que pour des opérations qui ne renvoient aucun résultat,
l’exécution de la requête est lancé avec la méthode executeUpdate() de l’objet
statement.

ICT2 Université de Yaoundé 1 2021 - 2022

Vous aimerez peut-être aussi