Spring Boot 再入門 (3)

2024.08.05

16

こんにちは!原です!

前回作成した users テーブルに対する

CRUD を作成していきます。

CRUD 実装

Users Entity の作成

src/main/java/com/example/user/entityUsers Entity を作成します。

パッケージが user.entity に変わっていますので、注意してください。

JPAにおいて、@GeneratedValueを使って主キーにユニークな値を自動で生成し、@Idを持つフィルドに適用できます。

package com.example.user.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;

@Entity
public class Users {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters and Setters
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

User リポジトリの作成

src/main/java/com/example/user/repository ディレクトリに UsersRepository インターフェースを作成します。

package com.example.user.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import com.example.user.entity.Users;

public interface UsersRepository extends JpaRepository<Users, Long> {
}

Users Service の作成

src/main/java/com/example/users/service ディレクトリに UsersService クラスを作成します。

package com.example.user.service;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.user.entity.Users;
import com.example.user.repository.UsersRepository;

@Service
public class UsersService {

    @Autowired
    private UsersRepository usersRepository;

    public List<Users> findAll() {
        return usersRepository.findAll();
    }

    public Optional<Users> findById(Long id) {
        return usersRepository.findById(id);
    }

    public Users save(Users user) {
        return usersRepository.save(user);
    }

    public void deleteById(Long id) {
        usersRepository.deleteById(id);
    }
}


ポイント:@Service をつけると、Spring Boot がオブジェクトをサービスクラスとして管理してくれます。

@Service
public class UsersService {

ポイント:@Autowired で interface の依存関係を注入しています。

    @Autowired
    private UsersRepository usersRepository;

Users コントローラーの作成

src/main/java/com/example/user/controller ディレクトリに UsersController クラスを作成します。

package com.example.user.controller;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.user.entity.Users;
import com.example.user.service.UsersService;

@RestController
@RequestMapping("/users")
public class UsersController {

    @Autowired
    private UsersService usersService;

    @GetMapping
    public List<Users> getAllUsers() {
        return usersService.findAll();
    }

    @GetMapping("/{id}")
    public ResponseEntity<Users> getUserById(@PathVariable Long id) {
        Optional<Users> user = usersService.findById(id);
        return user.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build());
    }

    @PostMapping(consumes = {"application/json"})
    public ResponseEntity<Users> createUser(@RequestBody Users user) {
        Users savedUser = usersService.save(user);
        return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);
    }

    @PutMapping("/{id}")
    public ResponseEntity<Users> updateUser(@PathVariable Long id, @RequestBody Users userDetails) {

        Optional<Users> optionalUser = usersService.findById(id);

        if (optionalUser.isPresent()) {
            Users user = optionalUser.get();
            user.setName(userDetails.getName());
            user.setEmail(userDetails.getEmail());
            Users updatedUser = usersService.save(user);
            return ResponseEntity.ok(updatedUser);
        } else {
            return ResponseEntity.notFound().build();
        }
    }

    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
        usersService.deleteById(id);
        return ResponseEntity.noContent().build();
    }
}


ポイント:@RestController をつけると、Spring Boot がオブジェクトをRestControllerクラスとして管理してくれます。

ポイント:@RequestMapping("/users") をつけると、http://localhost:8080/users のパスを定義したことになります。

@RestController
@RequestMapping("/users")
public class UsersController {


ポイント:@Autowired で Service Class の依存関係を注入しています。

    @Autowired
    private UsersService usersService;


ポイント:Optional 内の実際の Users オブジェクトを取得するために get メソッドを利用しています。

        Optional<Users> optionalUser = usersService.findById(id);
......
            Users user = optionalUser.get();


Application クラスの作成

src/main/java/com/example/user/UsersApplication.java に以下のようなクラスを実装します。

実行

IDEで UsersApplication クラスを右クリックして「Run」を選択するか、ターミナルから以下のコマンドを実行します。

./gradlew bootRun


実行されたら http://localhost:8080/users にアクセスします。

レスポンスが返ってきたら成功です。

この記事をシェアする