見出し画像

Spring Boot + DB2 を使った CRUD ハンズオン

いろいろな書籍をkindleで販売しております

Spring Boot + DB2 を使った CRUD ハンズオンを、
初心者でもそのまま動かせる完全版としてまとめています。


ゴール

  • DB2 に USERS テーブルを作成

  • Spring Boot で CRUD(Create / Read / Update / Delete)を実装

  • REST API として動かす

  • DB2 特有の書き方にも対応


前提

  • Spring Boot 3.x(IntelliJ で OK)

  • DB2(LUW / Docker / IBM Cloud どれでも可)

  • JDBC または Spring Data JPA どちらでも可能
    今回は Spring Data JPA で超簡単構築を採用。


【Step 0】DB2 にテーブルを作成

CREATE TABLE USERS (
    USER_ID INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    NAME VARCHAR(100) NOT NULL,
    EMAIL VARCHAR(200) NOT NULL UNIQUE,
    PHONE VARCHAR(20),
    CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

【Step 1】Spring Initializr の設定

Dependencies:

  • Spring Web

  • Spring Data JPA

  • DB2 JDBC Driver(IBM DB2)

  • Lombok

※ DB2 Driver は "com.ibm.db2:jcc" を追加する。


【Step 2】build.gradle / pom.xml

▼ pom.xml(Maven の場合)

<dependency>
    <groupId>com.ibm.db2</groupId>
    <artifactId>jcc</artifactId>
    <version>11.5.8.0</version>
</dependency>

🍀【Step 3】application.properties

spring.datasource.url=jdbc:db2://localhost:50000/testdb
spring.datasource.username=db2inst1
spring.datasource.password=password
spring.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver

spring.jpa.database-platform=org.hibernate.dialect.DB2Dialect
spring.jpa.hibernate.ddl-auto=none  # DBで事前に作成済
spring.jpa.show-sql=true

【Step 4】Entity(USERS)

package com.example.demo.entity;

import jakarta.persistence.*;
import lombok.Data;

@Data
@Entity
@Table(name = "USERS")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "USER_ID")
    private Integer id;

    @Column(name = "NAME", nullable = false)
    private String name;

    @Column(name = "EMAIL", nullable = false, unique = true)
    private String email;

    @Column(name = "PHONE")
    private String phone;
}

▶ DB2 の IDENTITY に対応するため GenerationType.IDENTITY を使用。


【Step 5】Repository(自動で CRUD を生成)

package com.example.demo.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.entity.User;

public interface UserRepository extends JpaRepository<User, Integer> {
}

▶ これだけで

  • insert

  • select

  • update

  • delete
    がすべて利用可能。


【Step 6】Service(任意)

package com.example.demo.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;

import java.util.List;

@Service
@RequiredArgsConstructor
public class UserService {

    private final UserRepository repo;

    public List<User> findAll() {
        return repo.findAll();
    }

    public User findById(Integer id) {
        return repo.findById(id).orElse(null);
    }

    public User create(User user) {
        return repo.save(user);
    }

    public User update(Integer id, User newUser) {
        return repo.findById(id)
                .map(user -> {
                    user.setName(newUser.getName());
                    user.setEmail(newUser.getEmail());
                    user.setPhone(newUser.getPhone());
                    return repo.save(user);
                }).orElse(null);
    }

    public void delete(Integer id) {
        repo.deleteById(id);
    }
}

【Step 7】REST Controller(CRUD API)

package com.example.demo.controller;

import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import lombok.RequiredArgsConstructor;

import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {

    private final UserService service;

    @GetMapping
    public List<User> getAll() {
        return service.findAll();
    }

    @GetMapping("/{id}")
    public User getOne(@PathVariable Integer id) {
        return service.findById(id);
    }

    @PostMapping
    public User create(@RequestBody User user) {
        return service.create(user);
    }

    @PutMapping("/{id}")
    public User update(@PathVariable Integer id, @RequestBody User user) {
        return service.update(id, user);
    }

    @DeleteMapping("/{id}")
    public void delete(@PathVariable Integer id) {
        service.delete(id);
    }
}

【Step 8】動作確認(curl / Postman)

▼ 全件取得

GET http://localhost:8080/api/users

▼ 新規登録

POST http://localhost:8080/api/users
Content-Type: application/json

{
  "name": "Yamada Taro",
  "email": "taro@example.com",
  "phone": "090-1111-2222"
}

▼ 更新

PUT http://localhost:8080/api/users/1
Content-Type: application/json

{
  "name": "Taro Updated",
  "email": "taro2@example.com",
  "phone": "090-0000-0000"
}

▼ 削除

DELETE http://localhost:8080/api/users/1

DB2 特有の注意点(Spring Boot)

いいなと思ったら応援しよう!