From 24d8efc74b072093b88a1c43c1763f55b153ecb4 Mon Sep 17 00:00:00 2001 From: Maksym Sierszen Date: Sat, 13 Jan 2024 21:13:31 +0100 Subject: [PATCH] final ver commit --- .DS_Store | Bin 0 -> 6148 bytes Biblioteka/.gitignore | 38 ++++++ Biblioteka/.idea/.gitignore | 8 ++ Biblioteka/.idea/encodings.xml | 7 + Biblioteka/.idea/misc.xml | 14 ++ Biblioteka/.idea/uiDesigner.xml | 124 ++++++++++++++++++ Biblioteka/pom.xml | 31 +++++ .../src/main/java/org/example/Author.java | 67 ++++++++++ .../src/main/java/org/example/Book.java | 70 ++++++++++ .../src/main/java/org/example/Borrow.java | 71 ++++++++++ .../main/java/org/example/LibraryService.java | 100 ++++++++++++++ .../src/main/java/org/example/Main.java | 81 ++++++++++++ .../src/main/java/org/example/User.java | 70 ++++++++++ .../src/main/resources/hibernate.cfg.xml | 25 ++++ library_postgre_backup.sql | Bin 0 -> 13537 bytes 15 files changed, 706 insertions(+) create mode 100644 .DS_Store create mode 100644 Biblioteka/.gitignore create mode 100644 Biblioteka/.idea/.gitignore create mode 100644 Biblioteka/.idea/encodings.xml create mode 100644 Biblioteka/.idea/misc.xml create mode 100644 Biblioteka/.idea/uiDesigner.xml create mode 100644 Biblioteka/pom.xml create mode 100644 Biblioteka/src/main/java/org/example/Author.java create mode 100644 Biblioteka/src/main/java/org/example/Book.java create mode 100644 Biblioteka/src/main/java/org/example/Borrow.java create mode 100644 Biblioteka/src/main/java/org/example/LibraryService.java create mode 100644 Biblioteka/src/main/java/org/example/Main.java create mode 100644 Biblioteka/src/main/java/org/example/User.java create mode 100644 Biblioteka/src/main/resources/hibernate.cfg.xml create mode 100644 library_postgre_backup.sql diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f5dd5eecc3a2ee1f08c004da0f7d19ce939bd719 GIT binary patch literal 6148 zcmeHKO>fgc5S>i}b*PYX0IA|+iEC9t3rGmwqhm^!vZdp1WPrcjJ&GwOO$FMk?{`p`LtPk+I8TmO(Cu?8ux_c*vwGrde(6b( z*UeyXraEigJ9pQE^q)D4;9jDa?_TCy(=u11*@A7Om>Oa^sWs~M*R@s7l zoFV1o`@9^RS!|}|xVE*43k1EOH|lTB=ext_Tj8_e&SEQ^4|fKzcV8?Pz2M>FCokWO zj*G9Q`EGwbDa=j zL;Mq_h-@QrLd74P{={>B=M=7pFdz&F11n*`uYtkFN=B1GgaKjTUt)mQhY-pbd2Aip zr2~z<0s#3KX$3YP7r7?%79bT2duv;;5c`M$8T0wuv1~Bs2Iz$gd4g!`2X@r55GH?MWZExTJ literal 0 HcmV?d00001 diff --git a/Biblioteka/.gitignore b/Biblioteka/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/Biblioteka/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/Biblioteka/.idea/.gitignore b/Biblioteka/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/Biblioteka/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/Biblioteka/.idea/encodings.xml b/Biblioteka/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/Biblioteka/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Biblioteka/.idea/misc.xml b/Biblioteka/.idea/misc.xml new file mode 100644 index 0000000..ecfa09c --- /dev/null +++ b/Biblioteka/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Biblioteka/.idea/uiDesigner.xml b/Biblioteka/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/Biblioteka/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Biblioteka/pom.xml b/Biblioteka/pom.xml new file mode 100644 index 0000000..fce0ef7 --- /dev/null +++ b/Biblioteka/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + org.example + Library + 1.0-SNAPSHOT + + + 21 + 21 + UTF-8 + + + + + org.hibernate + hibernate-core + 5.6.9.Final + + + + + org.postgresql + postgresql + 42.4.0 + + + \ No newline at end of file diff --git a/Biblioteka/src/main/java/org/example/Author.java b/Biblioteka/src/main/java/org/example/Author.java new file mode 100644 index 0000000..af77582 --- /dev/null +++ b/Biblioteka/src/main/java/org/example/Author.java @@ -0,0 +1,67 @@ +package org.example; + +import javax.persistence.*; +import java.util.List; + +@Entity +@Table(name = "\"Authors\"") +public class Author { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "author_id") + private Long id; + + @Column(name = "name") + private String name; + + @Column(name = "nationality") + private String nationality; + + @Column(name = "birth_year") + private Integer birthYear; + + @OneToMany(mappedBy = "author", cascade = CascadeType.ALL) + private List books; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getNationality() { + return nationality; + } + + public void setNationality(String nationality) { + this.nationality = nationality; + } + + public Integer getBirthYear() { + return birthYear; + } + + public void setBirthYear(Integer birthYear) { + this.birthYear = birthYear; + } + + public List getBooks() { + return books; + } + + public void setBooks(List books) { + this.books = books; + } +} diff --git a/Biblioteka/src/main/java/org/example/Book.java b/Biblioteka/src/main/java/org/example/Book.java new file mode 100644 index 0000000..567b955 --- /dev/null +++ b/Biblioteka/src/main/java/org/example/Book.java @@ -0,0 +1,70 @@ +package org.example; + +import org.hibernate.annotations.Type; +import javax.persistence.*; +import java.time.ZonedDateTime; + +@Entity +@Table(name = "\"Books\"") +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "book_id") + private Long id; + + @Column(name = "title") + private String title; + + @Column(name = "publication_date") + @Type(type = "org.hibernate.type.ZonedDateTimeType") + private ZonedDateTime publicationDate; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "author_id") + private Author author; + + @Column(name = "availability_status") + private boolean availabilityStatus; + + // Getters and setters + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public ZonedDateTime getPublicationDate() { + return publicationDate; + } + + public void setPublicationDate(ZonedDateTime publicationDate) { + this.publicationDate = publicationDate; + } + + public Author getAuthor() { + return author; + } + + public void setAuthor(Author author) { + this.author = author; + } + + public boolean isAvailabilityStatus() { + return availabilityStatus; + } + + public void setAvailabilityStatus(boolean availabilityStatus) { + this.availabilityStatus = availabilityStatus; + } +} diff --git a/Biblioteka/src/main/java/org/example/Borrow.java b/Biblioteka/src/main/java/org/example/Borrow.java new file mode 100644 index 0000000..76c8465 --- /dev/null +++ b/Biblioteka/src/main/java/org/example/Borrow.java @@ -0,0 +1,71 @@ +package org.example; +import org.hibernate.annotations.Type; +import javax.persistence.*; +import java.time.ZonedDateTime; + +@Entity +@Table(name = "\"Borrows\"") +public class Borrow { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "borrow_id") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "book_id") + private Book book; + + @Column(name = "borrow_date") + @Type(type = "org.hibernate.type.ZonedDateTimeType") + private ZonedDateTime borrowDate; + + @Column(name = "return_date") + @Type(type = "org.hibernate.type.ZonedDateTimeType") + private ZonedDateTime returnDate; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + public Book getBook() { + return book; + } + + public void setBook(Book book) { + this.book = book; + } + + public ZonedDateTime getBorrowDate() { + return borrowDate; + } + + public void setBorrowDate(ZonedDateTime borrowDate) { + this.borrowDate = borrowDate; + } + + public ZonedDateTime getReturnDate() { + return returnDate; + } + + public void setReturnDate(ZonedDateTime returnDate) { + this.returnDate = returnDate; + } +} diff --git a/Biblioteka/src/main/java/org/example/LibraryService.java b/Biblioteka/src/main/java/org/example/LibraryService.java new file mode 100644 index 0000000..6f544a2 --- /dev/null +++ b/Biblioteka/src/main/java/org/example/LibraryService.java @@ -0,0 +1,100 @@ +package org.example; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.query.Query; +import java.util.List; + +public class LibraryService { + + private SessionFactory sessionFactory; + + public LibraryService(SessionFactory sessionFactory) { + this.sessionFactory = sessionFactory; + } + + public void printAllAuthors() { + try (Session session = sessionFactory.openSession()) { + Query query = session.createQuery("FROM Author", Author.class); + List authors = query.getResultList(); + + System.out.println("Dostępni autorzy:"); + for (Author author : authors) { + System.out.println("ID: " + author.getId() + author.getName()); + } + } + } + + public List findAllBooksByAuthorId(Long authorId) { + List books; + try (Session session = sessionFactory.openSession()) { + Query query = session.createQuery("SELECT b FROM Book b JOIN FETCH b.author WHERE b.author.id = :authorId", Book.class); + query.setParameter("authorId", authorId); + books = query.getResultList(); + } + return books; + } + + public void printBooksByAuthor(long authorId) { + List booksByAuthor = findAllBooksByAuthorId(authorId); + + if (!booksByAuthor.isEmpty()) { + Author author = booksByAuthor.get(0).getAuthor(); + System.out.println("Książki autora:\n " + author.getName()); + for (Book book : booksByAuthor) { + System.out.println("Tytuł: " + book.getTitle()); + System.out.println("Data publikacji: " + book.getPublicationDate()); + System.out.println("--------"); + } + } else { + System.out.println("Nie znaleziono książek dla autora o ID: " + authorId); + } + } + + public void printBorrowsByUserId(long userId, int pageNumber) { + int pageSize = 3; + try (Session session = sessionFactory.openSession()) { + Query query = session.createQuery("FROM Borrow b WHERE b.user.id = :userId", Borrow.class); + query.setParameter("userId", userId); + query.setFirstResult((pageNumber - 1) * pageSize); + query.setMaxResults(pageSize); + + List borrows = query.getResultList(); + + if (borrows.isEmpty()) { + System.out.println("Użytkownik o ID " + userId + " nie ma żadnych wypożyczeń."); + } else { + for (Borrow borrow : borrows) { + System.out.println("Wypożyczenie ID: " + borrow.getId()); + System.out.println("Książka: " + borrow.getBook().getTitle()); + System.out.println("Data wypożyczenia: " + borrow.getBorrowDate()); + System.out.println("Data zwrotu: " + borrow.getReturnDate()); + System.out.println("--------"); + } + } + } + } + + public boolean hasBorrows(long userId) { + try (Session session = sessionFactory.openSession()) { + Query query = session.createQuery("SELECT COUNT(b.id) FROM Borrow b WHERE b.user.id = :userId", Long.class); + query.setParameter("userId", userId); + return query.getSingleResult() > 0; + } + } + + public void printAvailableBooks() { + try (Session session = sessionFactory.openSession()) { + Query query = session.createQuery("FROM Book b WHERE b.availabilityStatus = true", Book.class); + List availableBooks = query.getResultList(); + + if (availableBooks.isEmpty()) { + System.out.println("Brak dostępnych książek."); + } else { + System.out.println("Dostępne książki:"); + for (Book book : availableBooks) { + System.out.println("ID: " + book.getId() + ", Tytuł: " + book.getTitle()); + } + } + } + } +} \ No newline at end of file diff --git a/Biblioteka/src/main/java/org/example/Main.java b/Biblioteka/src/main/java/org/example/Main.java new file mode 100644 index 0000000..787740f --- /dev/null +++ b/Biblioteka/src/main/java/org/example/Main.java @@ -0,0 +1,81 @@ +package org.example; + +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; +import java.util.Scanner; + +public class Main { + public static void main(String[] args) { + // Konfiguracja Hibernate z pliku hibernate.cfg.xml + Configuration configuration = new Configuration(); + configuration.configure("hibernate.cfg.xml"); + + // Utworzenie sesji Hibernate + SessionFactory sessionFactory = configuration.buildSessionFactory(); + + // Utworzenie instancji LibraryService + LibraryService libraryService = new LibraryService(sessionFactory); + + Scanner scanner = new Scanner(System.in); + + while (true) { + System.out.println("-- BIBLIOTEKA --"); + System.out.println("1. Wypisz książki danego autora"); + System.out.println("2. Wypisz wypożyczenia użytkownika"); + System.out.println("3. Wypisz dostępne książki"); + System.out.println("4. Wyjście"); + + System.out.print("Wybierz opcję: "); + int choice = scanner.nextInt(); + + switch (choice) { + case 1: + libraryService.printAllAuthors(); + System.out.print("Podaj ID autora: "); + long authorId = scanner.nextLong(); + libraryService.printBooksByAuthor(authorId); + break; + case 2: + System.out.print("Podaj ID użytkownika: "); + long userId = scanner.nextLong(); + if (!libraryService.hasBorrows(userId)) { + System.out.println("Użytkownik o ID " + userId + " nie ma żadnych wypożyczeń."); + } else { + int currentPage = 1; + boolean browsing = true; + while (browsing) { + libraryService.printBorrowsByUserId(userId, currentPage); + System.out.println("Aktualna strona: " + currentPage); + System.out.println("1. Następna strona"); + System.out.println("2. Poprzednia strona"); + System.out.println("3. Wyjście ze stronicowania"); + System.out.print("Wybierz opcję: "); + int pageChoice = scanner.nextInt(); + switch (pageChoice) { + case 1: + currentPage++; + break; + case 2: + currentPage = Math.max(1, currentPage - 1); + break; + case 3: + browsing = false; + break; + } + } + } + break; + case 3: + libraryService.printAvailableBooks(); + break; + case 4: + System.out.println("> EXIT <"); + sessionFactory.close(); + System.exit(0); + break; + default: + System.out.println("Nieprawidłowa opcja, spróbuj ponownie."); + } + } + } +} \ No newline at end of file diff --git a/Biblioteka/src/main/java/org/example/User.java b/Biblioteka/src/main/java/org/example/User.java new file mode 100644 index 0000000..7cea6a7 --- /dev/null +++ b/Biblioteka/src/main/java/org/example/User.java @@ -0,0 +1,70 @@ +package org.example; + +import org.hibernate.annotations.Type; +import javax.persistence.*; +import java.time.ZonedDateTime; +import java.util.List; + +@Entity +@Table(name = "\"Users\"") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "user_id") + private Long id; + + @Column(name = "name") + private String name; + + @Column(name = "birth_date") + @Type(type = "org.hibernate.type.ZonedDateTimeType") + private ZonedDateTime birthDate; + + @Column(name = "email", unique = true) + private String email; + + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) + private List borrows; + + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ZonedDateTime getBirthDate() { + return birthDate; + } + + public void setBirthDate(ZonedDateTime birthDate) { + this.birthDate = birthDate; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public List getBorrows() { + return borrows; + } + + public void setBorrows(List borrows) { + this.borrows = borrows; + } +} diff --git a/Biblioteka/src/main/resources/hibernate.cfg.xml b/Biblioteka/src/main/resources/hibernate.cfg.xml new file mode 100644 index 0000000..c6bfe10 --- /dev/null +++ b/Biblioteka/src/main/resources/hibernate.cfg.xml @@ -0,0 +1,25 @@ + + + + + org.postgresql.Driver + jdbc:postgresql://localhost:5432/Library + postgres + 1234 + + + org.hibernate.dialect.PostgreSQLDialect + + + false + true + + + + + + + + diff --git a/library_postgre_backup.sql b/library_postgre_backup.sql new file mode 100644 index 0000000000000000000000000000000000000000..c8d8993c69dfa646e9020ef37d4b15b97bcb61ab GIT binary patch literal 13537 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 UI@dI8bb;?D{Ur}<>ClD$52Zs4#Q*>R literal 0 HcmV?d00001