Spring Bootのフォームとエンティティ(DTO)で連携してDBのMySQLに登録するサンプルです。
(確認環境:Spring Boot 2.5,JDK 11,STS 4)
目次
フォームとエンティティ(DTO)で連携してDBに登録する
SyainDto.Javaがエンティティ(DTO)で、SyainForm.javaがフォームです。
以下の流れです。
1.画面で値を入力してsubmitする
2.「フォーム」に値がセットされる
3.「フォーム」の値が「エンティティ」にセットされる
4.「エンティティ」の値でデータベース(MySQL)に登録される
以下のURLでアクセスします。
http://localhost:8765/test1/
githubにコードがあります。
https://github.com/ut23405/springboot/tree/master/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/update}" th:object="${syainForm}">
<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="${syainForm}"のオブジェクト名を記述しない場合は、
9,10行目を"syainForm.id","syainForm.name"(オブジェクト名.フィールド名)とします。
9行目のth:field="*{id}"は展開されて id="id" name="id" value=""になります。
10行目のth:field="*{name}"も展開されて id="name" name="name" value=""になります
2.フォームのクラス(SyainForm.java)
package com.example.test1;
public class SyainForm {
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.エンティティ(DTO)のクラス(SyainDto.java)
package com.example.test1;
public class SyainDto {
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.test1;
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;
import com.example.test1.repository.SyainRepository;
@Controller
@RequestMapping("/test1")
public class MainController {
private final SyainRepository syainRepository;
public MainController(SyainRepository syainRepository) {
this.syainRepository = syainRepository;
}
@GetMapping()
public String disp1(Model model) {
model.addAttribute("syainForm", new SyainForm());
return "test1/index";
}
@PostMapping("/update")
public String disp2(SyainForm syainForm) {
SyainDto syain = new SyainDto();
syain.setId(syainForm.getId());
syain.setName(syainForm.getName());
syainRepository.insertSyain(syain);
return "redirect:/test1/";
}
}
20行目からは初回アクセス時の画面を表示で21行目はフォームを紐付けています。
26行目以降は、ビューの画面で送信ボタン押下時に実行されます。
26行目のsyainFormに画面で入力された値があります。
27行目は、エンティティのインスタンスを作成します。
28,29行目は、フォームから値を取得し、エンティティにセットしています。
30行目は、レポジトリで登録処理を行います。
31行目は、リダイレクトでフォームの値の二重送信を防止しています(PRGパターン)。
PRGパターンとは
PRGとは、Post-Redirect-Getの略です。
Post後の処理でRedirectを行いGetの応答として返却します。
更新処理後に画面を再読み込み(Getになる)しても更新処理が行われない作りです。
5.レポジトリのクラス(SyainRepository.java)
レポジトリのクラスです。SQLを実行します。
package com.example.test1.repository;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.example.test1.SyainDto;
@Repository
public class SyainRepository {
private final JdbcTemplate jdbcTemplate;
public SyainRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void insertSyain(SyainDto syain) {
jdbcTemplate.update("INSERT INTO syain(id,name) Values(?,?)",
syain.getId(),syain.getName());
}
}
15行目は、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
関連の記事