こんにちは、ぽむです。
今回は、Spring5とHibernate5.2を使ってMySQL内のテーブルデータを一覧表示させるプログラムをご紹介したいと思います。
開発環境
開発環境は下記の通りです。
Spring | 5.2.1.RELEASE |
Hibernate | 5.2.10.Final |
MySQL | 8.0.16 |
はじめに
前回ご紹介させていただいたブログでSessionFactoryをBeanとして登録する方法を書かせていただいたのですが、今回はこのSessionFactoryを使って、MySQL内のテーブルからデータを取ってきてそのデータを画面上に表示させるプログラムをご紹介したいと思います。
前回ご紹介させていただいたブログについては下記リンクをご参照下さい。
今回のポイントは、MySQL内のテーブルからデータを取ってくる処理をサービスとしてまとめることです。このサービスをアクションメソッドから呼び出せばアクションメソッドをきれいに書くことができます。
Springフレームワークには、DIコンテナに登録するBeanとして、「@Component、@Controller、@Service、@Repository」などがありますが、DAOといったデータ操作に関するBeanはサービスとして登録する決まりがあります。
それぞれの違いは下記URLに詳しく載っているので、よかったら参考にして下さい。KevinFQさんありがとうございます。
サービスクラスの作成
- サービスクラスに@Serviceアノテーションを付けます。
- SessionFactoryを取得できるBeanまでのパッケージを@ComponentScanします。
- @Autowiredアノテーションを使ってSessionFactoryを注入します。
- findAllメソッド内でテーブルデータを全検索して結果を返します。
package com.pom2019.service; import java.util.List; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.ComponentScan; import org.springframework.stereotype.Service; import com.pom2019.entity.HouseholdAppliances; @Service @ComponentScan("com.pom2019.config") public class HouseholdAppliancesDao { @Autowired private SessionFactory sf; public HouseholdAppliancesDao() { super(); } @SuppressWarnings("unchecked") public List<HouseholdAppliances> findAll() { Session ss = sf.openSession(); return ss.createQuery("from HouseholdAppliances").list(); } }
コントローラクラスの作成
- @Controllerを付与して本クラスがコントローラクラスであることを宣言します。
- サービスBeanのあるクラスまでのパッケージをコンポネートスキャンします。
- @Autowiredアノテーションを使ってサービスBeanを注入します。
- @RequestMappingアノテーションを使ってアクションパスを宣言します。
- 注入したservice変数を使ってテーブルデータを取得し、モデルにセットします。
- 最後にview名を返します。
package com.pom2019.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.ComponentScan; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.pom2019.entity.HouseholdAppliances; import com.pom2019.service.HouseholdAppliancesDao; @Controller @ComponentScan("com.pom2019.service") public class IndexController { @Autowired private HouseholdAppliancesDao service; @RequestMapping(value="/getList", method = RequestMethod.GET) public String execute(Model model) { List<HouseholdAppliances> list = service.findAll(); model.addAttribute("list", list); return "displayList"; } }
Viewの作成
- ページディレクティブでコンテントタイプと文字コードを指定します。(1行目)
- taglibディレクティブでJSTLタグライブラリを使うことを宣言します。(2,3行目)
- c:forEachタグを使ってモデルにセットされたlistデータを取得しています。(1行分が変数dataに取得されます)
- c:outタグを使ってデータを出力しています。
- fmt:formatDateタグを使って日付データを出力しています。
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <html> <head> <title>家電リスト</title> <style> table { border-collapse: collapse; } td { border: 1px solid gray; padding: 3px 8px; } </style> </head> <body> <h2>家電リスト</h2> <p> <button id="btnNew">新規</button> </p> <table> <tr> <td>id</td> <td>家電名</td> <td>購入日時</td> <td colspan="2">アクション</td> </tr> <c:forEach var="data" items="${list}"> <tr> <td class="id"><c:out value="${data.id}"/></td> <td><c:out value="${data.householdAppliancesName}"/></td> <td><fmt:formatDate value="${data.purchaseDate}" type="DATE" pattern="yyyy/MM/dd"/></td> <td><button class="btnEdit">編集</button></td> <td><button class="btnDelete">削除</button></td> </tr> </c:forEach> </table> </body> </html>
実行結果
mvc-config.xml内でコントローラクラスをコンポネートスキャンするように設定後、実行します。
(注意)新規/編集/削除ボタンは今回使用しておりません。
おわりに
MySQL内のテーブルデータを無事表示することができました。
Springフレームワークを使ってそれぞれのクラスをBeanとして部品化すれば、ベタ書きのJavaで書いていたような(フレームワークを使わないJDBCを使ったJavaのような)長い処理は書かなくていいし、全体の見通しも良くなると思います。
今回のプログラムが参考になりましたら、皆様もぜひ活用して下さいね!
最後までお読み頂きありがとうございました。