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

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

目次

サンプル SpringBootとJDBCでPostgreSQLを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でPostgreSQLをinsert,update,deleteするサンプル

以下のURLにアクセスするとPostgreSQLにupdate,insert,deleteしindex.htmlに値を表示します。
キー重複エラーの場合はロールバックされDB更新されません。

http://localhost:8765/test1

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

1.pom.xmlの設定

pom.xmlの設定です。以下をdependenciesの中に追加します。

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jdbc</artifactId>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
		<dependency>
			<groupId>org.postgresql</groupId>
			<artifactId>postgresql</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等で必要です。
9行目は、PostgreSQLのドライバです。

2.application.propertiesの設定

application.propertiesにDB情報を記述しています。

spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/testdb10
spring.datasource.username=postgres
spring.datasource.password=postgres
server.port = 8765

1行目のtestdb10はデータベース名です。ポート番号はPostgreSQLで使用している値を指定します。

3.DTOのクラス(SyainDto.java)

Syainデータを格納します。

package com.example.test1;

import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class SyainDto {
    private int id;
    private String name;
    private String romaji;
    private Date createdAt;
    private Date updatedAt;
}

8,9行目は、lombokのアノテーションです。
@Dataは、getterとsetterの記述を省略できます。
@AllArgsConstructorは、全項目のコンストラクタを生成します。
13,14行目は、Date型です。PostgreSQLの列のデータ型はTIMESTAMP型です。

4.サービスのクラス(SyainService.java)

package com.example.test1.service;

import java.util.ArrayList;
import java.util.Date;
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<>();
		Date dateNow  = new Date();

		syainList.add(new SyainDto(
				1, "鈴木", "suzuki",dateNow,dateNow));
		syainList.add(new SyainDto(
				2, "田中", "tanaka",dateNow,dateNow));
		syainList.add(new SyainDto(
				3, "佐藤", "sato",dateNow,dateNow));

		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.337 2022/01/11 12:16:05.337
3 佐藤 sato 2022/01/11 12:16:05.337 2022/01/11 12:16:05.337

created_atとupdated_atはTIMESTAMP型です。
JavaではLocalDateTime型とDate型にしましたがそれぞれミリ秒まで入ります。

関連の記事

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

△上に戻る