MENU

【SpringBoot】Spring JPAを利用し、投稿したツイートをDBに登録する

こんにちは。くまごろーです。
日にちがあきましたが、今回は先日作った記事

【SpringBoot】Spring Data JPAを使ってDBに接続する - くまごろーのプログラミングメモ

の続きとして、webページに入力した値をDBに登録する部分を作ろうと思います。
今回も、使用するDBは「H2 Database」です。
 

入力画面で任意のコメントを打ち込むと
f:id:kumaGoro_95:20201028173723p:plain
このようにコメントが登録・表示されるシンプルなアプリです。
f:id:kumaGoro_95:20201028173739p:plain
 
 
1 使用するスターター
 
・ Spring Boot DevTools
Lombok
・ Spring Data JPA
・ H2 Database
・ Spring Web
※ 前回と同様

 
 
2 手順

ちなみに、今回のディレクトリ階層は以下の通りです。
 
f:id:kumaGoro_95:20201028222045p:plain
 
 
(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>

 

 
3 参考
【Spring Data JPA】自動実装されるメソッドの命名ルール - Qiita