sql >> データベース >  >> RDS >> Mysql

MySQLとJPAを使用してSpringBootでRESTAPIを構築する方法

    やあみんな!過去1年間、私はフルスタックWeb開発用のJavaScriptを学んでいます。変更のために、私はJava(強力なオブジェクト指向言語)を習得し始めました。

    その場合、バックエンドを構築するためのSpringBootと呼ばれる非常にクリーンでエレガントなフレームワークを見つけました。

    以前、JavaScript開発では、以下を使用しました:

    1. Mongoose — Mongo DBのORM(オブジェクトリレーショナルマッピング)
    2. Sequelize —MySQLのORM

    Java関連の開発には、 Hibernate、JPAのようなORMがたくさんあります。 (Java Persistence API)&Javaオブジェクト指向クエリ。

    私は、Javaアプリケーションで伝統的に使用されているJPAを使用してビルドすることを選択します。

    とても面白かったし、Spring Bootを学ばなければならなかったので、終了するのに約1週間かかりました(注釈「 @ 」がたくさんあります) 」やその他のクールな学習方法)、JPA、および途中でHibernate。

    この魔法はすべて、主にアノテーションによって行われます。 (「 @ ”記号)SpringBootで使用されます。

    SpringBootMavenプロジェクトの作成

    このリンクを使用して、SpringBootMavenプロジェクトアプリケーションを作成しましょう。

    メイヴン 」は、依存関係管理を管理するために使用されるプロジェクト管理ツールです。 Node Package Manager( NPM )と同じです )JS開発環境で。

    NodeJSにpackage.jsonがあります 依存関係の管理とSpringBootのpom.xml 依存関係管理用。

    グループには、好きな名前を書いてください。通常、組織のドメイン名は右から左に書かれています。

    たとえば、ドメイン名はwww.javaAPI.comであるため、グループ名は com.javaAPI.wwwになります。

    次に、アーティファクトに必要なフォルダの名前を入力します 。

    右側に、次の依存関係を追加します。

    1. WEB — Springの依存関係を使用する(Webアプリケーションの開発に使用されるSpring Bootの古いフレームワーク)
    2. JPA — Java Persistence API
    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:run

    ポート8080でWebブラウザで実行されているローカルホストを確認してください。まだ何もしていないため、空白に見えます。

    ファイルとそのタグを調べてみましょう

    pom.xmlファイルを見ると、MySQL、JPA、WebなどのSpringInitializeでアプリケーションを作成するときに設定した依存関係が内にあることに気付くかもしれません。 cy>タグ。

    スターターとテスターの依存関係は、サーバーで提供するSpringBootアプリケーションを作成するためのコアです。

    それでは、メインファイルである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);
       }
    }

    ここで、パッケージの名前はコードの最初の行にあります。そのパッケージ名を使用して、任意のクラス、メソッド、またはインスタンスを別のパッケージファイルにインポートできます。

    その後、2つのモジュールが「org.springframework.boot」パッケージからインポートされます。

    1. SpringApplication
    2. SpringBootApplication

    SpringブートはSpringの最新のアプリケーション開発フレームワークであるため、Springアプリケーションのパッケージとその特定のパッケージが必要です。

    その後、 @SpringBootApplication 注釈が使用されます。このアノテーションは、Springで使用されるアノテーションで構成されています:

    1. @Component —次のクラスは、アプリケーション全体をコンパイルするときに含める必要のあるコンポーネントであることをコンパイラに通知します。
    2. @ComponentScan —これは、次のJavaクラスで使用するパッケージのスキャンを実行します。
    3. @EnableAutoConfiguration — Spring Bootの自動構成メカニズムが、SpringBootを実行するための重要なモジュールをインポートできるようにします。

    これらは、SpringBootアプリケーションを起動してサーバー上で実行するために使用されるアノテーションです。

    これは私がJavaでの注釈とその使用について書いた記事です。

    データのモデルを作成しましょう

    書籍の詳細を保存、取得、更新、削除するためのModelクラスを作成しましょう。

    そのためには、モデルという名前の新しいパッケージを作成する必要があります その中に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 —IDがこのテーブルの主キー/識別キーであることを示します

    @NotBlank — これらの属性を空白にしないようにするために使用されます。

    それ以外に、JPAの習慣を満たすためのスーパーメソッドを持つ空のコンストラクターがあります。 getterメソッドとsetterメソッドは通常、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<Book, Long> {
    }

    JpaRepositoryをインポートしました BookRepositoryでそのリポジトリを使用するためのパッケージ 最近コーディングしたBookモデルを接続してCRUDを実行することでインターフェースを作成します 操作。

    これらのリポジトリには、CRUD操作を実行するための組み込みメソッドがすでに存在します。

    例:

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

    <>タグ内で、使用するモデル名と主キーのデータ型を取得します。

    @Repository :DAO(データアクセスオブジェクト)を示すために使用される注釈 )永続性レイヤーのコンポーネント。

    インターフェイスがリポジトリを使用してデータベースアクティビティを実行することをコンパイラに通知します。

    コントローラーの作成と例外処理

    コントローラー、という新しいパッケージを作成します および その中にBookController.javaを作成します エンドポイントを含むファイル。

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

    最初にインポートされたパッケージは、Book Not Found例外用です(ファイルを少し作成します)。

    ここで使用した注釈の説明:

    1. RestController: このアノテーションは、アノテーションが付けられたクラスのすべてのメソッドをドメインオブジェクトとして示すために使用されます。

    では、ドメインオブジェクトとは…?

    ドメインオブジェクト==ビジネスオブジェクトとだけ言っています。

    これらは通常、データベースからデータを取得するために提供するエンドポイントに関連するエンティティと値オブジェクトによって表されます。

    2.自動配線 :このアノテーションは、Beanクラスを自動的にワイヤリングするために使用されます。

    そのためには、「 Beanクラスとは..?」について知っておく必要があります。 」

    基本的に、Java Beanクラスは、多くのオブジェクトをカプセル化する単純なクラスです。

    これは私がJavaBeanクラスについて書いた記事です。

    以下は、CRUD操作を実行するためのエンドポイントのマッピングアノテーションです。

    3. GetMapping: これはインターフェースです これには、Getメソッドを実行するためのエンドポイントのパスが含まれています。このGetMappingインターフェースは、「path、value、params、headers」メソッドを持つことができるRequestMappingインターフェースを使用して、以前のSpringバージョンでGetメソッドを実行します。

    GetMappingを使用することで簡素化されました。

    4.ポストマッピング :これはインターフェース これには、Postメソッドを実行するためのエンドポイントのパスが含まれています。

    5. PutMapping: これはインターフェースです これには、Putメソッドを実行して更新するエンドポイントのパスが含まれています。

    6. DeleteMapping: これはインターフェースです これには、Deleteメソッドを実行するためのエンドポイントのパスが含まれています。

    最後の行で、おそらく「 ResponseEntity」に気づいたでしょう。 」キーワード。

    それとは …??

    これは、 HttpEntityを継承するJavaクラスです。 HTTP応答を操作するクラス。接続のリクエストが「OK」かどうか 」または問題がある場合は、例外をスローします HttpEntityから クラス。

    orElseThrow(): これは、Java8のオプションクラスにあるメソッドです。 これは、例外を処理するために導入されました。オプションのクラスは、オブジェクトの有無をチェックするためのさまざまなユーティリティメソッドを提供します。これは、NullPointerExceptionの処理に役立ちます。

    orElseThrow 存在する場合は値を返し、存在しない場合は例外を呼び出すメソッドです。

    そのようなbook_idがない場合にNotFoundExceptionを作成する

    orElseThrowメソッドがNotFound例外をスローするため。以下は、例外処理の部分です。 BookNotFoundException.javaを作成します 例外パッケージ内のファイル。

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

    作成されたクラスは、例外のスーパークラスを拡張します。コンストラクターで、book_idを渡して、例外を出力します。

    以上です…

    RESTAPIの部分が終了しました。これで、アプリをビルドして(パート1で説明しました)、Postmanでいくつかのテストを行うことができます。

    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

    それだけです。

    SpringBootで基本的なRESTAPIを構築しました。おめでとうございます!

    何か問題がある場合、または修正が必要な場合は、コメントセクションでお知らせください。

    Twitterで私に連絡してください。

    ハッピーコーディング!



    1. ExcelとAccess:切り替える時期はいつですか?

    2. SQLの完了。成功と失敗の物語

    3. ODBCドライバーはユーザーデータソースをサポートしていますか?

    4. PostgreSQL9.3でのスイッチオーバー/スイッチバックの実装。