【Java】Spring:「@Repository」の基本的な使い方(全件検索:FindAll)

■概要

「@Repository」は、データベース(DB)や外部ストレージにアクセスするクラスに付けるアノテーション。
Spring がこのクラスを データアクセス層の Bean として認識し、自動的に管理する。

機能説明
Bean登録Spring コンテナに自動登録され、DI(依存性注入)可能になる
意味付け「ここはDBアクセス層ですよ」と明示的にする
例外変換機能JDBCやJPAの例外をSpring独自のDataAccessExceptionに変換してくれる

■実装するサンプル処理の概要

GETのリクエストに対して、以下の処理を実装する。

メソッドURL(※)処理概要
GET/users/info/all「user情報テーブル」のデータを全て取得する
URLのドメインは「http://localhost:8080」

▼実行環境

実行環境は以下の通り

  • Java:バージョン21
  • Spring Boot:バージョン3.5.6
  • DB:h2database

■クラス図

実装する処理のクラス図は以下の通り。

■DBスキーマとデータ

参照するDBスキーマとデータを以下に示す。

・schema.sql

-- user情報テーブル
CREATE TABLE M_USER_INFO (
  id INT NOT NULL PRIMARY KEY,
  name VARCHAR(99),
  mailAddress VARCHAR(999)
);

・data.sql

INSERT INTO M_USER_INFO VALUES(1, 'hoge', 'hoge@example.com');
INSERT INTO M_USER_INFO VALUES(2, 'huga', 'huga@example.com');
INSERT INTO M_USER_INFO VALUES(3, 'piyo', 'piyo@example.com');

■サンプルコード

・UserController.java

package com.practice.annotation.anotools_spring.controller;

import com.practice.annotation.anotools_spring.dto.UserDTO;
import com.practice.annotation.anotools_spring.service.UserInfoService;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

// Webリクエストを受け取るクラス
@RestController
// メソッドの戻り値を「HTMLビュー」ではなく「JSON」などのレスポンスボディとして返す
@RequestMapping("/api")
@RequiredArgsConstructor
public class UserController {

  @Autowired
  private final UserInfoService userInfoService;

  @GetMapping("/users/info/all")
  public List<UserDTO> getAllUser() {
    return userInfoService.selectAllUser();
  }
}

・UserInfoService.java

package com.practice.annotation.anotools_spring.service;

import com.practice.annotation.anotools_spring.dto.UserDTO;
import java.util.List;

public interface UserInfoService {

  public List<UserDTO> selectAllUser();

}

・UserInfoServiceImpl.java

package com.practice.annotation.anotools_spring.service;

import com.practice.annotation.anotools_spring.dto.UserDTO;
import com.practice.annotation.anotools_spring.repository.UserRepository;
import java.util.List;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class UserInfoServiceImpl implements UserInfoService {

  private final UserRepository userRepository;

  @Override
  public List<UserDTO> selectAllUser() {
    return userRepository.findAll()
        .stream()
        .map(entity -> new UserDTO(entity.getId(), entity.getName(), entity.getMailAddress()))
        .collect(Collectors.toList());
  }

}

・UserRepository.java

package com.practice.annotation.anotools_spring.repository;

import com.practice.annotation.anotools_spring.entity.UserEntity;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserRepository {

  List<UserEntity> findAll();

}

・UserRepository.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper
  namespace="com.practice.annotation.anotools_spring.repository.UserRepository">

  <select id="findAll" resultType="com.practice.annotation.anotools_spring.entity.UserEntity">
    SELECT * FROM M_USER_INFO
  </select>

</mapper>

・UserDTO.java

package com.practice.annotation.anotools_spring.dto;

import lombok.Value;

@Value
public class UserDTO {

  int id;
  String name;
  String mailAddress;

}

・UserEntity.java

package com.practice.annotation.anotools_spring.entity;

import lombok.Value;

@Value
public class UserEntity {

  int id;
  String name;
  String mailAddress;
}

■実行結果

request:http://localhost:8080/api/users/info/all

response:

[
    {
        "id": 1,
        "name": "hoge",
        "mailAddress": "hoge@example.com"
    },
    {
        "id": 2,
        "name": "huga",
        "mailAddress": "huga@example.com"
    },
    {
        "id": 3,
        "name": "piyo",
        "mailAddress": "piyo@example.com"
    }
]

コメント