😴

MySQLでDBを作りJAVAで在庫管理アプリを作る

2024/07/08に公開

お仕事で使う可能性がでてきたJAVA SQL
まずは仕組みを理解するために、データベースの作り方と、
プロジェクト構造をざっくり理解すること目的として今回は作ります。

使用環境

springboot
STS(SpringToolSuite)
JAVA 18
MySQL

データベースの作り方

MySQLのインストールをする。(ここは省略)

*MySQLを作成時のパスワードを作ります。これがDB接続のパスワードになるので、
 忘れないように注意してください。

*1 MySQLにコマンドプロンプトから接続

mysql -u root -p

*2 パスワードの入力が求められるのでパスワードの入力をする

*3 データベースを作成する

CREATE DATABASE inventorrymanagement;

*4 データベースを使用する

USE inventorymanagement;

*5 テーブルを作成する

CREATE TABLE product (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    quantity INT NOT NULL
);

作成したテーブルを確認してみる

1 テーブルを表示する

SHOW TABLES;

2 テーブルの説明

DESCRIBE product;

こんな感じで作ったテーブルが表示させることができるやつ

確認が取れればできてますのでOKです。

JAVAで在庫管理システムを作成してテーブルとつなげる

今回使うのがSpring Tool Suite4というツール

Eclipseみたい。

STSを入れる

1 STSをインストール
https://www.techfun.co.jp/services/magazine/spring/windows-spring-install.html

これが参考になりました。

=>これで終わりかと思いきやこれだけでは英語表記となっており
  日本語で表示させることができません

2 STSを日本語で表示させるためのプラグインをインストールします
https://qiita.com/andna0410/items/e9cc07c9e2e34a542245

プロジェクトファイルの説明

src/main/java/com/example/inventorymanagement/controller/inventorryController.java

package com.example.inventorymanagement.controller;
//リクエストを処理して適切な応答を返す役割
import com.example.inventorymanagement.model.Product;
import com.example.inventorymanagement.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

@Controller//このアノテーションはクラスをspringMVCコントローラーとして使用リクエストを処理してビューを返す
public class InventoryController {

    @Autowired//依存関係のproductServiceをInventoryControllerにimportする
    private ProductService productService;

    @GetMapping("/")
    public String showInventory(Model model) {
        model.addAttribute("product", new Product());
        model.addAttribute("products", productService.getAllProducts());
        return "inventory";
    }

    @PostMapping("/inventory")//ユーザー側が新しく在庫登録するとここが呼ばれる
    public String addProduct(@ModelAttribute Product product) {
        productService.addProduct(product);
        return "redirect:/";
    }
    
 
}

俗にいうエンドポイント的なやつになります

src/main/java/com/example/inventorymanagement/model/Product.java

package com.example.inventorymanagement.model;

import jakarta.persistence.*;

//
//import javax.persistence.Entity;
//import javax.persistence.GeneratedValue;
//import javax.persistence.GenerationType;
//import javax.persistence.Id;

@Entity //productと名前が付けられたテーブルにマップされる
public class Product {
    @Id//Entityの主キーを指定する。フィールドidは主キーとしてマークされます
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String productName;
    private int quantity;


    public Long getId() {
        return id;
    }

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

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }
}

@GeneratedValue(戦略 = GenerationType.IDENTITY)

*このアノテーションは主キーの生成戦略を指定するために、使用される。
 このGenerationType.IDENTITY戦略は主キーの値がデータベースによって
 生成されることを示します。(例自動インクリメント列を使用)

src/main/java/com/example/inventorymanagement/service/ProductService.java

*SpringBootappではサービスレイヤーにビジネスロジックが含まれており
コントローラーレイヤー間の仲介役として機能します。
リポジトリ間でデータをやり取りする前に、データを処理し、ビジネス ルールを適用します。

package com.example.inventorymanagement.service;

import com.example.inventorymanagement.model.Product;
import com.example.inventorymanagement.repository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    public List<Product> getAllProducts() {
        return productRepository.findAll();
    }

    public void addProduct(Product product) {
        productRepository.save(product);
    }
}

@Service
*このアノテーションは、クラスをサービスプロバイダーとしてマークするために使用されます。
これは@Componentアノテーションの特殊化であり、
クラスにビジネスロジックが含まれている事を示します。

getAllProducts();
このメソッドはリポジトリからすべての製品を取得します。
全てのエンティティリストを取得するにはでfindAll()メソッドを呼び出します。

addProduct(Product product);
このメソッドは、新しい製品をリポジトリに保存します。

データの流れ
商品の取得

このgetAllProducts()メソッドは、すべての製品リストを取得するために
コントローラーによって呼び出されます。

ProductRepositoryと対話してデータベースからデータを取得します。

製品の追加
このaddProduct(Product product)メソッドは、新しい製品を保存するために
コントローラーによって呼び出されます。

src/main/java/com/example/inventorymanagement/repository/ProductRepository.java

repositoryがデータベースとのやり取りを担当
repositoryはデータに対してCRUD(作成、読み取り、更新、削除)操作を実行するメソッドを提供

package com.example.inventorymanagement.repository;

import com.example.inventorymanagement.model.Product;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Long> {
}

JpaRepository<Product, Long>;

JpaRepositoryのインターフェースのJPA(Java Persistence API)Repository固有の拡張です。
JpaRepositoryを拡張することにより、エンティティの保存、削除、検索などのメソッドを含む

Discussion