Spring-Data-JPA試食:CRUD+ページングバックグラウンドの迅速な構築

13158 ワード

前言:以前はHibernateのフレームワークに触れたことがないので、最近いくつかのブログを見てその“効率”に深く引きつけられて、だからみんなと一緒に1つの簡単な例を持ってSpringの家族の桶の中で持つJPAの新鮮さを味わいにきます
Spring-DATA-JPA概要
JPA(Java Persistence API)は、Sunが公式に提案したJava永続化仕様である.Java開発者には、Javaアプリケーションの関係データを管理するオブジェクト/関連マッピングツールが用意されています.彼の出現は主に既存の持続化開発作業を簡素化し、ORM技術を統合し、現在のHibernate、TopLink、JDOなどのORMフレームワークがそれぞれ運営されている局面を終わらせるためだ.なお、JPAは、既存のHibernate、TopLink、JDOなどのORMフレームワークを十分に吸収した上で発展したもので、使いやすく、伸縮性が強いなどの利点がある.現在の開発コミュニティの反応から見ると、JPAはSpringとEJB 3.0の開発チームを含む大きな支持と称賛を受けている.
注意:JPAは1セットの規範で、1セットの製品ではありませんて、それではHibernateのようで、TopLink、JDO彼らは1セットの製品で、もしこれらの製品がこのJPAの規範を実現したと言ったら、私达は彼らをJPAの実現の製品のために呼ぶことができます.
Spring Data JPAは、SpringがORMフレームワーク、JPA仕様に基づいてカプセル化されたJPAアプリケーションフレームワークであり、開発者が極めて簡単なコードでデータへのアクセスと操作を実現することができる.追加削除や検索などの一般的な機能を提供し、拡張しやすい!Spring Data JPAの学習と使用により、開発効率が大幅に向上します.(spring data jpaはDAO層の動作を解放し,基本的にすべてのCRUDがそれに依存して実現できる)
springboot(五):spring data jpaの使用——純潔な微笑み
HibernateとMyBatisの簡単な比較
JPAの下で働いているのはHibernateの枠組みですが、私たちが以前学んだのはMyBatisに関するものだけなので、試食する前に両者の違いを簡単に理解する必要があります.
Hibernateのメリット:
  • HibernateのDAO層の開発はMyBatisより簡単で、MybatisはSQLと結果マッピングを維持する必要がある.
  • HibernateオブジェクトのメンテナンスとキャッシュはMyBatisよりも良く、削除・変更したオブジェクトのメンテナンスに便利です.
  • Hibernateデータベースの移植性はとても良くて、MyBatisのデータベースの移植性はよくなくて、異なるデータベースは異なるSQLを書く必要があります.
  • Hibernateは、サードパーティキャッシュを使用できるより良い2次キャッシュメカニズムを備えています.MyBatis自体が提供するキャッシュメカニズムはよくありません.

  • MyBatisのメリット:
  • MyBatisは、より詳細なSQL最適化を行い、クエリーフィールドを削減できます.
  • MyBatisは把握しやすいが、Hibernateは敷居が高い.

  • 簡単なまとめ:
  • MyBatis:コンパクト、便利、高効率、簡単、直接、半自動化
  • Hibernate:強力、便利、高効率、複雑、間接、全自動化
  • 引用自:【永続化フレームワーク】MybatisとHibernateの詳細な比較——ハイライト
    CRUD+ページングバックグラウンドインスタンス
    次に、Spring-DATA-JPAを使用したCRUD+ページングバックグラウンドのインスタンスを迅速に構築し、RESTful APIに直接使用します(よく知らない学生はここをスタンプします)
    ステップ1:SpringBootプロジェクトの新規作成
    IDEAを開いてSpringBootプロジェクトを新規作成します.SpringBootに詳しくない学生は右に曲がってください.【転送ドア】をクリックし、pom.xmlに次の依存を追加します.
    
    
        mysql
        mysql-connector-java
        5.1.21
    
    
    
    
        org.springframework.boot
        spring-boot-starter-data-jpa
    

    そしてアプリケーション・propertiesをこのようにします.
    #   
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?useUnicode=true&characterEncoding=utf-8
    spring.datasource.username=root
    spring.datasource.password=123456
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.jpa.properties.hibernate.hbm2ddl.auto=update
    #  SQL  
    spring.jpa.show-sql=true
    #           MyISAM      
    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    #        ,    utf8  
    spring.jpa.properties.hibernate.dialect=com.wmyskxz.demo.config.MySQLConfig
    spring.jpa.properties.hibernate.hbm2ddl.autoはhibernateの構成プロパティであり、データベース・テーブル構造の自動作成、更新、検証が主な役割を果たします.このパラメータのいくつかの構成は次のとおりです.
  • create:hibernateをロードするたびに、前回生成したテーブルを削除し、モデルクラスに基づいて新しいテーブルを再生成します.2回も変更がなくても、データベース・テーブルのデータが失われる重要な原因です.
  • create-drop:hibernateをロードするたびにmodelクラスに基づいてテーブルが生成されますが、sessionFactoryが閉じると自動的にテーブルが削除されます.
  • update:最も一般的なプロパティで、hibernateを最初にロードするとmodelクラスに基づいてテーブルの構造が自動的に確立され(データベースが先に確立されていることを前提として)、その後hibernateをロードするとmodelクラスに基づいてテーブル構造が自動的に更新され、テーブル構造が変更されてもテーブルのローは削除されません.サーバに配備されると、テーブル構造はすぐに確立されず、アプリケーションが最初に実行されるまで待たないことに注意してください.
  • validate:hibernateをロードするたびに、データベース・テーブル構造の作成を検証します.データベース内のテーブルと比較するだけで、新しいテーブルは作成されませんが、新しい値が挿入されます.

  • 次に、「config」パッケージを新規作成し、「MySQLConfig」クラスを作成します(上のspring.jpa.properties.hibernate.dialectプロパティは、ここのクラスのフルパスを構成します):
    package com.wmyskxz.demo.config;
    
    import org.hibernate.dialect.MySQL5InnoDBDialect;
    
    public class MySQLConfig extends MySQL5InnoDBDialect {
        @Override
        public String getTableTypeString() {
            return "ENGINE=InnoDB DEFAULT CHARSET=utf8";
        }
    }

    ステップ2:必要なデータベースを作成する
    SQLサービスを開くと、テーブル文を作成するのも簡単です.
    create database testdb;

    ステップ3:エンティティークラスの作成
    エンティティークラスマッピングは、実際にはデータベース・テーブルの構造であり、適切なパッケージ・ディレクトリ(entityなど)でエンティティー・クラスを作成します.
    package com.wmyskxz.demo.entity;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity //         
    public class User {
    
        @Id //          
        @GeneratedValue //    
        private long id;
        @Column(nullable = false, unique = true)    //      ,    
        private String username;
        @Column(nullable = false)   //      
        private String password;
    
        // getter and setter
    }

    ステップ4:DAO層
    [Repository]パッケージを新規作成し、[UserRepository]インタフェースを新規作成し、JpaRepositoryクラスを継承します.
    package com.wmyskxz.demo.repository;
    
    import com.wmyskxz.demo.entity.User;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    public interface UserRepository extends JpaRepository {
    }

    JpaRepositoryを継承するには、2つのパラメータを入力する必要があります.1つはエンティティクラスUserです.1つはプライマリ・キーのタイプLongです.JpaRepositoryクラスを継承すると、追加削除やデフォルトでサポートされているPageableオブジェクトを使用してページを分割するなど、多くの組み込み方法が自動的に実装されます.デフォルトの方法は、次のようになります.
    public interface JpaRepository extends PagingAndSortingRepository, QueryByExampleExecutor {
        List findAll();
        List findAll(Sort var1);
        List findAllById(Iterable var1);
         List saveAll(Iterable var1);
        void flush();
         S saveAndFlush(S var1);
        void deleteInBatch(Iterable var1);
        void deleteAllInBatch();
        T getOne(ID var1);
         List findAll(Example var1);
         List findAll(Example var1, Sort var2);
    }

    ステップ5:Controllerレイヤ
    新しい[コントローラ]パッケージを作成し、新しい[UserController]クラスを作成し、簡単な削除変更コードを作成します.
    package com.wmyskxz.demo.controoler;
    
    import com.wmyskxz.demo.entity.User;
    import com.wmyskxz.demo.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.domain.PageRequest;
    import org.springframework.data.domain.Sort;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.Optional;
    
    @RestController //       Controller   JSON  
    public class UserController {
        @Autowired
        private UserRepository userRepository;
    
        @GetMapping("/getOne")
        public Optional getOneUserById(@RequestParam long id) {
            return userRepository.findById(id);
        }
    
        @GetMapping("/all")
        public Iterable getAllUsers(@RequestParam(value = "page", defaultValue = "0") int page,
                                          @RequestParam(value = "size", defaultValue = "5") int size) {
            page = page < 0 ? 0 : page;//   page       0,              
            Sort sort = new Sort(Sort.Direction.DESC, "id");//  id    
            return userRepository.findAll(new PageRequest(page, size, sort));
        }
    
        @PostMapping("/add")
        public String addUser(@RequestParam String username,
                              @RequestParam String password) {
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            userRepository.save(user);//      save
            return "Saved";
        }
    
        @DeleteMapping("/delete")
        public String deleteUserById(@RequestParam long id) {
            userRepository.deleteById(id);
            return "Deleted";
        }
    
        @PutMapping("/update")
        public String updateUser(User user) {
    //        User user = new User();
    //        user.setId(id);
    //        user.setUsername(username);
    //        user.setPassword(password);
            userRepository.save(user);
            return "Updated";
        }
    }

    JpaRepositoryを継承したUserRepositoryインタフェースを直接@Autowiredで自動的に導入しました.デフォルトの方法では、Spring Dataライブラリで定義されているインタフェースであるPageableオブジェクトがgetAllUsers(...)メソッドに転送されます.すべてのページング関連情報の抽象であり、このインタフェースによって、ページング関連のすべての情報(例えばfindAll()pageNumberなど)を得ることができ、これによりJpaはPageableパラメータによってページング情報付きSql文を得ることができる.
    もちろん上は自分でPageableオブジェクトを作成しましたが、Springは直接Pageableオブジェクトを取得することもサポートしています.上のpageSizeの方法を次のように書き換えることができます.
    @GetMapping("/all")
    public Iterable getAllUsers(@PageableDefault(value = 5, sort = {"id"}, direction = Sort.Direction.DESC) 
                                                  Pageable pageable) {
        return userRepository.findAll(pageable);
    }

    デフォルトは0ページ目から、上と同じpageパラメータを自分で入力することもできます.
    ステップ6:プロジェクトの実行
    Spring BootとJPAのRESTスタイルに基づくバックグラウンドの削除変更の例を迅速に構築しました.プロジェクトを実行すると、データベースが自動的にいくつかのテーブルを作成していることがわかります.
    JPAが作成してくれたuserテーブルの作成SQLは以下の通りです.
    CREATE TABLE `user` (
      `id` bigint(20) NOT NULL,
      `password` varchar(255) NOT NULL,
      `username` varchar(255) NOT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `UK_sb8bbouer5wak8vyiiy4pf2bx` (`username`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    RESTテストツールを使用してテスト
    私たちの要求に完全に合って、それから私たちはいくつかのRESTのテストツールを使って、上の機能が正しく運行できるかどうかをテストして、例えば私がここで使っている「Restlet Client」はChromeショップでダウンロードすることができます.getAllUsers(...)アドレステスト:
    まず/allアドレスをテストしますが、データベースが空なので、次のように返されます.
    {
        "content": [
        ],
        "pageable": {
            "sort": {
                "sorted": true,
                "unsorted": false,
                "empty": false
            },
            "offset": 0,
            "pageNumber": 0,
            "pageSize": 5,
            "unpaged": false,
            "paged": true
        },
        "totalElements": 0,
        "last": true,
        "totalPages": 0,
        "number": 0,
        "size": 5,
        "sort": {
            "sorted": true,
            "unsorted": false,
            "empty": false
        },
        "numberOfElements": 0,
        "first": true,
        "empty": true
    }

    ユーザーテストの追加:
    次に、http://localhost:8080/allアドレスを使用して、類似のユーザー情報をいくつか追加します.
    正しいhttp://localhost:8080/add?username=wmyskxz&password=123を返すメッセージが表示されます.Savedアドレステスト:
    先ほど追加したユーザーを取得するには、/getOneを直接使用します.正しいデータが返されます.
    {
        "id": 1,
        "username": "wmyskxz",
        "password": "123"
    }

    ユーザーテストの変更:
    次に、http://localhost:8080/getOne?id=1を使用して、ユーザーパスワードの変更をシミュレートします.
    正しい更新情報http://localhost:8080/update?id=1&username=wmyskxz&password=123456を見ることができ、再びユーザーに問い合わせても、正しいデータを見ることができます.
    {
        "id": 1,
        "username": "wmyskxz",
        "password": "123456"
    }

    ページングテスト:
    追加機能を使用して、データベースに5つ以上のデータを追加し、検索Updatedを行います.
    返されるJSONデータは次のとおりです.
    {
        "content": [
            {
                "id": 10,
                "username": "wmyskxz8",
                "password": "123"
            },
            {
                "id": 9,
                "username": "wmyskxz7",
                "password": "123"
            },
            {
                "id": 8,
                "username": "wmyskxz6",
                "password": "123"
            },
            {
                "id": 7,
                "username": "wmyskxz5",
                "password": "123"
            },
            {
                "id": 6,
                "username": "wmyskxz4",
                "password": "123"
            }
        ],
        "pageable": {
            "sort": {
                "sorted": true,
                "unsorted": false,
                "empty": false
            },
            "offset": 0,
            "pageNumber": 0,
            "pageSize": 5,
            "unpaged": false,
            "paged": true
        },
        "totalElements": 9,
        "last": false,
        "totalPages": 2,
        "number": 0,
        "size": 5,
        "sort": {
            "sorted": true,
            "unsorted": false,
            "empty": false
        },
        "numberOfElements": 5,
        "first": true,
        "empty": false
    }

    ユーザーテストの削除:
    アドレス/allを使用してID 1のユーザーを削除します.id情報が正しく表示され、データが削除されたことが表示されます.
    以上、CRUD+ページングのバックグラウンドの例を迅速に作成し、比較的流行しているRESTfulスタイルを使用して、JPAの便利さをざっと感じました.やはり爽やかです.複雑なMapperファイルはありません.自動的に実体を生成する必要はありません.SQLを気にしないで、論理的に集中すればいいだけです.実は简単に使うと以上のものもよくあるシーンに対応できるので、后でもっと深く理解してみましょう.
    参考資料:springboot(五):spring data jpaの使用——純潔な微笑springboot(十五):springboot+jpa+thymeleaf添削改査例——純潔な微笑Spring BootでSpring-data-jpaを使用してデータアクセスをより簡単に、より優雅にする——プログラム猿DD
    転載を歓迎して、転載して出典を明記してください!简书ID:@私は3つの心臓githubがありません:wmyskxz公衆の微信号に注目することを歓迎します:wmyskxzは自分の学習&学習資料を分かち合います&生活は交流したい友达もqq群を加えることができます:3382693