diff --git a/pom.xml b/pom.xml
index ffbd96b..0ebca91 100644
--- a/pom.xml
+++ b/pom.xml
@@ -47,6 +47,12 @@
spring-boot-starter-data-jpa
+
+ com.h2database
+ h2
+ test
+
+
org.projectlombok
lombok
@@ -67,6 +73,11 @@
org.springframework.boot
spring-boot-starter-web
+
+
+ com.h2database
+ h2
+
diff --git a/src/main/java/org/example/SpringBootBookShopApplication.java b/src/main/java/org/example/SpringBootBookShopApplication.java
index 48c1e9f..2b1c4b6 100644
--- a/src/main/java/org/example/SpringBootBookShopApplication.java
+++ b/src/main/java/org/example/SpringBootBookShopApplication.java
@@ -11,6 +11,7 @@ public class SpringBootBookShopApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootBookShopApplication.class, args);
}
+
@Bean
public CommandLineRunner commandLineRunner() {
return new CommandLineRunner() {
diff --git a/src/main/java/org/example/exception/DataProcessingException.java b/src/main/java/org/example/exception/DataProcessingException.java
new file mode 100644
index 0000000..4cd72b8
--- /dev/null
+++ b/src/main/java/org/example/exception/DataProcessingException.java
@@ -0,0 +1,11 @@
+package org.example.exception;
+
+public class DataProcessingException extends RuntimeException {
+ public DataProcessingException(String message, Exception e) {
+ super(message);
+ }
+
+ public DataProcessingException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/org/example/model/Book.java b/src/main/java/org/example/model/Book.java
index dd2094f..6a80116 100644
--- a/src/main/java/org/example/model/Book.java
+++ b/src/main/java/org/example/model/Book.java
@@ -1,4 +1,30 @@
package org.example.model;
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import java.math.BigDecimal;
+import lombok.Data;
+
+@Entity
+@Data
+@Table(name = "book")
public class Book {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ @Column(nullable = false)
+ private String title;
+ @Column(nullable = false)
+ private String author;
+ @Column(nullable = false, unique = true)
+ private String isbn;
+ @Column(nullable = false)
+ private BigDecimal price;
+ private String description;
+ private String coverImage;
}
diff --git a/src/main/java/org/example/repository/BookRepository.java b/src/main/java/org/example/repository/BookRepository.java
index b23074b..f43b2a9 100644
--- a/src/main/java/org/example/repository/BookRepository.java
+++ b/src/main/java/org/example/repository/BookRepository.java
@@ -1,4 +1,10 @@
package org.example.repository;
+import java.util.List;
+import org.example.model.Book;
+
public interface BookRepository {
+ Book save(Book book);
+
+ List findAll();
}
diff --git a/src/main/java/org/example/repository/impl/BookRepositoryImpl.java b/src/main/java/org/example/repository/impl/BookRepositoryImpl.java
index ef51b30..4b024b3 100644
--- a/src/main/java/org/example/repository/impl/BookRepositoryImpl.java
+++ b/src/main/java/org/example/repository/impl/BookRepositoryImpl.java
@@ -1,4 +1,54 @@
package org.example.repository.impl;
-public class BookRepositoryImpl {
+import jakarta.persistence.criteria.CriteriaQuery;
+import java.util.List;
+import org.example.exception.DataProcessingException;
+import org.example.model.Book;
+import org.example.repository.BookRepository;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public class BookRepositoryImpl implements BookRepository {
+ private final SessionFactory sessionFactory;
+
+ public BookRepositoryImpl(SessionFactory sessionFactory) {
+ this.sessionFactory = sessionFactory;
+ }
+
+ @Override
+ public Book save(Book book) {
+ Transaction transaction = null;
+ Session session = null;
+ try {
+ session = sessionFactory.openSession();
+ transaction = session.beginTransaction();
+ session.persist(book);
+ transaction.commit();
+ return book;
+ } catch (Exception e) {
+ if (transaction != null) {
+ transaction.rollback();
+ }
+ throw new DataProcessingException("Can't insert book " + book, e);
+ } finally {
+ if (session != null) {
+ session.close();
+ }
+ }
+ }
+
+ @Override
+ public List findAll() {
+ try (Session session = sessionFactory.openSession()) {
+ CriteriaQuery criteriaQuery = session.getCriteriaBuilder()
+ .createQuery(Book.class);
+ criteriaQuery.from(Book.class);
+ return session.createQuery(criteriaQuery).getResultList();
+ } catch (Exception e) {
+ throw new DataProcessingException("Can't get all books", e);
+ }
+ }
}
diff --git a/src/main/java/org/example/service/BookService.java b/src/main/java/org/example/service/BookService.java
index e8a91ce..eba3ca9 100644
--- a/src/main/java/org/example/service/BookService.java
+++ b/src/main/java/org/example/service/BookService.java
@@ -1,4 +1,10 @@
package org.example.service;
+import java.util.List;
+import org.example.model.Book;
+
public interface BookService {
+ Book save(Book book);
+
+ List findAll();
}
diff --git a/src/main/java/org/example/service/impl/BookServiceImpl.java b/src/main/java/org/example/service/impl/BookServiceImpl.java
index 66e8c38..7007987 100644
--- a/src/main/java/org/example/service/impl/BookServiceImpl.java
+++ b/src/main/java/org/example/service/impl/BookServiceImpl.java
@@ -1,4 +1,26 @@
package org.example.service.impl;
-public class BookServiceImpl {
+import java.util.List;
+import org.example.model.Book;
+import org.example.repository.BookRepository;
+import org.example.service.BookService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BookServiceImpl implements BookService {
+ private final BookRepository bookRepository;
+
+ public BookServiceImpl(BookRepository bookRepository) {
+ this.bookRepository = bookRepository;
+ }
+
+ @Override
+ public Book save(Book book) {
+ return bookRepository.save(book);
+ }
+
+ @Override
+ public List findAll() {
+ return bookRepository.findAll();
+ }
}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 89c3eb7..bfa1583 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -1,7 +1,8 @@
spring.datasource.url=jdbc:mysql://localhost:3306/svitlana?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=Wetuop34!
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.driver-class-name=org.h2.Driver
+spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
-spring.jpa.show-sql=true
\ No newline at end of file
+spring.jpa.show-sql=true
diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties
index 89c3eb7..bfa1583 100644
--- a/src/test/resources/application.properties
+++ b/src/test/resources/application.properties
@@ -1,7 +1,8 @@
spring.datasource.url=jdbc:mysql://localhost:3306/svitlana?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=Wetuop34!
-spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
+spring.datasource.driver-class-name=org.h2.Driver
+spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
-spring.jpa.show-sql=true
\ No newline at end of file
+spring.jpa.show-sql=true