簡易書籍検索アプリケーション作成(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」ファイルに以下に示すソースコードを記述する。
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 アプリケーションにアクセス(書籍一覧画面)
2 アプリケーションの実行
3 アプリケーションにアクセス(書籍一覧画面)
以下のアドレスから簡易書籍一覧表示アプリケーションにアクセスします。
URL:http://localhost:8080/list
図 8.2 1:アプリケーションアクセス画面(書籍一覧画面)
図 8.2 2:アプリケーションアクセス画面(書籍検索結果)