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

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

目次

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

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

http://localhost:8765/test1

githubにコードがあります。
https://github.com/ut23405/springbootdb/tree/main/springboot-jdbc-sqlserver-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/com.microsoft.sqlserver/mssql-jdbc -->
		<dependency>
			<groupId>com.microsoft.sqlserver</groupId>
			<artifactId>mssql-jdbc</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行目は、SQLServerのドライバです。

2.application.propertiesの設定

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

spring.datasource.url=jdbc:sqlserver://localhost\\SQLEXPRESS:1433;Database=testDB1;integratedSecurity=false;
spring.datasource.username=sa
spring.datasource.password=test1
server.port = 8765

SQLServer認証を指定しています。

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 Integer id;
    private String name;
    private String romaji;
    private Date createdAt;
    private Date updatedAt;
}

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

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

 

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

created_atとupdated_atはdatetime型です。

関連の記事

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

△上に戻る