👌

Springboot/Mybatis/RESTAPI/axios 編集中

2024/11/22に公開

Intellij IDEA使用 設定→ラグイン→Mybatisxを有効に。
Springboot
java JDK17
Springboot ビルドツール:Mavenではなくbuild.gradle使用
Mybatisとは、データベースにアクセスするフレームワーク
MySQL
vscode
※バックエンドとクライアントのhostが分かれている前提で進めます。

ディレクトリ構成
src/
 └── main/
      ├── java/
      │    └── pairWork/
      │         ├── api/
      │         │    ├── entity/
      │         │    ├── repository/
      │         │    ├── service/
      │         │    └── controller/
      │         └── ...
      └── resources/
           └── application.properties
           └── mapper/
                └── TaskMapper.xml

テーブル作成
CREATE TABLE task (
    id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
    task_name VARCHAR(255) NOT NULL COMMENT 'タスク名',
    task_detail TEXT COMMENT 'タスク詳細',
    status INT NOT NULL COMMENT 'ステータス',
    expiration_date DATE COMMENT '期限日',
    registration_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登録日',
    updated_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日',
    man_hour INT COMMENT '工数'
);
テーブルにテストデータとして値を格納
INSERT INTO task (task_name, task_detail, status, expiration_date, registration_date, updated_date, man_hour)
VALUES 
('タスク1', 'デザインを完成させる', 1, '2024-11-25', '2024-11-18 09:00:00', '2024-11-18 09:00:00', 8),
('タスク2', 'クライアントミーティング準備', 2, '2024-11-27', '2024-11-18 10:00:00', '2024-11-18 10:00:00', 4),
('タスク3', 'プロジェクト仕様書の確認', 1, '2024-11-30', '2024-11-18 11:00:00', '2024-11-18 11:00:00', 12),
('タスク4', 'バックエンドAPIの設計', 3, '2024-12-05', '2024-11-18 12:00:00', '2024-11-18 12:00:00', 15),
('タスク5', 'ユニットテストケース作成', 2, '2024-11-28', '2024-11-18 13:00:00', '2024-11-18 13:00:00', 6),
('タスク6', 'コードレビューの実施', 1, '2024-11-29', '2024-11-18 14:00:00', '2024-11-18 14:00:00', 3),
('タスク7', '開発サーバーのセットアップ', 3, '2024-12-01', '2024-11-18 15:00:00', '2024-11-18 15:00:00', 10),
('タスク8', 'UIモックアップの作成', 2, '2024-11-26', '2024-11-18 16:00:00', '2024-11-18 16:00:00', 5),
('タスク9', 'ログ収集システムの導入', 1, '2024-11-30', '2024-11-18 17:00:00', '2024-11-18 17:00:00', 8),
('タスク10', '月次レポート作成', 3, '2024-11-24', '2024-11-18 18:00:00', '2024-11-18 18:00:00', 7);

Taskmapper.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.xmlファイルの宣言とDTDの指定。
     MyBatisで使用するためのファイルで、DTDによってXMLの構造を定義します。 -->

<!--<mapper namespace="com.example.mapper.TaskMapper">-->
    <mapper namespace="pairWork.api.repository.mapper.task.TaskMapper">
    <!-- <mapper>タグは、SQL文とJavaのMapperインターフェースを関連付けるルート要素。
         namespace属性に、対応するJavaのMapperインターフェースの完全修飾名を指定します。 -->

    <!-- タスクの条件検索 -->
    <!-- タスクをステータスや期限日で検索するSQLクエリを記述する -->

    <select id="findAll" resultType="pairWork.api.entity.Task">
        SELECT
        id,
        task_name,
        task_detail,
        status,
        expiration_date,
        registration_date,
        updated_date,
        man_hour
        FROM task
    </select>
entity
entity(モデル層)
package pairWork.api.entity;

import java.util.Date;//データ型
import lombok.Data;//Lombokの@Dataアノテーションをクラスに付けることで、以下のような基本的なコードを自動生成してくれます

@Data
public class Task {
    private int id;                        // タスクID
    private String taskName;               // タスク名
    private String taskDetail;             // タスク詳細
    private int status;                    // ステータス
    private Date expirationDate;           // 期限日
    private Date registrationDate;         // 登録日
    private Date updatedDate;              // 更新日
    private int manHour;                   // 工数
}
repository mapper(インターフェイス)

細かく条件IDなどの取得ではなく簡易なfindAll();でデータをとりあえず全て取得できるように全検索

TaskRepository.java
package pairWork.api.repository;

import java.util.List;
import pairWork.api.entity.Task;
import pairWork.api.entity.Todo;
import pairWork.api.service.output.task.TaskSearchServiceInput;

public interface TaskRepository {

    List<Task> findAll();

    void register(Task entity);
}

repositoryクラスをマッピングする理由は後ほど追記

Taskmapper.java
package pairWork.api.repository.mapper.task;

import java.util.List;
import org.apache.ibatis.annotations.Mapper;
//import org.apache.ibatis.annotations.Param;
import pairWork.api.entity.Task;

@Mapper
public interface TaskMapper {
    List<Task> findAll();
TaskDatasource

TaskDatasource が、TaskRepository インターフェースを実装している部分

TaskDatasource.java

package pairWork.api.repository.datasource;

import pairWork.api.entity.Task;
import pairWork.api.repository.TaskRepository;
import pairWork.api.repository.mapper.task.TaskMapper;

import java.util.List;

public class TaskDatasource implements TaskRepository {
    private static TaskMapper taskMapper;

    @Override
    public List<Task> findAll(){
        return taskMapper.findAll();
    }

    @Override
    public void register(Task entity) {

    }
}
service(サービス層ビジネスロジック)
Taskservice.java
//serviceの実装
controller (ApiResult)
TaskContoroller.java
webクライアント(axios)
task.tsx

Discussion