Πώς να δημιουργήσετε ένα Rest API με Spring Boot χρησιμοποιώντας MySQL και JPA

Γεια σε όλους! Για τον τελευταίο χρόνο, μαθαίνω JavaScript για την ανάπτυξη ιστού πλήρους στοίβας. Για μια αλλαγή, άρχισα να μαθαίνω Java - την ισχυρή αντικειμενοστρεφή γλώσσα.

Σε αυτήν την περίπτωση, βρήκα ένα πολύ καθαρό και κομψό πλαίσιο που ονομάζεται Spring Boot για να χτίσω ένα πίσω μέρος.

Προηγουμένως, στην ανάπτυξη JavaScript, χρησιμοποίησα:

  1. Mongoose - ένα ORM (Object Relational Mapping) για το Mongo DB
  2. Sequelize - ένα ORM για MySQL

Για ανάπτυξη που σχετίζεται με την Java, υπάρχουν πολλά ORM όπως Hibernate, JPA (Java Persistence API) & Java Object Oriented Querying.

Επιλέγω να δημιουργήσω με JPA που χρησιμοποιείται παραδοσιακά σε εφαρμογές Java.

Ήταν πολύ ενδιαφέρον και χρειάστηκε περίπου μία εβδομάδα για να τελειώσω καθώς έπρεπε να μάθω το Spring Boot (Υπάρχουν πολλοί σχολιασμοί " @ " και άλλα ωραία είδη για να μάθω), JPA και Hibernate στην πορεία.

Όλη αυτή η μαγεία γίνεται κυρίως από τους σχολιασμούς ( σύμβολο " @ ") που χρησιμοποιούνται στο Spring Boot.

Δημιουργία έργου Spring Boot Maven

Ας δημιουργήσουμε μια εφαρμογή Spring Boot Maven Project χρησιμοποιώντας αυτόν τον σύνδεσμο.

Το " Maven " είναι ένα εργαλείο διαχείρισης έργου που χρησιμοποιείται για τη διαχείριση της εξάρτησης. Είναι ακριβώς όπως το Node Package Manager ( NPM ) στο περιβάλλον ανάπτυξης JS.

Έχουμε το package.json στο NodeJS για διαχείριση εξάρτησης και pom.xml στο Spring Boot για διαχείριση εξάρτησης.

Στην ομάδα, γράψτε ό, τι όνομα θέλετε. Συνήθως, το όνομα τομέα του οργανισμού γράφεται δεξιά προς τα αριστερά.

Για παράδειγμα, το όνομα τομέα μας είναι www.javaAPI.com, έτσι το όνομα της ομάδας θα μπορούσε να είναι com.javaAPI.www

Στη συνέχεια, στο Artifact πληκτρολογήστε το όνομα του φακέλου που θέλετε .

Στη δεξιά πλευρά, προσθέστε τις ακόλουθες εξαρτήσεις:

  1. WEB - Για να χρησιμοποιήσετε τις εξαρτήσεις του Spring (Το παλαιότερο πλαίσιο του Spring Boot χρησιμοποιείται για την ανάπτυξη εφαρμογών ιστού)
  2. JPA - API ανθεκτικότητας Java
  3. MYSQL

Στη συνέχεια, κάντε κλικ στο "Δημιουργία έργου". Θα βρείτε ένα αρχείο rar - εξαγάγετε το. Στη συνέχεια, ανοίξτε αυτόν το φάκελο στο αγαπημένο σας IDE.

Κάντε κλικ στο com.rest.API και θα βρείτε ένα αρχείο ApiApplication.java ως εξής:

package com.rest.API; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ApiApplication { public static void main(String[] args) { SpringApplication.run(ApiApplication.class, args); } }

Αυτός ο κωδικός είναι αρκετός για να ξεκινήσει ο διακομιστής σας. Κανονικά εκκίνησης την άνοιξη τρέχει στο localhost: 8080 .

