EntityManagerによるデータベースアクセス
8.1 EntityManagerによるデータベースアクセス
8.1.1 Spring FrameworkとJPA
第6章で、エンティティを使ってデータベースにアクセスする基本について説明しました。このとき、アクセスの最も重要な役割を果たしているのが「リポジトリ」でしたね。リポジトリを用意することで、ほとんどアクセスのためのコードを書くことなくデータベースにアクセスすることが可能になりました。
が、リポジトリで可能なのは、基本的なアクセスのみです。CRUDについては一通り可能でしたが、では検索は?「findById」のように、名前からシンプルに処理を生成できるようなものはいいのですが、もっと複雑な検索を行ないたい場合はどうすればいいのでしょう?
こうした場合、リポジトリによるデータベースアクセスは限界があります。もっと自在にアクセスの処理を組ってる方法も知っておきたいところです。
第6章の冒頭で説明したように、Spring Bootにおけるデータベースアクセスの基本的な仕組みは、「JPA」(Java Persistence API)と呼ばれる技術をベースにして作られています。JPAは、Java EEに用意されている技術で、データベースとのアクセスやデータの「永続化」(わかりやすくいえば、保存すること)などに関する機能を提供してくれます。これまで皆さんが利用してきたJDBCによるデータベースアクセスも可能ではありますが、JPAが組み込まれているSpring Bootであれば、そちらを利用する方が良いでしょう。
このJPAをSpring Frameworkから利用するために、「Spring Data JPA」というフレームワークが用意されています。フレームワークを利用する場合でも、データベースアクセスの土台となる部分は、JPAが基本なのです。更にこのSpring Data JPAを利用して、Spring Bootのリポジトリなども作られています。
Spring Bootのリポジトリは非常に便利ですが、ここでもう一歩踏み込んで、Spring Data JPAに用意されているデータベースアクセスの機能を使った方法についても考えてみることにしましょう。実際の開発では、必ずしもリポジトリに用意されている機能だけで十分というわけではありません。より細かな処理を自分で実装する必要が生じたとき、Spring Data JPAの知識が必要となることもあるはずです。そこで、「Spring Bootアプリケーション内から、Spring Data JPAの機能を利用する」方法について説明をしていきます。
8.1.2 改めてDAO(Data Access Object)について考える
では、作成したエンティティを利用するための処理を考えていくことにしましょう。
通常、データベースを利用する場合、例えばデータを表示するページにアクセスしたら、そのコントローラーのリクエストハンドラ内でデータを取り出して、ビューに表示する処理を用意することになります。ですから、コントローラーの各リクエストハンドラに、そのリクエストで必要となるデータベースアクセスの処理を用意すればいいのです。
が、このような実装の仕方だと、リクエストごとに処理を書いていくことになってしまい、コントローラーがどんどん肥大化します。またMVCというアーキテクチャーは「データアクセスとロジックの分離」を考えて設計するのが普通ですから、データベースアクセスをコントローラーに持たせるのはあまり良いやり方とも思えません。
こうした点から、データベースアクセスには一般に「DAO」と呼ばれるオブジェクトを用意します。皆さんも既に学習してきましたが、改めてここで復習しておきましょう。
DAOとは、「Data Access Object」の略で、文字通りデータベースにアクセスする手段を提供するためのオブジェクトです。このDAOにデータベースアクセスのための機能をまとめておき、コントローラーからは必要に応じてDAOのメソッドを呼び出し、必要な処理を行う、というわけです。
Spring Bootの場合、リポジトリがデータベースアクセス関連を一手に引き受けていますので、通常ならばリポジトリをそのまま拡張していくのがよいでしょう。ただ、ここでは、Spring Bootの機能でなく、より低レベルなJPAの機能を利用するため、あえてDAOクラスを作成して実装していくことにします。