SpringBoot MySQL+JDBCでDB更新するサンプル

Spring BootとJDBCでmysqlを更新するサンプルです。
(確認環境:Spring Boot 2.5,JDK 11,STS 4)

目次

サンプル SpringBootとJDBCでmysqlをinsert,update,deleteするサンプル
  1.pom.xmlの設定
  2.application.propertiesの設定
  3.DTOのクラス(SyainDto.java)
4.サービスのクラス(SyainService.java)
  5.レポジトリのクラス(SyainRepository.java)
  6.コントローラのクラス(MainController.java)
  7.ビューのファイル(index.html)
  実行結果

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インジェクション対策になります。

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html#update-java.lang.String-java.lang.Object...-

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型です。
それぞれの項目には秒まで入ります。

関連の記事

SpringBoot MySQL+JDBCでselectするサンプル

△上に戻る