行き倒れJavaアプリ_3_Spring_Dataを使ってみる
Spring MVC、Spring Data JPA、両方やらなきゃいけないのが、webアプリのつらいところだな。
長らく間が空いておりますが、最近は覚えることの多いこと。
頭がフットーしそうです。
1.必要なものを揃えよう
Spring Dataは、簡単にDB接続ができちゃう優れものです。
さらに、自作クエリの実装も視覚的に作れてしまうのでとっても簡単。
あとプロジェクト作成時にチェックボックスを付けるだけで必要なものは揃えてくれるので、単純なデータベースをつなげる程度で使うのならSpring Dataでも問題ないなという印象。
欠点といえば、必要なクラスは全部作っておかなくちゃいけないので、DBの項目などに変更が起きた場合無慈悲にエラーが発生すること。
また検索機能など、クエリが動的に変化するようなものを実現するには少し手間です。このあたりはまた別に残そうと思います。
実装にはテーブル項目を値として格納するEntityクラス、実際にクエリを実行するためのRepository(インターフェース)、以上だ。
パパっと作っちゃいましょう。
そういえばDBのテーブルはこういうふうになってます。
a)Entityクラス
前回作ったFormと同じように、変数を設定しゲッタ・セッタを作成します。
ここで気をつけるのは、DBのテーブル項目と、変数の名前を一致させること。
変数は、項目名のアンダーバー(_)を1区切りとしたキャメルケース式で指定でき、例えば『hoge_hoge』という項目名なら、変数は『hogeHoge』と指定することができます。
なんかアノテーションがついてるので感想を書いておくね。
・@Entity
これはEntityクラスです!ということをお知らせするもの。
Entityは日本語で『実体』。全く何なのか意味わからん単語だが、とりあえず箱です!みたいな意味で捉えてもいいと思う。
・@Table
これはTableです!ということをお知らせするもの。
これはDBのTableという実態を持っているクラスです!とも言えるのだろうか。
また、オプションとしてテーブル名の正式名称を(name = "テーブル名")として設定しておくといい。
・@Id
これがついた変数は、Java上で主キーとして認識されます。
複数項目を主キーとして設定している場合は、別クラスに主キー用のEntityを作る必要があったりするのですが、今回はそういうテーブルを作っていません。だってめんどくさいもん。
b)Repositoryクラス
JpaRepositoryクラスを継承したインターフェースを作成します。
このJpaRepositoryクラスには簡単なクエリ(insert/updateクエリ、deleteクエリ、全件/ユニークselectクエリ)が揃っていて、必要な引数を与えれば結果が返ってくるようになっています。
値として、Repositoryクラスに対応するEntityクラス、主キーをJspRepository<Entity, Key>といったように設定する必要があるみたいです。
本格的にDBクエリを仕様(無い)に合わせて作成していく時に、Repositoryクラスは見直していきます。今はこれだけ。
2.Serviceクラスを作ろう
そういやService作ってなかったっけ。
Serviceには、必要な処理を格納していきます。
@Serviceアノテーションは、このクラスはServiceだよと宣言しているもの。意味わからんね。
必要な処理はここに全部入ってるよ(ビジネスロジックとかだよ)と伝えているらしい。なんだそれ。
@Autowiredは本当によくわからない。DIコンテナがインジェクションで注入のなんたらと色々と調べてはみたんだけど、DIコンテナというものから理解できてないせい。最近やっとコンテナはサーバに作る領域みたいなやつとアバウトながらに納得できてきた。@Autowiredの回答からは遠ざかってる気がする。
getCharacterMasterメソッドを作成して、character_idを引数として送れば、ユニークな一件を探して返してくれるような処理をさせるようにしました。
この『.findOne(characterMaster)』というのが、JspRepositoryに備わっているユニーク検索機能で、引数としてKeyを送れば、Entity(この場合CharacterMaster)に値を格納しreturnしてくれるみたいです。
Serviceクラスを作ったら、Controllerクラスで使います。
同じく@Autowiredアノテーションを前置に付け、Serviceクラスを宣言します。
Entityに結果を格納し、とりあえず名前を変数testにセットして、画面上に表示させるようにします。
アーモン・フェルディナンド・シュピールマン君の名前がDBから取り出され、正常に表示することができました!
もうこうなったら勝ったも同然です。
どんどん開発をしていくゾ。
>> to_be_continued...
長期戦となるCSSフレームワーク“Ink”との戦い。
いろいろなフレームワークを検討したが、『学習時間』という圧倒的障害が行き倒れJavaを行動不能にさせてしまう。
このままではエターなってしまうので、諦めて簡単なCSSを作りたくなってきました。
次回は『画面のモックアップを完成させよう』です。
もうこのアバウトな表題からまた無駄に長引きそうな予感がします。