簡易書籍検索アプリケーション作成(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】

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();
    }

}
	

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

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

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

	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;
		}
	
	}

	

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

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

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


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