TD : Rappels Java+Postgresql
Dans un premier temps, vous allez revenir sur les bases de la P.O.O avec Java. Ensuite, vous
allez utiliser le framework Spring pour faciliter l’implémentation d’une API REST, sans utiliser
les différents frameworks contenus dans Spring tels que Spring Data (JPA) pour manipuler des
tables de BD, Spring Security pour la gestion de l’authentification et de l’autorisation.
Contexte :
Reprenons le contexte de la gestion de bibliothèque plus tôt.
- La bibliothèque contient des livres et chaque livre est associé à un auteur. Pour
généraliser, un livre peut avoir plusieurs topics ou thèmes mais déjà prédéfinis. Par
exemple, il peut à la fois être dans le thème “Comédie” et “Romance”.
Il faut reprendre les différentes caractéristiques d’un livre et d’un auteur dans le
précédent exercice.
- Des abonnés ou en Anglais “Subscribers” qu’on a nommés dans le précédent exercice
comme visiteurs (Guests ou Visitors), peuvent emprunter ou rendre des livres. Il faut
reprendre les différentes caractéristiques d’un livre et d’un auteur dans le précédent
exercice.
- Hormis les abonnés, il y a les administrateurs qui peuvent effectuer certaines actions
spécifiques à eux. Nous allons voir en détail l’implémentation de la gestion de
l’authentification et des autorisations ou permissions plus tard.
TD1 : Rappels Java et Postgresql
Dans ce TD, vous n’avez pas encore besoin de configurer projet en tant que projet Spring Boot.
Nous allons lancer le projet depuis une simple classe `Main` pour la reprise en main. Notez
toutefois que vous avez besoin d’un Driver Postgresql (JDBC) dans ce projet.*
NB : Pour les questions de cours, créez un document Google Docs pour y mettre les réponses
et mettez les notes visibles par le public mais __NE_PAS_ la partager avec moi. Il y a un
formulaire à la fin des consignes pour y mettre le lien de partage.
* Étapes intermédiaires au projet :
a) Créez un rôle que nous allons appeler “prog_admin” et attribuer les mots de passe
“123456”
-> CREATE ROLE prog_admin WITH LOGIN PASSWORD '123456';
b) Créez une base de données dans Postgresql, nommée “library_management”
-> CREATE DATABASE library_management;
1. Effectuer les configurations nécessaires pour pouvoir connecter votre application à la
base de données créée plus tôt, nommée “library_management”. Tester que la
connexion est établie dans la classe `Main` et une fois que c’est bon, effacer le test.
Important ! Notez qu’il __NE FAUT PAS__ écrire les informations de connexion à la
base de données (jdbc_url, user, password) en dur dans le code pour des raisons de
sécurité évidentes. Si vous faites cela, sachez que tout le monde qui a accès à votre
code peut s’introduire facilement dans votre base de données.
Au lieu de cela, il faut les configurer en tant que variable d’environnement.
[Link]
a. C’est quoi un variable d’environnement ?
b. A quel moment le variable est-il créé ?
c. Peut-on changer la valeur d’un variable d’environnement lorsque l’application est
en marche ?
2. Créer :
a. Les classes nécessaires pour modéliser les différents composants que l’on a
créé depuis la spécification OAS. En particulier, il faut créer une classe User qui
va être un template ou un modèle, héritée par les différents utilisateurs, tels que
l’administrateur ou les abonnés.
b. Les scripts pour créer les tables correspondantes à chaque classe, et dispatcher
les scripts par nouvelle table créée. Aussi, ajoutez trois (3) nouvelles lignes
comme valeur par défaut pour chaque script et enfin exécuter la dans une
console postgresql.
NB !
i. Tâchez à toujours créer des requêtes idempotentes pour le moment,
notamment lorsque vous allez créer une table ou un type, n’oubliez pas
de mettre les mots clés “if not exists”. Il existe également d’autres mots
clés tels que “if exists” employé dans le cas d’une suppression (drop if
exists), etc.
ii. Pour le cas des utilisateurs, vous pouvez à ce stade ne pas créer la table
User. Il faut juste donc créer les tables Book, Author, et Subscribers ainsi
que le type ([Link] Topic qui
possède les valeurs COMEDY, ROMANCE et OTHER pour le moment.
Par exemple, le fichier contenant le script de création de la table “Book” doit être
nommé “create_table_book.sql” et ne contiendra uniquement que les scripts de
création et d’ajout de trois (3) lignes de données.
CREATE TABLE IF NOT EXISTS “book” …
INSERT INTO “book” values …
3. Créer une interface générique ([Link] qui s’appelle
`CrudOperations` et qui possède les méthodes suivantes :
a. List<T> findAll();
b. List<T> saveAll(List<T> toSave);
c. T save(T toSave)
d. T delete(T toDelete);
4. Pour les classes Book, Author et Subscribers, implémenter cette interface générique en
utilisant comme paramètre générique le type de la classe, et nommée
xxxCrudOperations ou xxx correspond au nom de la classe.
Par exemple, dans le cas de Book, créer une classe nommée BookCrudOperations qui
va implémenter CrudOperations, et naturellement qui va devoir implémenter les
différentes méthodes issues de CrudOperations.
Pour vous guider, la classe va ressembler en quelques sortes à ceci :
class BookCrudOperations implements CrudOperations<Book> {
@Override
public List<Book> findAll() {
//TODO
}
@Override
public List<Book> saveAll(List<Book> toSave) {
//TODO
}
@Override
public Book save(Book toSave) {
//TODO
}
@Override
public Book delete(Book toDelete) {
//TODO
}
a) C’est quoi une annotation en Java ?
b) Comment peut-on créer une annotation personnalisée en Java ? Illustrez en créant une
annotation personnalisée appelée @MyFirstAnnotation.
c) Que signifie l’annotation @Override ?
5. Pour chaque classe xxxCrudOperations créée, implémentez correctement chaque
méthode (findAll, saveAll, etc). Avant tout, vous aurez besoin d’appeler l’objet Connection issue
de la configuration de votre application pour accéder à la base de données. Ensuite, utilisez les
Statement et ResultSet [Link] pour pouvoir effectuer les
changements nécessaires au niveau de la base de données.
6. Enfin, testez les différentes méthodes pour chaque ressource, dans la classe `Main` en
utilisant le logger de votre choix pour afficher les données. Vous n’avez pas besoin d’instancier
un objet `Scanner` mais directement mettre des objets à créer.
7. Savez-vous compiler et exécuter votre code à la main ? Notamment, les IDE existent pour
faciliter votre travail à ne pas effectuer ce genre de manipulation, qui peut nuire
considérablement à votre productivité.
Une fois votre projet terminé, faites une vidéo de 30 secondes maximum pour montrer que
vous arrivez à le faire. Uploadez la vidéo sur Drive et mettez le lien dans le formulaire à
compléter ici : [Link]
Indices : il faut utiliser les lignes de commande `javac` pour compiler et `java` pour exécuter.