1概要


https://en.wikipedia.org/wiki/Java


Persistence

API[JPA]エンティティにCRUD機能を提供するhttps://www.baeldung.com/java-dao-pattern[DAO]レイヤーの実装は繰り返しが必要な場合があります。ほとんどの場合、回避したいタスクを消費します。

幸いなことに、https://www.baeldung.com/spring-boot[Spring Boot]は標準のJPAベースのCRUDリポジトリの層を通してCRUDアプリケーションを作成することを容易にします。

  • このチュートリアルでは、Spring Bootとhttps://www.baeldung.com/thymeleaf-in-spring-mvc[Thymeleaf]** を使用してCRUD Webアプリケーションを開発する方法を学習します。


2 Mavenの依存関係

この場合は、https://search.maven.org/search?q=a:spring-boot-starter-parentを利用します。

その結果、Javaのバージョンを上書きすることを除いて、

pom.xml

ファイルでプロジェクトの依存関係のバージョンを指定する必要はありません。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.6.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
</dependencies>
<properties>
    <java.version>1.8</java.version>
</properties>


  • spring-boot-starter-parent

    が定義するデフォルトのJavaバージョンは1.6であるため、

    <java.version>

    プロパティをオーバーライドする必要があります。**


3ドメイン層

プロジェクトの依存関係がすべて整ったら、今度は単純なドメイン層を実装しましょう。

わかりやすくするために、このレイヤーには

ユーザー

エンティティのモデリングを担当する1つのクラスを含めます。

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @NotBlank(message = "Name is mandatory")
    private String name;

    @NotBlank(message = "Email is mandatory")
    private String email;

   //standard constructors/setters/getters/toString
}


@ Entity

アノテーションを使用してクラスにアノテーションを付けたことに注意してください。 ** したがって、この場合はHibernateであるJPA実装は、ドメインエンティティに対してCRUD操作を実行することができます。 -5-spring[Hibernate 5 with Spring]。

さらに、

name

フィールドと

email

フィールドを

@ NotBlank

制約で制約しました。これは、データベース内のエンティティを永続化または更新する前に、制約付きフィールドを検証するためにHibernate Validatorを使用できることを意味します。

これに関する基本については、https://www.baeldung.com/javax-validation[Bean Validationに関する関連チュートリアル]をチェックしてください。


4リポジトリ層

この時点で、私たちのサンプルWebアプリケーションは何もしません。しかし、それは変わろうとしています。

Spring Data JPAにより、最小限の手間でJPAベースのリポジトリ(DAOパターン実装のための派手な名前)を実装することができます。


Spring Data JPA

は、Spring Bootの

spring-boot-starter-data-jpa

の重要なコンポーネントで、簡単に追加できます。 JPA実装の上に配置された強力な抽象化層によるCRUD機能。この抽象化層を使用すると、独自のDAO実装を最初から提供しなくても、永続層にアクセスできます。


User

オブジェクトに対する基本的なCRUD機能をアプリケーションに提供するには、

CrudRepository

インターフェースを拡張するだけです。

@Repository
public interface UserRepository extends CrudRepository<User, Long> {}

以上です!

CrudRepository

インターフェースを拡張するだけで、Spring Data JPAはリポジトリのCRUDメソッドの実装を提供します。


5コントローラレイヤ


  • spring-boot-starter-data-jpa

    が基礎となるJPA実装の上に置かれている抽象化レイヤのおかげで、基本的なWeb層を介して簡単にCRUD機能をWebアプリケーションに追加できます** 。

私たちの場合、GETとPOSTのHTTPリクエストを処理するには単一のコントローラクラスで十分であり、それを

UserRepository

実装への呼び出しにマッピングします。

コントローラクラスは、Spring MVCの主要機能の一部に依存しています。 Spring MVCの詳細なガイドについては、https://www.baeldung.com/spring-mvc-tutorial[Spring MVC tutorial]をご覧ください。

コントローラの

showSignUpForm()

メソッドと

addUser()

メソッドから始めましょう。

前者はユーザー登録フォームを表示しますが、後者は制約されたフィールドを検証した後にデータベース内に新しいエンティティを保持します。

エンティティが検証に合格しなかった場合は、申し込みフォームが再表示されます。そうでなければ、エンティティが保存されると、永続化エンティティのリストが対応するビューで更新されます。

@Controller
public class UserController {

    @GetMapping("/signup")
    public String showSignUpForm(User user) {
        return "add-user";
    }

    @PostMapping("/adduser")
    public String addUser(@Valid User user, BindingResult result, Model model) {
        if (result.hasErrors()) {
            return "add-user";
        }

        userRepository.save(user);
        model.addAttribute("users", userRepository.findAll());
        return "index";
    }

   //additional CRUD methods
}


__UserController内には、提供された

id

と一致する

User

エンティティをデータベースから取得する役割を果たす

showUpdateForm()__メソッドもあります。

エンティティが存在する場合は、更新フォームビューにモデル属性として渡されます。したがって、フォームに

name

フィールドと

email

フィールドの値を入力できます。

@GetMapping("/edit/{id}")
public String showUpdateForm(@PathVariable("id") long id, Model model) {
    User user = userRepository.findById(id)
      .orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id));

    model.addAttribute("user", user);
    return "update-user";
}

