From 24b218a15e79f01e01330b9dc33ba83b6d24d23f Mon Sep 17 00:00:00 2001 From: Rafig9501 Date: Fri, 29 May 2020 01:24:21 +0400 Subject: [PATCH] initial commit --- pom.xml | 9 +++ .../bootstrap/BootStrapData.java | 63 +++++++++++++++++++ .../controller/AuthorController.java | 22 +++++++ .../controller/BookController.java | 22 +++++++ .../spring5webapp/domain/Author.java | 55 ++++++++++++++++ .../spring5webapp/domain/Book.java | 60 ++++++++++++++++++ .../spring5webapp/domain/Publisher.java | 54 ++++++++++++++++ .../repository/AuthorRepository.java | 7 +++ .../repository/BookRepository.java | 7 +++ .../repository/PublisherRepository.java | 7 +++ src/main/resources/application.properties | 1 + .../resources/templates/authors/list.html | 24 +++++++ src/main/resources/templates/books/list.html | 24 +++++++ 13 files changed, 355 insertions(+) create mode 100644 src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java create mode 100644 src/main/java/guru/springframework/spring5webapp/controller/AuthorController.java create mode 100644 src/main/java/guru/springframework/spring5webapp/controller/BookController.java create mode 100644 src/main/java/guru/springframework/spring5webapp/domain/Author.java create mode 100644 src/main/java/guru/springframework/spring5webapp/domain/Book.java create mode 100644 src/main/java/guru/springframework/spring5webapp/domain/Publisher.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repository/AuthorRepository.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repository/BookRepository.java create mode 100644 src/main/java/guru/springframework/spring5webapp/repository/PublisherRepository.java create mode 100644 src/main/resources/templates/authors/list.html create mode 100644 src/main/resources/templates/books/list.html diff --git a/pom.xml b/pom.xml index f34c1936df..cac7fe0f96 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,15 @@ spring-boot-starter-test test + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.projectlombok + lombok + provided + diff --git a/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java new file mode 100644 index 0000000000..71d70bd4a3 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/bootstrap/BootStrapData.java @@ -0,0 +1,63 @@ +package guru.springframework.spring5webapp.bootstrap; + +import guru.springframework.spring5webapp.domain.Author; +import guru.springframework.spring5webapp.domain.Book; +import guru.springframework.spring5webapp.domain.Publisher; +import guru.springframework.spring5webapp.repository.AuthorRepository; +import guru.springframework.spring5webapp.repository.BookRepository; +import guru.springframework.spring5webapp.repository.PublisherRepository; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +@Component +public class BootStrapData implements CommandLineRunner { + + private final AuthorRepository authorRepository; + private final BookRepository bookRepository; + private final PublisherRepository publisherRepository; + + public BootStrapData(AuthorRepository authorRepository, BookRepository bookRepository, PublisherRepository publisherRepository) { + this.authorRepository = authorRepository; + this.bookRepository = bookRepository; + this.publisherRepository = publisherRepository; + } + + @Override + public void run(String... args) throws Exception { + + System.out.println("Started in Bootstrap"); + + Publisher publisher = new Publisher(); + publisher.setName("SFG Publishing"); + publisher.setCity("St Petersburg"); + publisher.setState("FL"); + Author eric = new Author("Eric", "Evans"); + Book ddd = new Book("Design Book", "12342123"); + Author rod = new Author("Rod", "Johnson"); + Book noEJB = new Book("J2EE Development without EJB", "221421321"); + publisherRepository.save(publisher); + + eric.getBooks().add(ddd); + ddd.getAuthors().add(eric); + ddd.setPublisher(publisher); + publisher.getBooks().add(ddd); + + authorRepository.save(eric); + bookRepository.save(ddd); + publisherRepository.save(publisher); + + rod.getBooks().add(noEJB); + noEJB.getAuthors().add(rod); + noEJB.setPublisher(publisher); + publisher.getBooks().add(noEJB); + + authorRepository.save(rod); + bookRepository.save(noEJB); + publisherRepository.save(publisher); + + System.out.println("Started in Bootstrap"); + System.out.println("Number of books: " + bookRepository.count()); + System.out.println("Number of authors: " + authorRepository.count()); + System.out.println("Publisher Number of Books: " + publisher.getBooks().size()); + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/controller/AuthorController.java b/src/main/java/guru/springframework/spring5webapp/controller/AuthorController.java new file mode 100644 index 0000000000..e15c11dd13 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/controller/AuthorController.java @@ -0,0 +1,22 @@ +package guru.springframework.spring5webapp.controller; + +import guru.springframework.spring5webapp.repository.AuthorRepository; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class AuthorController { + + private final AuthorRepository authorRepository; + + public AuthorController(AuthorRepository authorRepository) { + this.authorRepository = authorRepository; + } + + @RequestMapping("/authors") + public String getAuthors(Model model){ + model.addAttribute("authors", authorRepository.findAll()); + return "authors/list"; + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/controller/BookController.java b/src/main/java/guru/springframework/spring5webapp/controller/BookController.java new file mode 100644 index 0000000000..72059c40c9 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/controller/BookController.java @@ -0,0 +1,22 @@ +package guru.springframework.spring5webapp.controller; + +import guru.springframework.spring5webapp.repository.BookRepository; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class BookController { + + private final BookRepository bookRepository; + + public BookController(BookRepository bookRepository) { + this.bookRepository = bookRepository; + } + + @RequestMapping("/books") + public String getBooks(Model model){ + model.addAttribute("books", bookRepository.findAll()); + return "books/list"; + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Author.java b/src/main/java/guru/springframework/spring5webapp/domain/Author.java new file mode 100644 index 0000000000..0926538d83 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/domain/Author.java @@ -0,0 +1,55 @@ +package guru.springframework.spring5webapp.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Author { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + private String lastName; + + @ManyToMany(mappedBy = "authors") + private Set books = new HashSet<>(); + + public Author(String name, String lastName) { + this.name = name; + this.lastName = lastName; + } + + @Override + public String toString() { + return "Author{" + + "id=" + id + + ", name='" + name + '\'' + + ", lastName='" + lastName + '\'' + + ", books=" + books + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Author author = (Author) o; + return Objects.equals(id, author.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Book.java b/src/main/java/guru/springframework/spring5webapp/domain/Book.java new file mode 100644 index 0000000000..23179aa29a --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/domain/Book.java @@ -0,0 +1,60 @@ +package guru.springframework.spring5webapp.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Book { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String title; + private String isbn; + + @ManyToOne + private Publisher publisher; + + @ManyToMany + @JoinTable(name = "author_book", joinColumns = @JoinColumn(name = "book_id"), + inverseJoinColumns = @JoinColumn(name = "author_id")) + private Set authors = new HashSet<>(); + + public Book(String title, String isbn) { + this.title = title; + this.isbn = isbn; + } + + @Override + public String toString() { + return "Book{" + + "id=" + id + + ", title='" + title + '\'' + + ", isbn='" + isbn + '\'' + + ", authors=" + authors + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + return Objects.equals(id, book.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java b/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java new file mode 100644 index 0000000000..e28be61a1f --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/domain/Publisher.java @@ -0,0 +1,54 @@ +package guru.springframework.spring5webapp.domain; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +@Entity +@Data +@NoArgsConstructor +public class Publisher { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + private String addressLine1; + private String city; + private String state; + private String zip; + + @OneToMany + @JoinColumn(name = "publisher_id") + private Set books = new HashSet<>(); + + @Override + public String toString() { + return "Publisher{" + + "id=" + id + + ", name='" + name + '\'' + + ", addressLine1='" + addressLine1 + '\'' + + ", city='" + city + '\'' + + ", state='" + state + '\'' + + ", zip='" + zip + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Publisher publisher = (Publisher) o; + return Objects.equals(id, publisher.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } +} diff --git a/src/main/java/guru/springframework/spring5webapp/repository/AuthorRepository.java b/src/main/java/guru/springframework/spring5webapp/repository/AuthorRepository.java new file mode 100644 index 0000000000..61ed1cce21 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repository/AuthorRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repository; + +import guru.springframework.spring5webapp.domain.Author; +import org.springframework.data.repository.CrudRepository; + +public interface AuthorRepository extends CrudRepository { +} diff --git a/src/main/java/guru/springframework/spring5webapp/repository/BookRepository.java b/src/main/java/guru/springframework/spring5webapp/repository/BookRepository.java new file mode 100644 index 0000000000..005c7486cd --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repository/BookRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repository; + +import guru.springframework.spring5webapp.domain.Book; +import org.springframework.data.repository.CrudRepository; + +public interface BookRepository extends CrudRepository { +} diff --git a/src/main/java/guru/springframework/spring5webapp/repository/PublisherRepository.java b/src/main/java/guru/springframework/spring5webapp/repository/PublisherRepository.java new file mode 100644 index 0000000000..fdc3c4d1b7 --- /dev/null +++ b/src/main/java/guru/springframework/spring5webapp/repository/PublisherRepository.java @@ -0,0 +1,7 @@ +package guru.springframework.spring5webapp.repository; + +import guru.springframework.spring5webapp.domain.Publisher; +import org.springframework.data.repository.CrudRepository; + +public interface PublisherRepository extends CrudRepository { +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e69de29bb2..69b89983cb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.h2.console.enabled=true \ No newline at end of file diff --git a/src/main/resources/templates/authors/list.html b/src/main/resources/templates/authors/list.html new file mode 100644 index 0000000000..89909b3363 --- /dev/null +++ b/src/main/resources/templates/authors/list.html @@ -0,0 +1,24 @@ + + + + + Spring Framework Guru + + +

Author List

+ + + + + + + + + + + + +
IDFirst NameLast Name
123JoeSmith
+ + + \ No newline at end of file diff --git a/src/main/resources/templates/books/list.html b/src/main/resources/templates/books/list.html new file mode 100644 index 0000000000..748b6c2b0b --- /dev/null +++ b/src/main/resources/templates/books/list.html @@ -0,0 +1,24 @@ + + + + + Spring Framework Guru + + +

Book List

+ + + + + + + + + + + + +
IDTitlePublisher
123 Spring in ActionWrox
+ + + \ No newline at end of file