SpringBoot フォームとエンティティでDB登録

Spring Bootのフォームとエンティティで連携してDBのMySQLに登録するサンプルです。

目次

サンプル フォームとエンティティで連携してDBに登録する
  1.ビューのファイル(index.html)
  2.フォームのクラス(Test1Form.java)
  3.エンティティのクラス(Syain.java)
  4.コントローラのクラス(MainController.java)
  5.レポジトリのクラス(SyainRepository.java)
設定ファイル pom.xml / application.properties

フォームとエンティティで連携してDBに登録する

Syain.Javaがエンティティで、Test1Form.javaがフォームです。

流れは以下です。

1.画面で値を入力してsubmitする
2.「フォーム」に値がセットされる
3.「フォーム」の値が「エンティティ」にセットされる
4.「エンティティ」の値でデータベース(MySQL)に登録される

以下のURLでアクセスします。

http://localhost:8765/test1/

githubにコードがあります。
https://github.com/ut23405/springbootdb/tree/main/springboot-form-db

1.ビューのファイル(index.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>check</title>
</head>
<body >
<form method="post" th:action="@{/test1/testform}" th:object="${test1Form}">
<p><input type="text" th:field="*{id}"/></p>
<p><input type="text" th:field="*{name}"></p>
<p><input type="submit" value="送信ボタン"></p>
</form>
</body>
</html>

8行目のth:object="${test1Form}"(オブジェクト名)を記述しない場合は、
9,10行目を"test1Form.id","test1Form.name"(オブジェクト名.フィールド名)とします。
9行目のth:field="*{id}"は展開されて id="id" name="id" value=""になります。
10行目のth:field="*{name}"も展開されて id="name" name="name" value=""になります。

2.フォームのクラス(Test1Form.java)

package com.example.demo;

public class Test1Form {
	private Integer id;
	private String name;

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

4行目はIDで、5行目はnameです。

3.エンティティのクラス(Syain.java)

package com.example.demo;

public class Syain {
	private Integer id;
	private String name;

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

フォームと同じく4行目はIDで、5行目はnameです。

4.コントローラのクラス(MainController.java)

package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test1")
public class MainController {
    @Autowired
    private SyainRepository syainRepository;
    
    @GetMapping()
    public String disp1(
    		Model model) {
    	model.addAttribute("test1Form", new Test1Form());
        return "test1/index";
    }

    @PostMapping("/testform")
	public String disp2(Test1Form test1Form) {
		Syain syain = new Syain();
		syain.setId(test1Form.getId());	
		syain.setName(test1Form.getName());
		syainRepository.insertSyain(syain);
		return "redirect:/test1/";
	}
}

15行目からは初回アクセス時の画面を表示で18行目はフォームを紐付けています。
22行目以降は、ビューの画面で送信ボタン押下時に実行されます。
23行目にフォームで画面で入力された値があります。
24行目は、エンティティのインスタンスを作成します。
25,26行目は、フォームから値を取得し、エンティティにセットしています。
27行目は、レポジトリで登録処理を行います。
28行目は、リダイレクトでフォームの値の二重送信を防止しています(PRGパターン)。

PRGパターンとは

PRGとは、Post-Redirect-Getの略です。
Post後の処理でRedirectを行いGetの応答として返却します。
更新処理後に画面を再読み込み(Getになる)しても更新処理が行われない作りです。

 

5.レポジトリのクラス(SyainRepository.java)

レポジトリのクラスです。SQLを実行します。

package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class SyainRepository {
	private final JdbcTemplate jdbcTemplate;
	
	@Autowired
	public SyainRepository(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	public void insertSyain(Syain syain) {
		jdbcTemplate.update("INSERT INTO syain(id,name) Values(?,?)",
				syain.getId(),syain.getName());
	}
}

16行目は、insert文です。
クエスチョンマーク(?)は、プレースホルダです。パラメータで値を設定します。
入力される不正な文字を抑止できるのでSQLインジェクション対策になります。

pom.xml

必要なライブラリです。<dependencies>内にコピペします。

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jdbc</artifactId>
		</dependency>
		<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>

application.properties

application.propertiesにDB情報を記述します。DB情報は1~3行目です。

spring.datasource.url=jdbc:mysql://localhost:3309/testphp
spring.datasource.username=root
spring.datasource.password=
server.port = 8765

関連の記事

SpringBoot フォームの値を別画面に渡す
SpringBoot フォームで入力チェック(バリデーション)

△上に戻る