最後に、

UserController

クラス内に

updateUser()

メソッドと

deleteUser()

メソッドがあります。

最初のものは更新されたエンティティをデータベースに保持し、最後のものは与えられたエンティティを削除します。

どちらの場合でも、永続化されたエンティティのリストは適宜更新されます。

@PostMapping("/update/{id}")
public String updateUser(@PathVariable("id") long id, @Valid User user,
  BindingResult result, Model model) {
    if (result.hasErrors()) {
        user.setId(id);
        return "update-user";
    }

    userRepository.save(user);
    model.addAttribute("users", userRepository.findAll());
    return "index";
}

@GetMapping("/delete/{id}")
public String deleteUser(@PathVariable("id") long id, Model model) {
    User user = userRepository.findById(id)
      .orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id));
    userRepository.delete(user);
    model.addAttribute("users", userRepository.findAll());
    return "index";
}


6. ビューレイヤ

この時点で、

User

エンティティに対してCRUD操作を実行する機能コントローラクラスが実装されました。それでも、このスキーマにはまだ欠けているコンポーネントがあります:ビューレイヤです。


src/main/resources/templates

フォルダの下に、サインアップフォーム、更新フォームを表示し、永続化された

User

エンティティのリストをレンダリングするために必要なHTMLテンプレートを作成する必要があります。

導入部で述べたように、テンプレートファイルを解析するための基盤となるテンプレートエンジンとしてThymeleafを使用します。

これは

add-user.html

ファイルの関連セクションです。

<form action="#" th:action="@{/adduser}" th:object="${user}" method="post">
    <label for="name">Name</label>
    <input type="text" th:field="** {name}" id="name" placeholder="Name">
    <span th:if="${#fields.hasErrors('name')}" th:errors="** {name}"></span>
    <label for="email">Email</label>
    <input type="text" th:field="** {email}" id="email" placeholder="Email">
    <span th:if="${#fields.hasErrors('email')}" th:errors="** {email}"></span>
    <input type="submit" value="Add User">
</form>


  • name

    の値など、動的コンテンツをテンプレートに埋め込むためのフォームの

    action

    属性と

    $ \ {}

    変数式を指定するために

    @ \ {/adduser}

    URL式を使用したことに注意してください。

    email

    フィールドと検証後のエラー**


add-user.html

と同様、

update-user.html

テンプレートの外観は次のとおりです。

<form action="#" th:action="@{/update/{id}(id=${user.id})}" th:object="${user}" method="post">
    <label for="name">Name</label>
    <input type="text" th:field="** {name}" id="name" placeholder="Name">
    <span th:if="${#fields.hasErrors('name')}" th:errors="** {name}"></span>
    <label for="email">Email</label>
    <input type="text" th:field="** {email}" id="email" placeholder="Email">
    <span th:if="${#fields.hasErrors('email')}" th:errors="** {email}"></span>
    <input type="submit" value="Update User">
</form>

最後に、

index.html

ファイルがあります。このファイルには、既存のものを編集および削除するためのリンクとともに、永続化されたエンティティのリストが表示されます。

<div th:switch="${users}">
    <h2 th:case="null">No users yet!</h2>
        <div th:case="** ">
            <h2>Users</h2>
            <table>
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Email</th>
                        <th>Edit</th>
                        <th>Delete</th>
                    </tr>
                </thead>
                <tbody>
                <tr th:each="user : ${users}">
                    <td th:text="${user.name}"></td>
                    <td th:text="${user.email}"></td>
                    <td><a th:href="@{/edit/{id}(id=${user.id})}">Edit</a></td>
                    <td><a th:href="@{/delete/{id}(id=${user.id})}">Delete</a></td>
                </tr>
            </tbody>
        </table>
    </div>
    <p><a href="/signup">Add a new user</a></p>
</div>

わかりやすくするために、テンプレートはかなりスケルトンに見え、不要な機能を追加せずに必要な機能のみを提供します。

HTML/CSSにあまり時間をかけずにテンプレートの見栄えを良くするために、https://designrevision.com/のような無料のhttps://getbootstrap.com/[Twitter Bootstrap]UIキットを簡単に使用できます。ダウンロード/断片/[断片]。


7. アプリケーションの実行

最後に、アプリケーションのエントリポイントを定義しましょう。ほとんどのSpring Bootアプリケーションと同じように、これは普通の

main()

メソッドを使って実行できます。

@SpringBootApplication
public class Application {

    public static void main(String[]args) {
        SpringApplication.run(Application.class, args);
    }
}

それでは、IDEで「実行」をクリックしてからブラウザを開き、


http://localhost:8080


を指定します。

ビルドが正常にコンパイルされると** 新しいエンティティを追加したり既存のエンティティを編集したり削除したりするためのリンクを含む基本的なCRUDユーザダッシュボードが表示されます。


8結論

このチュートリアルでは、Spring BootとThymeleafを使って基本的なCRUD Webアプリケーションを構築する方法を学びました。

いつもどおり、この記事に示されているすべてのコードサンプルはhttps://github.com/eugenp/tutorials/tree/master/spring-boot-crud[on GitHub]から入手できます。