From 5219f1994052cc9cd4dd743fd7aa1c6bf80d85a4 Mon Sep 17 00:00:00 2001
From: Kirill Shott <piupip4@gmail.com>
Date: Mon, 29 May 2023 19:58:56 +0300
Subject: [PATCH] done

---
 pom.xml                                       | 18 +++++
 src/main/java/com/game/entity/Player.java     | 20 ++++--
 .../game/repository/PlayerRepositoryDB.java   | 69 ++++++++++++++++---
 3 files changed, 92 insertions(+), 15 deletions(-)

diff --git a/pom.xml b/pom.xml
index 49bebd6a..d4f74edb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -109,6 +109,24 @@
 			<artifactId>thymeleaf-spring5</artifactId>
 			<version>3.0.15.RELEASE</version>
 		</dependency>
+
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>8.0.30</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.hibernate</groupId>
+			<artifactId>hibernate-core-jakarta</artifactId>
+			<version>5.6.11.Final</version>
+		</dependency>
+
+		<dependency>
+			<groupId>p6spy</groupId>
+			<artifactId>p6spy</artifactId>
+			<version>3.9.1</version>
+		</dependency>
 	</dependencies>
 
 	<build>
diff --git a/src/main/java/com/game/entity/Player.java b/src/main/java/com/game/entity/Player.java
index a6cb7bca..8ed4c9c6 100644
--- a/src/main/java/com/game/entity/Player.java
+++ b/src/main/java/com/game/entity/Player.java
@@ -1,23 +1,31 @@
 package com.game.entity;
 
-import java.util.Date;
+import jakarta.persistence.*;
 
+import java.util.Date;
 
+@Entity
+@Table(name = "player", schema = "rpg")
 public class Player {
+    @Id
+    @GeneratedValue(strategy = GenerationType.AUTO)
+    @Column(nullable = false)
     private Long id;
-
+    @Column(length = 12, nullable = false)
     private String name;
-
+    @Column(length = 35, nullable = false)
     private String title;
 
+    @Enumerated(EnumType.ORDINAL)
     private Race race;
 
+    @Enumerated(EnumType.ORDINAL)
     private Profession profession;
-
+    @Column(nullable = false)
     private Date birthday;
-
+    @Column(nullable = false)
     private Boolean banned;
-
+    @Column(nullable = false)
     private Integer level;
 
     public Player() {
diff --git a/src/main/java/com/game/repository/PlayerRepositoryDB.java b/src/main/java/com/game/repository/PlayerRepositoryDB.java
index 4f80ac70..c535e5f0 100644
--- a/src/main/java/com/game/repository/PlayerRepositoryDB.java
+++ b/src/main/java/com/game/repository/PlayerRepositoryDB.java
@@ -1,51 +1,102 @@
 package com.game.repository;
 
+import com.fasterxml.jackson.databind.annotation.JsonAppend;
 import com.game.entity.Player;
+import jakarta.persistence.NamedQuery;
+import jakarta.persistence.criteria.CriteriaBuilder;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.query.NativeQuery;
+import org.hibernate.query.Query;
 import org.springframework.stereotype.Repository;
 
-import javax.annotation.PreDestroy;
 import java.util.List;
 import java.util.Optional;
+import java.util.Properties;
+
+@NamedQuery(
+        name = "Player_CountAllPlayers",
+        query = "select count(*) from Player"
+)
 
 @Repository(value = "db")
 public class PlayerRepositoryDB implements IPlayerRepository {
+    private final SessionFactory sessionFactory;
 
     public PlayerRepositoryDB() {
+        Properties properties = new Properties();
+        properties.put(Environment.DIALECT, "org.hibernate.dialect.MySQL8Dialect");
+        properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver");
+        properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
+        properties.put(Environment.USER, "root");
+        properties.put(Environment.PASS, "my-new-pass");
+        properties.put(Environment.HBM2DDL_AUTO, "update");
+
 
+        sessionFactory = new Configuration()
+                .addAnnotatedClass(Player.class)
+                .addProperties(properties)
+                .buildSessionFactory();
     }
 
     @Override
     public List<Player> getAll(int pageNumber, int pageSize) {
-        return null;
+        try (Session session = sessionFactory.openSession()) {
+            NativeQuery<Player> nativeQuery = session.createNativeQuery("select * from rpg.player", Player.class);
+            nativeQuery.setFirstResult(pageNumber);
+            nativeQuery.setMaxResults(pageSize);
+            return nativeQuery.list();
+        }
     }
 
     @Override
     public int getAllCount() {
-        return 0;
+        try (Session session = sessionFactory.openSession()) {
+            Query<Long> playerCountAllPlayers = session.createNamedQuery("Player_CountAllPlayers", Long.class);
+            return playerCountAllPlayers.uniqueResult().intValue();
+        }
     }
 
     @Override
     public Player save(Player player) {
-        return null;
+        try(Session session = sessionFactory.openSession()) {
+            Transaction transaction = session.beginTransaction();
+            session.persist(player);
+            transaction.commit();
+            return player;
+        }
     }
 
     @Override
     public Player update(Player player) {
-        return null;
+        try(Session session = sessionFactory.openSession()){
+            Transaction transaction = session.beginTransaction();
+            session.update(player);
+            transaction.commit();
+            return player;
+        }
     }
 
     @Override
     public Optional<Player> findById(long id) {
-        return Optional.empty();
+        try(Session session = sessionFactory.openSession()) {
+            return Optional.of(session.find(Player.class, id));
+        }
     }
 
     @Override
     public void delete(Player player) {
-
+        try(Session session = sessionFactory.openSession()) {
+            Transaction transaction = session.beginTransaction();
+            session.remove(player);
+            transaction.commit();
+        }
     }
 
-    @PreDestroy
     public void beforeStop() {
-
+        sessionFactory.close();
     }
 }
\ No newline at end of file