Spring BootとJDBCでmysqlを更新するサンプルです。
(確認環境:Spring Boot 2.5,JDK 11,STS 4)
目次
SpringBootとJDBCでmysqlをinsert,update,deleteするサンプル
以下のURLにアクセスするとMySQLにupdate,insert,deleteしindex.htmlに値を表示します。
キー重複エラーの場合はロールバックされDB更新されません。
http://localhost:8765/test1
githubにコードがあります。
https://github.com/ut23405/springbootdb/tree/main/springboot-jdbc-mysql-upd
1.pom.xmlの設定
pom.xmlの設定です。以下をdependenciesの中に追加します。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
4行目は、JdbcTemplate等で必要です。
8行目は、mysqlのドライバです。
2.application.propertiesの設定
application.propertiesにDB情報を記述しています。
spring.datasource.url=jdbc:mysql://localhost:3309/testphp
spring.datasource.username=root
spring.datasource.password=
server.port = 8765
1行目のtestphpはデータベース名です。ポート番号はmysqlで使用している値を指定します。
3.DTOのクラス(SyainDto.java)
Syainデータを格納します。
package com.example.test1;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class SyainDto {
private int id;
private String name;
private String romaji;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
7,8行目は、lombokのアノテーションです。
@Dataは、getterとsetterの記述を省略できます。
@AllArgsConstructorは、全項目のコンストラクタを生成します。
13,14行目は、LocalDateTime型です。MySQLの列のデータ型はdatetime型です。
4.サービスのクラス(SyainService.java)
package com.example.test1.service;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.example.test1.SyainDto;
import com.example.test1.repository.SyainRepository;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class SyainService {
private final SyainRepository syainRepository;
@Transactional
public void updateData() {
// 登録データの作成
List<SyainDto> syainList = new ArrayList<>();
LocalDateTime dateTimeNow = LocalDateTime.now();
syainList.add(new SyainDto(
1, "鈴木", "suzuki",dateTimeNow,dateTimeNow));
syainList.add(new SyainDto(
2, "田中", "tanaka",dateTimeNow,dateTimeNow));
syainList.add(new SyainDto(
3, "佐藤", "sato",dateTimeNow,dateTimeNow));
syainRepository.updateSyain(); // 更新
syainRepository.insertSyain(syainList); // 登録
syainRepository.deleteSyain(syainList.get(0)); // 削除
}
}
17行目の@Transactionalアノテーションは、トランザクションを行います。
DB更新で例外が発生したときはロールバックします。
try-catchはここでは行っていません。呼び出し元で行っています。
5.レポジトリのクラス(SyainRepository.java)
レポジトリのクラスです。SQLを実行します。
package com.example.test1.repository;
import java.util.List;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.example.test1.SyainDto;
import lombok.RequiredArgsConstructor;
@Repository
@RequiredArgsConstructor
public class SyainRepository {
private final JdbcTemplate jdbcTemplate;
public void insertSyain(List<SyainDto> syainList) {
for (SyainDto syain : syainList) {
jdbcTemplate.update(
"INSERT INTO syain"
+ "(id,name,romaji,created_at,updated_at) "
+ "Values(?,?,?,?,?)",
syain.getId(), syain.getName(),syain.getRomaji(),
syain.getCreatedAt(),syain.getUpdatedAt());
}
}
public void updateSyain() {
jdbcTemplate.update(
"UPDATE syain SET name = ? ,romaji = ? where id = ?",
"testName", "testRomaji", 2);
}
public void deleteSyain(SyainDto syainList) {
jdbcTemplate.update("DELETE FROM syain where id = ?" ,
syainList.getId());
}
}
public int update(String sql,@Nullable Object... args) throws DataAccessException |
jdbcTemplateのupdateメソッドでSQLを実行します。戻り値は更新した件数です。
クエスチョンマーク(?)は、プレースホルダです。パラメータで値を設定します。
入力される不正な文字を抑止できるのでSQLインジェクション対策になります。
6.コントローラのクラス(MainController.java)
package com.example.test1;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.example.test1.service.SyainService;
import lombok.RequiredArgsConstructor;
@Controller
@RequiredArgsConstructor
public class MainController {
private final SyainService syainService;
@GetMapping("/test1")
public String write1(Model model) {
try {
syainService.updateData();
}catch(Exception e) {
System.out.println(e);
}
return "test1/index";
}
}
6.ビューのファイル(index.html)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8">
<title>check</title>
</head>
<body >
OK
</body>
</html>
登録完了後に文字のOKが表示されます。
実行結果
id | name | romaji | created_at | updated_at |
---|---|---|---|---|
2 | 田中 | tanaka | 2022/01/11 12:16:05 | 2022/01/11 12:16:05 |
3 | 佐藤 | sato | 2022/01/11 12:16:05 | 2022/01/11 12:16:05 |
MySQLのcreated_atとupdated_atはDATETIME型でJavaはLocalDateTime型です。
それぞれの項目には秒まで入ります。
関連の記事