Πληκτρολογήστε το τερματικό σας ως εξής:

mvn spring-boot: εκτέλεση

Δείτε το localhost που εκτελείται στο πρόγραμμα περιήγησης ιστού στη θύρα 8080. Φαίνεται κενό καθώς δεν έχουμε κάνει κάτι ακόμα.

Ας εξερευνήσουμε τα αρχεία και τις ετικέτες τους

Εάν ρίξετε μια ματιά στο αρχείο pom.xml, ενδέχεται να παρατηρήσετε ότι οι εξαρτήσεις που βάλατε κατά τη δημιουργία της εφαρμογής στο Spring Initialize όπως MySQL, JPA και Web θα βρίσκονται μέσα σε ένα cy> ετικέτα.

Οι εξαρτήσεις εκκίνησης και δοκιμαστών είναι ο πυρήνας για τη δημιουργία της Εφαρμογής Άνοιξης Εκκίνησης για εξυπηρέτηση στον διακομιστή.

Τώρα, ας προχωρήσουμε στο APIApplication.java που είναι το κύριο αρχείο.

package com.rest.API; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ApiApplication { public static void main(String[] args) { SpringApplication.run(ApiApplication.class, args); } }

Εδώ το όνομα του πακέτου βρίσκεται στην πρώτη γραμμή του κώδικα. Χρησιμοποιώντας αυτό το όνομα πακέτου, μπορείτε να εισαγάγετε οποιαδήποτε κλάση, μέθοδο ή παρουσίες σε άλλο αρχείο πακέτου.

Μετά από αυτό, δύο μονάδες εισάγονται από το πακέτο "org.springframework.boot".

  1. Εφαρμογή άνοιξη
  2. Εφαρμογή SpringBoot

Δεδομένου ότι το Spring boot είναι το τελευταίο πλαίσιο ανάπτυξης εφαρμογών της Spring, χρειάζεται τα πακέτα της Spring Application καθώς και τα συγκεκριμένα πακέτα του.

Μετά από αυτό χρησιμοποιείται @SpringBootApplication Annotation. Αυτός ο σχολιασμός αποτελείται από σχολιασμό που χρησιμοποιείται την άνοιξη:

  1. @Component - Λέει στον μεταγλωττιστή ότι η ακόλουθη κλάση είναι ένα στοιχείο που πρέπει να συμπεριληφθεί κατά τη σύνταξη ολόκληρης της εφαρμογής.
  2. @ComponentScan - Αυτό κάνει τη σάρωση των πακέτων που πρόκειται να χρησιμοποιήσουμε στην ακόλουθη τάξη Java.
  3. @EnableAutoConfiguration - επιτρέπει στον μηχανισμό αυτόματης διαμόρφωσης του Spring Boot να εισάγει σημαντικές λειτουργικές μονάδες για την εκτέλεση του Spring Boot.

Αυτοί είναι οι σχολιασμοί που χρησιμοποιούνται για την εκκίνηση της εφαρμογής Spring Boot για εκτέλεση σε διακομιστή.

Εδώ είναι ένα άρθρο που έχω γράψει για τον σχολιασμό και τις χρήσεις τους στην Java.

Ας δημιουργήσουμε Μοντέλο για τα δεδομένα μας

Ας δημιουργήσουμε μια κλάση μοντέλου για αποθήκευση, ανάκτηση, ενημέρωση και διαγραφή των λεπτομερειών ενός βιβλίου.

Γι 'αυτό, πρέπει να δημιουργήσω ένα νέο πακέτο με το όνομα μοντέλο και μέσα σε αυτήν τη δημιουργία μιας τάξης Book.java για να βάλω τον κωδικό μου.

