簡易書籍検索アプリケーション作成(EntityManager版)

8.2 簡易書籍検索アプリケーション作成(EntityManager版)

8.2.1 アプリケーション概要

1 アプリケーション作成の目的

7.2で作成したプロジェクトをもとに、EntityManagerを利用したより高度なデータベースアクセス方法を学習していきます。

2 簡易書籍検索アプリケーション(EntityManager版)プロジェクト構成(完成状態)

8.2.2 DAOクラスの作成

1 「src/main/java」パッケージ内に「jp.co.f1.spring.bms.dao」パッケージを作成
2 1で作成した「jp.co.f1.spring.bms.dao」パッケージ内に「BookDao.java」を作成
3 2で作成した「BookDao.java」ファイルに以下に示すソースコードを記述する。

■ソースコード
【ファイル名:BookDao.java】

[html] package jp.co.f1.spring.bms.dao; import java.util.ArrayList; import org.springframework.stereotype.Repository; import jakarta.persistence.EntityManager; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; import jp.co.f1.spring.bms.entity.Book; @Repository public class BookDao { // エンティティマネージャー private EntityManager entityManager; // クエリ生成用インスタンス private CriteriaBuilder builder; // クエリ実行用インスタンス private CriteriaQuery<Book> query; // 検索されるエンティティのルート private Root<Book> root; /** * コンストラクタ(DB接続準備) */ public BookDao(EntityManager entityManager) { // EntityManager取得 this.entityManager = entityManager; // クエリ生成用インスタンス builder = entityManager.getCriteriaBuilder(); // クエリ実行用インスタンス query = builder.createQuery(Book.class); // 検索されるエンティティのルート root = query.from(Book.class); } /** * 書籍情報検索 * @param String isbn * @param String title * @param String price * @return ArrayList<Book> book_list */ public ArrayList<Book> find(String isbn, String title, String price) { // SELECT句設定 query.select(root); // WHERE句設定 query.where( builder.like(root.get(“isbn”), “%” + isbn + “%”), builder.like(root.get(“title”), “%” + title + “%”), builder.like(root.get(“price”), “%” + price + “%”) ); // クエリ実行 return (ArrayList<Book>)entityManager.createQuery(query).getResultList(); } } [/html]

8.2.3 コントローラークラスの修正

1 「BmsController」クラスファイルに以下に示すソースコードを追記する。

■ソースコード
【ファイル名:BmsController.java】

[html] package jp.co.f1.spring.bms.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.servlet.ModelAndView; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; import jakarta.persistence.PersistenceContext; import jakarta.persistence.EntityManager; import jakarta.annotation.PostConstruct; import jakarta.servlet.http.HttpServletRequest; import jp.co.f1.spring.bms.repository.BookRepository; import jp.co.f1.spring.bms.dao.BookDao; import jp.co.f1.spring.bms.entity.Book; @Controller public class BmsController { // EntityManager自動インスタンス化 @PersistenceContext private EntityManager entityManager; // DAO自動インスタンス化 @Autowired private BookDao bookDao; @PostConstruct public void init() { bookDao = new BookDao(entityManager); } // Repositoryインターフェースを自動インスタンス化 @Autowired private BookRepository bookinfo; /* * 「/list」へアクセスがあった場合 */ @GetMapping(“/list”) public ModelAndView list(ModelAndView mav) { // bookinfoテーブルから全件取得 Iterable<Book> book_list = bookinfo.findAll(); // Viewに渡す変数をModelに格納 mav.addObject(“book_list”, book_list); // 画面に出力するViewを指定 mav.setViewName(“list”); // ModelとView情報を返す return mav; } /* * 「/insert」へアクセスがあった場合 */ @GetMapping(“/insert”) public ModelAndView insert(@ModelAttribute Book book, ModelAndView mav) { // Viewに渡す変数をModelに格納 mav.addObject(“book”, book); // 画面に出力するViewを指定 mav.setViewName(“insert”); // ModelとView情報を返す return mav; } /* * 「/insert」へPOST送信された場合 */ @PostMapping(value = “/insert”) // POSTデータをBookインスタンスとして受け取る public ModelAndView insertPost(@ModelAttribute @Validated Book book, BindingResult result, ModelAndView mav) { // 入力エラーがある場合 if (result.hasErrors()) { // エラーメッセージ mav.addObject(“message”, “入力内容に誤りがあります”); // 画面に出力するViewを指定 mav.setViewName(“insert”); // ModelとView情報を渡す return mav; } // 入力されたデータをDBに保存 bookinfo.saveAndFlush(book); // リダイレクト先を指定 mav = new ModelAndView(“redirect:/list”); // ModelとView情報を返す return mav; } /* * 「/search」へアクセスがあった場合 */ @GetMapping(“/search”) public ModelAndView search(HttpServletRequest request, ModelAndView mav) { // bookinfoテーブルから検索 Iterable<Book> book_list = bookDao.find( request.getParameter(“isbn”), request.getParameter(“title”), request.getParameter(“price”)); // Viewに渡す変数をModelに格納 mav.addObject(“book_list”, book_list); // 画面に出力するViewを指定 mav.setViewName(“list”); // ModelとView情報を返す return mav; } } [/html]

8.2.4 アプリケーションの実行

1 XAMPP(MariaDB)の起動
2 アプリケーションの実行
3 アプリケーションにアクセス(書籍一覧画面)

以下のアドレスから簡易書籍一覧表示アプリケーションにアクセスします。
URL:http://localhost:8080/list
図 8.2 1:アプリケーションアクセス画面(書籍一覧画面)
図 8.2 2:アプリケーションアクセス画面(書籍検索結果)


NEXT>> 8.3 簡易書籍検索アプリケーションの説明(EntityManager版)