Vous souvenez-vous du projet du troisième module sur le frontend, où il était nécessaire d'implémenter un panneau d'administration rpg pour l'API du serveur ? Si quelqu'un s'en souvient, une carte servait de stockage sur le serveur. Naturellement, dans la vraie vie, de tels stockages ne sont pas utilisés, mais des bases de données sont utilisées. L'objectif de ce projet sera d'écrire une implémentation alternative de la couche de référentiel à l'aide d'Hibernate.

Pour cela, vous avez besoin de :

  1. Fourche à partir d'un référentiel
  2. Téléchargez votre version du projet sur votre ordinateur.
  3. Ajoutez des dépendances à pom.xml :
    • mysql:mysql-connector-java:8.0.30
    • org.hibernate : hibernate-core-jakarta : 5.6.11.Final
  4. Créez une version maven (installation propre mvn). Pour changer, nous utilisons Java version 1.8.
  5. Ajoutez la configuration de lancement via Idea. L'implémentation de cet item peut être trouvée dans la conférence https://codegym.cc/quests/lectures/cgu.module3.lecture02 (item 4). La seule différence est un nom différent pour l'artefact. Si vous avez tout fait correctement et lancé l'application, vous verrez quelque chose comme ceci :
  6. Exécutez le script de création de schéma rpg dans Workbench :
    CREATE SCHEMA `rpg` ;
    
  7. Facultatif . Si vous voulez voir quel comportement est attendu, vous pouvez changer com.game.service.PlayerServicela valeur d'annotation de "db" à "memory" dans la classe dans le paramètre constructeur . Dans ce cas, Spring utilisera le . Après le test, n'oubliez pas de redéfinir la valeur d'annotation sur "db" .@QualifierIPlayerRepositoryPlayerRepositoryMemory@Qualifier
  8. Organisez toutes les annotations nécessaires dans la classe d'entité com.game.entity.Player. La table doit être nommée "player", schéma "rpg". Pour les enams, utilisez @Enumerated(EnumType.ORDINAL)en plus de l'annotation @Column. Permettez-moi de vous rappeler que la longueur du champ du nom doit être jusqu'à 12 caractères, le champ du titre - jusqu'à 30 caractères. Absolument tous les champs ne doivent pas être nuls.
  9. PlayerRepositoryDBAjoutez un champ final privé dans la classe SessionFactory sessionFactory, initialisez ce champ dans le constructeur de classe. Utilisez les propriétés comme dans les tâches normales (nous travaillerons avec la version 8 de la base de données MySQL). D'intéressant - ajouter
    properties.put(Environment.HBM2DDL_AUTO, "update");
    
    Cela vous permettra de ne pas créer de table manuellement (ou via l'exécution d'un script sql).
  10. Implémentez toutes les méthodes de classe. Pour changer, faisons ceci :
    • Mettre en œuvre la méthode getAllviaNativeQuery
    • Mettre en œuvre la méthode getAllCountviaNamedQuery
    • Dans la méthode beforeStop, appelez la sessionFactoryméthode y close. En ayant une annotation sur la méthode @PreDestroy, Spring appellera cette méthode avant d'arrêter l'application, et cela vous permettra de libérer valablement toutes les ressources système.
    • La mise en œuvre d'autres méthodes dépend de vous. Mais n'oubliez pas les transactions et les commits pour les méthodes qui modifient d'une manière ou d'une autre le contenu de la base de données.
  11. Lancez l'application. Si vous avez tout fait correctement, vous obtiendrez une application fonctionnelle. Mais il n'y a pas de données là-bas, alors exécutez le script init.sql (à partir des ressources) via le Workbench pour qu'elles apparaissent. Après cela, appuyez sur F5 dans le navigateur et vérifiez que vous avez correctement implémenté toutes les méthodes.
  12. Il serait intéressant de voir exactement quelles requêtes Hibernate exécute, alors ajoutons la journalisation des requêtes. Pour ce faire, ajoutez la dépendance p6spy:p6spy:3.9.1 à pom.xml . Dans le dossier resources, créez un fichier spy.properties , dans lequel spécifiez :
    driverlist=com.mysql.cj.jdbc.Driver
    dateformat=yyyy-MM-dd hh:mm:ss a
    appender=com.p6spy.engine.spy.appender.StdoutLogger
    logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
    
    Et dans le constructeur de la classe PlayerRepositoryDB, modifiez deux options :
    properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver");
    properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
    
    Maintenant, dans la sortie du serveur pour chaque requête, vous verrez 2 lignes. Le premier est quelle instruction est préparée, le second est la requête avec les paramètres insérés.

C'est tout, le projet est prêt, félicitations !

En fait, travailler avec Hibernate à partir de Spring utilise une approche différente, que nous aborderons dans le cinquième module.


Analyse du projet.