package com.rest.API.model; import javax.persistence.*; import javax.validation.constraints.NotBlank; @Entity @Table(name = "books") public class Book { @Id @GeneratedValue private Long id; @NotBlank private String book_name; @NotBlank private String author_name; @NotBlank private String isbn; public Book(){ super(); } public Book(Long id, String book_name, String author_name, String isbn) { super(); this.id = id; this.book_name = book_name; this.author_name = author_name; this.isbn=isbn; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getBook_name() { return book_name; } public void setBook_name(String book_name) { this.book_name = book_name; } public String getAuthor_name() { return author_name; } public void setAuthor_name(String author_name) { this.author_name = author_name; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } }

Εδώ χρησιμοποιώ το JPA (Java Persistence API) το οποίο είναι μια συλλογή τάξεων και μεθόδων για τη συνεχή αποθήκευση δεδομένων σε μια βάση δεδομένων.

@Entity - χρησιμοποιείται για να δηλώσει ότι αυτή η τάξη πρόκειται να είναι οντότητα στη βάση δεδομένων.

@Table - που παίρνει κάποιες τιμές όπως το όνομα που θα ονομάσετε τον πίνακα σας

@Id - δηλώνει ότι το αναγνωριστικό είναι το πρωτεύον κλειδί / κλειδί αναγνώρισης για αυτόν τον πίνακα

@NotBlank - χρησιμοποιείται για να πει ότι αυτά τα χαρακτηριστικά δεν πρέπει να είναι κενά.

Εκτός από αυτό υπάρχει ένας άδειος κατασκευαστής που έχει μια σούπερ μέθοδο για την ικανοποίηση των τελωνείων JPA. Οι μέθοδοι λήψης και ρύθμισης είναι συνήθως σε τάξη POJO ( Απλό παλιό αντικείμενο Java ).

Δημιουργία του αποθετηρίου

Στη συνέχεια, πρόκειται να δημιουργήσουμε ένα πακέτο αποθετηρίου για την αντιμετώπιση της διαχείρισης βάσεων δεδομένων στην Java.

Δημιουργήστε μια διεπαφή που ονομάζεται BookRepository.java μέσα στο πακέτο αποθετηρίου .

package com.rest.API.repository; import com.rest.API.model.Book; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface BookRepository extends JpaRepository { }

I have imported the JpaRepository package to use that repository in the BookRepository interface by connecting my most recently coded Book model to do CRUD operations.

There are already built-in methods in those repositories to do CRUD operations.

Eg:

.findAll() - to get All datas .save() - to save the got Data .delete() - to delete the data

Inside the tag we are taking the Model name we are going to use and the Primary key’s datatype.

@Repository: Annotation used to Indicate the DAO (Data Access Object) component in the persistence layer.

It tells the compiler that the interface is going to use the Repository to do database activities.

Creating Controller and Exception Handling

Create a new package called controller, andinside that create a BookController.java file which contains the endpoints.

package com.rest.API.controller; import com.rest.API.exception.BookNotFoundException; import com.rest.API.model.Book; import com.rest.API.repository.BookRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.http.ResponseEntity; import javax.validation.Valid; import java.util.List; @RestController public class BookController { @Autowired BookRepository bookRepository; // Get All Notes @GetMapping("/books") public List getAllNotes() { return bookRepository.findAll(); } // Create a new Note @PostMapping("/books") public Book createNote(@Valid @RequestBody Book book) { return bookRepository.save(book); } // Get a Single Note @GetMapping("/books/{id}") public Book getNoteById(@PathVariable(value = "id") Long bookId) throws BookNotFoundException { return bookRepository.findById(bookId) .orElseThrow(() -> new BookNotFoundException(bookId)); } // Update a Note @PutMapping("/books/{id}") public Book updateNote(@PathVariable(value = "id") Long bookId, @Valid @RequestBody Book bookDetails) throws BookNotFoundException { Book book = bookRepository.findById(bookId) .orElseThrow(() -> new BookNotFoundException(bookId)); book.setBook_name(bookDetails.getBook_name()); book.setAuthor_name(bookDetails.getAuthor_name()); book.setIsbn(bookDetails.getIsbn()); Book updatedBook = bookRepository.save(book); return updatedBook; } // Delete a Note @DeleteMapping("/books/{id}") public ResponseEntity deleteBook(@PathVariable(value = "id") Long bookId) throws BookNotFoundException { Book book = bookRepository.findById(bookId) .orElseThrow(() -> new BookNotFoundException(bookId)); bookRepository.delete(book); return ResponseEntity.ok().build(); } }

The first imported package is for the Book Not Found exception (for which we are going to create a file in a bit).

Explanation of Annotations we used here:

  1. RestController: This annotation is used to denote every method in the annotated class as Domain Object.

So what is Domain Object…?

It simply says that Domain Object == Business Object.

They are usually represented by entities and value objects related to the endpoint we are giving to get the data from the database.

2. Autowired: This annotation is used to wire the bean classes automatically.

For that, you need to know about “What is a bean Class..?

Basically, a Java Bean Class is a simple class which encapsulates many objects into it.

This is an article I wrote on Java Bean Classes.

The following are the Mapping Annotations for the endpoints to perform CRUD Operations.

3. GetMapping: This is an interface which contains the path of the endpoint to perform a Get method. This GetMapping interface uses the RequestMapping interface which can have the “path, value, params, headers” method to perform the Get method in earlier Spring versions.

Now it’s simplified by using GetMapping.

4. PostMapping: This is an interface which contains the path of the endpoint to perform the Post method.

5. PutMapping: This is an interface which contains the path of the endpoint to perform the Put method to Update.

6. DeleteMapping: This is an interface which contains the path of the endpoint to perform the Delete method.

In the final lines, you probably noticed the “ResponseEntity” keyword.

What is that…??

It’s a Java class which inherits HttpEntity class to manipulate the HTTP Responses. Whether the request of the connection is “OK” or if there are any problems, throw an exception from the HttpEntity class.

orElseThrow(): This is a method found in the Optional class in Java8 which was introduced to handle Exceptions. The optional class provides various utility methods to check the presence or absence of an object, which helps to deal with NullPointerException.

orElseThrow is a method that Returns value if present, otherwise invokes an exception.

Creating a NotFoundException if there is no such book_id

As orElseThrow method throws a NotFound Exception. The following is the Exception Handling part. Create a BookNotFoundException.java file inside exception package.

package com.rest.API.exception; public class BookNotFoundException extends Exception { private long book_id; public BookNotFoundException(long book_id) { super(String.format("Book is not found with id : '%s'", book_id)); } }

The created class extends the Superclass of Exception. In the constructor, I’m passing the book_id & prints the exception.

So, that’s it…

Ολοκληρώσαμε το τμήμα REST API. Τώρα μπορείτε να δημιουργήσετε την εφαρμογή (η οποία εξηγήθηκε στο Μέρος 1) και να κάνετε κάποιες δοκιμές με τον Ταχυδρομείο.

Σύνδεση με βάση δεδομένων MySql

Μέσα στο application.properties του φακέλου πόρων σας , προσθέστε τα εξής:

## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) spring.datasource.url = jdbc:mysql://localhost:3306/library spring.datasource.username = root //normally put your MySQL username spring.datasource.password = YOUR_MYSQL_PASSWORD ## Hibernate Properties # The SQL dialect makes Hibernate generate better SQL for the chosen database spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect # Hibernate ddl auto (create, create-drop, validate, update) spring.jpa.hibernate.ddl-auto = update

Αυτό είναι.

Έχουμε δημιουργήσει ένα βασικό API REST στο Spring Boot. Συγχαρητήρια!

Εάν κάτι είναι λάθος ή πρέπει να διορθωθεί, ενημερώστε με στην ενότητα σχολίων.

Ελάτε σε επαφή μαζί μου στο twitter.

Καλή κωδικοποίηση!