Kaip sukurti „Rest API“ su „Spring Boot“ naudojant „MySQL“ ir JPA

Sveiki visi! Per pastaruosius metus aš mokausi „JavaScript“, skirtos kurti visą tinklą. Norėčiau pakeisti „Java“ - galingą į objektą orientuotą kalbą.

Tokiu atveju radau labai švarų ir elegantišką karkasą, pavadintą „Spring Boot“, kad galėčiau sukurti galinę dalį.

Anksčiau, kurdamas „JavaScript“, naudojau:

  1. Mongoose - ORM (Object Relational Mapping), skirtas Mongo DB
  2. „Sequelize“ - „MySQL“ ORM

Su Java susijusioms programoms yra daugybė ORM, pvz., „ Hibernate“, JPA („Java Persistence API“) ir „ Java“ objektų užklausos.

Aš renkuosi kurti naudodamas JPA, kuris tradiciškai naudojamas „Java“ programose.

Tai buvo labai įdomu ir užtruko apie vieną savaitę, nes turėjau išmokti „Spring Boot“ (mokytis daugybė komentarų „ @ “ ir kitų įdomių dalykų), JPA ir „Hibernate“.

Visą šią magiją dažniausiai daro anotacijos („ @ “ simbolis), naudojamos „Spring Boot“.

„Spring Boot Maven“ projekto kūrimas

Sukurkime „Spring Boot Maven“ projekto programą naudodami šią nuorodą.

Maven “ yra projekto valdymo įrankis, naudojamas valdyti priklausomybę. Tai visai kaip „Node Package Manager“ ( NPM ) JS kūrimo aplinkoje.

Priklausomybės valdymui mes turime „NodeJS“ paketą „pack.json“, o priklausomybės valdymui - „ Pom .

Grupėje parašykite kokį tik norite vardą. Paprastai organizacijos domeno vardas rašomas iš dešinės į kairę.

Pavyzdžiui, mūsų domeno vardas yra www.javaAPI.com, todėl grupės pavadinimas gali būti com.javaAPI.www

Tada „Artefact“ įveskite norimo aplanko pavadinimą .

Dešinėje pusėje pridėkite šias priklausomybes:

  1. WEB - naudoti „Spring“ priklausomybes (senesnė „Spring Boot“ sistema, naudojama kuriant žiniatinklio programas)
  2. JPA - „Java Persistence API“
  3. MYSQL

Tada spustelėkite „Generuoti projektą“. Rasite rar failą - ištraukite jį. Tada atidarykite tą aplanką savo mėgstamoje IDE.

Spustelėkite com.rest.API ir rasite „ ApiApplication.java“ failą taip:

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); } }

Šio kodo pakanka paleisti serverį. Paprastai spyruoklinė bagažinė veikia „ localhost“: 8080 .

Įveskite terminalą taip:

mvn spring-boot: paleisti

Pažiūrėkite, kaip jūsų vietinis kompiuteris veikia žiniatinklio naršyklėje 8080 prievade. Tai atrodo tuščia, nes mes dar nieko nepadarėme.

Panagrinėkime failus ir jų žymas

Jei pažvelgsite į failą pom.xml, galite pastebėti, kad priklausomybės, kurias įdėjote kurdami programą „Spring Initialize“, pvz., „MySQL“, JPA ir „Web“, bus cy> žyma.

Pradedančiųjų ir bandytojų priklausomybės yra pagrindas kuriant „Spring Boot“ programą, kuri bus naudojama serveryje.

Dabar pereikime prie APIApplication.java, kuris yra pagrindinis failas.

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); } }

Čia paketo pavadinimas yra pirmoje kodo eilutėje. Naudodami šį paketo pavadinimą galite importuoti bet kurią klasę, metodą ar egzempliorius į kitą paketo failą.

Po to iš „org.springframework.boot“ paketo importuojami du moduliai.

  1. Pavasario taikymas
  2. „SpringBootApplication“

Kadangi „Spring boot“ yra naujausia „Spring“ programą kurianti sistema, jai reikalingi „Spring Application“ paketai, taip pat specifiniai paketai.

Po to naudojama @SpringBootApplication Anotacija. Šią anotaciją sudaro anotacija, naudojama pavasarį:

  1. @Component - nurodo kompiliatoriui, kad ši klasė yra komponentas, kurį reikia įtraukti sudarant visą programą.
  2. @ComponentScan - tai nuskaito paketus, kuriuos naudosime šioje „Java“ klasėje.
  3. @EnableAutoConfiguration - įgalina „Spring Boot“ automatinio konfigūravimo mechanizmą importuoti svarbius „Spring Boot“ paleisties modulius.

Tai yra anotacijos, naudojamos paleisti „Spring Boot“ programą, kad ji veiktų serveryje.

Čia yra mano parašytas straipsnis apie anotaciją ir jų naudojimą „Java“.

Sukurkime savo duomenų modelį

Sukurkime „Model“ klasę, kad išsaugotume, atgautume, atnaujintume ir ištrintume knygos informaciją.

Tam turiu sukurti naują paketą pavadinimu „ modelis“ ir sukurti „ Book.java“ klasę, kad įdėčiau savo kodą.

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; } }

Čia aš naudoju JPA (Java Persistence API), kuris yra klasių ir metodų rinkinys, kad duomenys būtų nuolat saugomi duomenų bazėje.

@Entity - naudojamas pažymėti, kad ši klasė bus duomenų bazės subjektas.

@Table - tam reikalingos kai kurios vertės, pvz., Vardas, kurį pavadinsite savo lentele

@Id — denotes that the id is the primary key / identifying key for this table

@NotBlank — is used to say that these attributes should not be blank.

Other than that there is an empty constructor which has a super method to satisfy the JPA customs. Getter and setter methods are usually in a POJO class (Plain old Java object).

Creating the Repository

Next, we are going to create a repository package to deal with database management in Java.

Create an Interface called BookRepository.java inside the repository package.

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…

Baigėme REST API dalį. Dabar galite sukurti programą (kuri buvo paaiškinta 1 dalyje) ir atlikti keletą bandymų su „Postman“.

Prisijungimas prie „MySql“ duomenų bazės

Viduje application.properties savo išteklių aplanką, pridėti taip:

## 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

Viskas.

„Spring Boot“ sukūrėme pagrindinę „REST“ API. Sveikinimai!

Jei kas nors yra negerai ar reikia taisyti, praneškite man tai komentarų skiltyje.

Susisiekite su manimi twitter.

Laimingo kodavimo!