こんにちは。くまごろーです。
日にちがあきましたが、今回は先日作った記事
【SpringBoot】Spring Data JPAを使ってDBに接続する - くまごろーのプログラミングメモ
の続きとして、webページに入力した値をDBに登録する部分を作ろうと思います。
今回も、使用するDBは「H2 Database」です。
入力画面で任意のコメントを打ち込むと
このようにコメントが登録・表示されるシンプルなアプリです。
1 使用するスターター
・ Spring Boot DevTools
・ Lombok
・ Spring Data JPA
・ H2 Database
・ Spring Web
※ 前回と同様
2 手順
ちなみに、今回のディレクトリ階層は以下の通りです。
(1)modelクラスを作成(前回とほぼ同様です)
<src/main/java/com.example.demo.model.Post.java>
package com.example.demo.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.validation.constraints.Size; import javax.validation.constraints.NotBlank; import lombok.Getter; import lombok.Setter; @Getter @Setter @Entity public class Post{ @Id @GeneratedValue private Long id; @NotBlank @Size(max = 40) private String comment; }
(2)Controllerクラスを作成する
<src/main/java/com.example.demo.controller.PostController.java>
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import com.example.demo.model.Post; import com.example.demo.repository.CommentRepository; import lombok.RequiredArgsConstructor; @Controller @RequiredArgsConstructor //コンストラクタを自動生成する(repositoryのDIコンストラクタを省略できる) public class PostController { //repositoryのDI private final CommentRepository repository; @GetMapping("/") public String getAllComments(@ModelAttribute Post post, Model model) { //JpaRepositoryで自動実装されるメソッド model.addAttribute("posts", repository.findAll()); return "list"; } @PostMapping("/submit") public String addComment(@Validated @ModelAttribute Post post, BindingResult result, Model model) { model.addAttribute("posts", repository.findAll()); //エラーが起こればlistページへ遷移 if(result.hasErrors()) { return "list"; } repository.save(post); //ルートパスにリダイレクト return "redirect:/"; } }
(3)Repositoryクラスを作成する
JpaRepositoryを継承するだけで、DBの取得や値の保存などの機能が使えるようになる。(メソッドが自動実装される。)
主なメソッドは以下の通り
プレフィックス | 意味 | 例 | |
---|---|---|---|
find...By | 対象を検索する | Account findByName(String name); | |
count...By | 対象の数をカウントする | int countByPost(String post); | |
exists...By | 存在する場合、trueを返す | boolean existsById(int id); | |
delete...By | 該当したものを削除 | @Transactional void deleteByName(String name); |
また、「And」「Or」等のキーワードを使うと、多彩なクエリを実現できる。
詳細はこちらの記事が参考になります。
【Spring Data JPA】自動実装されるメソッドの命名ルール - Qiita
<src/main/java/com.example.demo.repository.PostRepository.java>
package com.example.demo.repository; import org.springframework.data.jpa.repository.JpaRepository; import com.example.demo.model.Post; public interface PostRepository extends JpaRepository<Post, Long> { }
(4)Viewファイルを作成
<src/main/resorces/templates/list.html>
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>一言コメントapp</title> </head> <body> <h3>投稿する</h3> <form th:action="@{/submit}" th:object="${post}" method="post"> <label for="comment">コメント:</label> <input type="text" th:field="*{comment}"> <button>送信</button> <br> <small style="color: red" th:errors="*{comment}"></small> </form> <br> <h3>投稿一覧</h3> <div th:each="post : ${posts}" th:inline="text"> <div>[[${post.id}]] - [[${post.comment}]]</div> </div> </body> </html>