質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.36%

SpringBootで1つのページに複数のテーブルを表示する方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,804

score 14

こんにちは。
Javaについて初学者なので拙いところもあると思いますが、よろしくお願いします。

実現したいこと

SpringBootで、同じDB内にある複数のテーブルを1つの画面に表示させたいです。

ファイル構成は以下の通りです。
ファイル構成

コード

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<table>
    <tr>
        <th>名前</th>
        <th>種類</th>
    </tr>
    <tr th:each="Animal: ${Animal}">
        <td th:text="${Animal.Name}"></td>
        <td th:text="${Animal.Species}"></td>
    </tr>
</table>

<table>
    <tr>
        <th>名前</th>
        <th>種類</th>
    </tr>
    <tr th:each="Plant: ${Plant}">
        <td th:text="${Plant.Name}"></td>
        <td th:text="${Plant.Species}"></td>
    </tr>
</table>
</body>
</html>


Entityクラス(互いに依存関係なし)

package com.example.demo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
@Table(name="animal")
public class Animal {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @Column(name="Name")
    private String Name;

    @Column(name="Species")
    private String Species;

}
package com.example.demo;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Entity
@Table(name="plant")
public class Plant {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @Column(name="Name")
    private String Name;

    @Column(name="Species")
    private String Species;

}


Applicationクラス

package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class TestPrjApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestPrjApplication.class, args);
    }

}


Repositoryクラス

package com.example.demo;

import org.springframework.data.jpa.repository.JpaRepository;

public interface TestRepository extends JpaRepository<Animal, Integer> {
}

//Plantはどうする?

Serviceクラス

package com.example.demo;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class TestService{

    @Autowired
    TestRepository repository;

    public List<Animal> selectAll() {
        return repository.findAll();
    }

       //Plantはどうする?

}

Controllerクラス

package com.example.demo;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;


@Controller
public class TestController {

    @Autowired
    TestService service;

    //return html
    @GetMapping("/Test")
    public String getAnimal(Model model) {
        List<Animal> Animal =  service.selectAll();
        model.addAttribute("Animal", Animal);
        return "Test";
    }

    //getPlantはどうする?

}


build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
apply plugin: 'war'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    runtimeOnly 'mysql:mysql-connector-java'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    //1 : jpa
    compile 'org.springframework.boot:spring-boot-starter-data-jpa'
    //2 : mysql connector
    compile 'mysql:mysql-connector-java'
       //3 : tymeleaf
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'

    //lombok
    // https://mvnrepository.com/artifact/org.projectlombok/lombok
    compile group: 'org.projectlombok', name: 'lombok', version: '1.18.18'

}

test {
    useJUnitPlatform()
}

application.propties

spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=jdbc:mysql://localhost:3306/Testdb
spring.datasource.username=root
spring.datasource.password=password

#デフォルトの命名規則を無視
#https://stackoverflow.com/questions/38646025/set-table-name-in-spring-jpa
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

#キャッシュを無効
spring.messages.cache-seconds = 0

分からないところ

Entityクラスを複数作成した後、それをまとめるクラスを作ってそれに対して一括で扱えるRepositoryやService、Controllerを作成したいのですが、
調べてもどう書くか出てきません。(そもそもこの発想が間違ってますか?)

回答よろしくお願いします。

参考サイト

https://morelia.tokyo/java/springboot-mysql-insert-select-data/
https://dev.classmethod.jp/articles/using_spring_boot_2/

補足情報

Eclipse 2020 Java FullEdition
AmazonCorretto jdk15.0.2_7
SpringBoot 2.4.3
MySQL 8.0.23
Windows10 Pro 1909

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

Entityクラスを複数作成した後、それをまとめるクラスを作ってそれに対して一括で扱えるRepositoryやService、Controllerを作成したい

1つのサービスの中では1つのリポジトリしか使えないとか、1つのコントローラの中では1つのサービスしか使えないとか、そんな決まりは無いので、自由に組み合わせて作ってみたら良いと思いますよ。

とは言え、下のレイヤから、リポジトリ層、サービス層、コントローラ層と見たとき、リポジトリ層はエンティティと1対1に対応させることが多いと思います。

よって、私なら、AnimalRepositoryPlantRepositoryを作り、それぞれのエンティティのDBアクセスメソッドを定義します。

一方、サービス層は、そのWebアプリの機能を強く反映したものになると思います。

例えば、アプリがAnimalのCRUD機能を持つなら、AnimalServiceは必要でしょうね(その中でAnimalRepositoryを使う)。かといって、常にリポジトリとサービスを1対1に対応させる必要も無いです。例えば、このWebアプリに、動物と植物を1つずつランダムにペアリングして表示する機能があるなら、LifeServiceクラスを作って、その中で2つのリポジトリを使う、みたいな構成にしても良いでしょう。

public class LifeService {
  private AnimalRepository animalRepository;
  private PlantRepository plantRepository;
  public LifePairDto randomLifePair() {
    ...
  }
  ...
}

public class LifePairDto {
  private Animal animal;
  private Plant plant;
  public LifePairDto(Animal a, Plant p) {
    ...
  }
  ...
}
// ※アノテーションとか諸々、省略してます。

回答になってるかな…。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/03/30 11:54

    この話、この問題の解決に必要な事ですか?

    キャンセル

  • 2021/03/31 06:50

    >LifePairDtoクラスのようなものもServiceのファイルに記述するべきなんですか?

    2つのクラスを同じソースファイルに記述すべき、という意図は無いです(諸々、省略してますので、ご自分で試してみてください)。私ならソースファイルは分けますね。そもそも、どちらもpublicなクラスなので、ソースファイルを分けないとコンパイルが通らないんじゃないかな。

    キャンセル

  • 2021/04/05 12:55

    すみません。Serviceクラスを使わないことにしたので質問を作成し直します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る