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