トランソニックソフトウェア

ブログ
BLOG

2019.04.08

[STS3.9.2]Spring Bootによるデータベースアクセス

今回はJPA(Java Persistence API)の機能を使ってアクセスの実装をします。 データベースアクセスには一般に「DAO」と呼ばれるオブジェクトを用意します。 これは、Data Access Objectの略で、文字通りデータベースにアクセスする手段を提供するためのオブジェクトです。

 

今回はこちらを作成、実装しました。 STSを使用しバージョンは3.9.2で、gradleでビルドをしています。 まずはデータベースの属性を定義するクラスを作成します。Spring Bootではこれをエンティティと呼び、データベースのレコード1つ1つがエンティティクラスのインスタンスの形になっているという感じです。 今回使用するエンティティは以下です。(getterとsetterは省略してあります)

順番に説明していきます。

@Entity

エンティティとして定義するクラスにはクラス名の上に「@Entity」というアノテーションを付与します。 これにより、このクラスがエンティティということが認識されます。

@Table

引数に任意の名前を渡すことでテーブル名を指定することができます。 省略も可能です。その場合はクラス名がテーブル名となります。

@Id

プライマリキーを指定します。 エンティティを用意するときには、レコードをユニークにするために用意しておくとよいでしょう。

@GenerateValue

@GeneratedValue(strategy = GenerationType.AUTO)はプライマリキーをフィールドに対して自動的に付与します。AUTOを指定することにより自動的に値を割り振るようになります。

@Column

フィールドに割り当てられるカラム名を指定します。このアノテーションの引数は以下の通りです。

nameカラム名を指定
length最大の長さを指定
nullable未入力を許可するかどうかを指定

@Min,@Max

文字通り最大最小の限度を決めるアノテーションです。 上記のソースを例にするとageフィールドは0から200の値までしか入力することができません。

 

DAOインターフェースの用意

DAOの定義としてインターフェースを用意しました。 全データ取得のメソッドのみ定義してあります。次にこれの実装クラスを作っていきます。

 

 

DAOクラスの実装

@Repository

このクラスがデータアクセスクラスであることを示しています。

EntityManager

クラスの最初に宣言してあるEntityManagerはエンティティを利用するために必要な機能を提供します。 基本的にエンティティを扱う場合はEntityManagerを用意することから始めるそうです。 エンティティを取得するためにここではQueryクラスを利用しています。

createQueryによるQuery作成

QueryクラスはSQLでデータを問い合わせるためのクエリー文に相当する機能をもつオブジェクトです。 createQueryの引数はJPQLという言語が使われ ているそうで、SQLに似た形の構文をしています。 QueryインスタンスにそのJPQLによるクエリー分を指定し呼び出します。 from MyDataというのはselect * from mydataに相当するJPQLのクエリー文 MySQLを少しかじっていた身としてはとてもわかりやすいです。

 

Queryから結果を取得する

getResultListメソッドによりクエリーの実行結果をlistに代入しています。

 

 

コントローラーの実装

@Autowired

このアノテーションがついたフィールドにはすでに生成されている同じ型のインスタンスが自動的に渡されます。

@PostConstructについて

@PostConstructはコンストラクタによりインスタンスが生成された後に呼び出されるメソッドです。ここで、データベースに初期値として3つのデータを登録しています。

@PersistenceContextについて

ここではEntityManagerのフィールドを用意しています。 Spring Bootは起動時にEntityManagerのオブジェクトを生成します。 @PersistenceContextのアノテーションをつけることにより、自動でこのフィールドに割り当てられます。

indexメソッドについて

indexメソッドでは先ほど実装したDAOクラスであるMyDataDaoImplクラスのgetAllメソッドを呼び出して、結果をaddObjectして返します。

 

実装は以上です。ビルドして、ブラウザからindexにアクセスすると、データの一覧が表示されます。