EclipseによるSpringBoot③MyBatis select

EclipesによるSpringBootの連載の続きです。
①コントローラ
②Thymeleaf
③MyBatis(今回)

今回のテーマは、MyBatisです。マイバティスと読みます。
データベースにアクセスするためのフレームワークです。
ORM(Object Relational Mapping)オブジェクトとリレーショナルを紐づけます。
つまりJavaのオブジェクト(クラス)とSQL文を紐づけることができます。

修正/新規のJavaソース資源のディレクトリ構成を示します。

修正/新規のリソース資源のディレクトリ構成を示します。

修正/新規資源一覧を以下に示します。

ファイル名概要種別修正/新規
1application.ymlH2データベースへの接続情報設定設定新規
2AddressController.java住所コントーラクラスjava新規
3AddressDto.java住所テーブル情報格納用のDTOクラスjava新規
4AddressListForm.java住所リストフォームクラスjava新規
5AddressMapper.java住所マッパーインターフェイスjava新規
6AddressServer.java住所サービスクラスjava新規
7AddressMapper.xml住所マッパーSQLSQL新規
8List.html住所一覧画面タイムリーフThymeleaf新規
作成手順 ①H2データベースの環境作成
②application.ymlの作成
③ソースの作成
 ③-1 住所コントローラの作成
 ③-2 住所DTOの作成
 ③-3 住所リストフォームの作成
 ③-4 住所マッパーの作成
 ③-5 住所サービスの作成
④住所取得SQLの作成
⑤住所一覧表示用のThymeleafの作成

①H2データベースの環境作成
H2データベースに、住所テーブルを作成します。
住所テーブルにデータを挿入します。
詳細は以下の前回の記事を参照ください。

②application.ymlの作成
接続するためのH2データベースの情報を記載します。

③ソースの作成
 ③-1 住所コントローラの作成

16行目:@Autowiredは、自動でインスタンスしてくれる便利なアノテーションです。
17行目:アドレスサービスクラスのメンバクラスです。このクラスで、DBにアクセスします。
22行目:アドレスサービスクラスのgetAddressメソッドの呼び出しです。
住所データを取得して、AddressDtoリストに格納しています。
24行目:AddressListFormリストのインスタンスです。
25行目~35行目:アドレスリスト情報を、AddressListFromリストに入れ直しています。
for文で、リスト数分繰り返しています。

38行目:Thymeleafにリスト情報を渡しています。
40行目:Thymeleaf名を「list」に設定しています。

 ③-2 住所DTOの作成

DTO(Data Transfer Object)というのは、データの受け渡し用のオブジェクトです。
ここでは、データベースから取得したデータの入れ物として使います。
5行目:@Dataは、lombok用のアノテーションです。
これをつけると、自動でgetterとsetterが定義されます。
ソースとして記述しなくても定義されているとみなされて使うことができます。
便利ですね。

 ③-3 住所リストフォームの作成

ここでも、@Dataを使っています。復習ですが、lombok用のアノテーションです。
Formクラスは画面に表示するために使うクラスです。
画面に住所情報を表示するためのリストとして使用します。

 ③-4 住所マッパーの作成

9行目:@Mapperは、マッパー用のアノテーションです。
このマッパーこそが、MyBatisの中核となる機能です。
このマッパーはインターフェイス(interface)として、定義します。
インターフェイスは、未実装で、継承先で実装するような使い方をします。
ただ、今回は、継承先ではなく、SQLに紐づけるようにします。
この、マッパーインターフェイスとSQLを紐づけることがMyBatisの役割です。

 ③-5 住所サービスの作成

11行目:@Serviceは、サービスクラス用のアノテーションです。
13行目:@Autowiredは、また出ましたね。
復習ですが、これは、自動でインスタンスするためのアノテーションです。
14行目:住所マッパークラスを定義しています。
    住所マッパークラスを使って、住所情報を取得します。
17行目:住所一覧取得用のメソッドです。
18行目:住所マッパーのselectAddressメソッドを呼び出しています。

④住所取得SQLの作成

住所マッパーSQLです。
5行目:com.example.demo.mapper.AddressMapperは、紐づけ元のオブジェクトです。
6行目:select id="selectAddress"は、メソッド名に紐づきます。
resultType="com.example.demo.dto.AddressDto"は取得データを入れるオブジェクトです。
7行目~11行目:select * from Address order by idは、SQL文そのものです。
Address(住所)テーブルから、すべての列を、ソートキーをidで昇順で取得します。
selectはデータを取得するときの命令です。
*(アスター)は、すべての列を意味します。
from句は、テーブル名を指定します。
order byは、ソートキーを意味します。
通常は昇順(asc)です。ascは省略可能です。
降順で取得する場合、descを付けます。

⑤住所一覧表示用のThymeleafの作成

8行目:form id="addressListForm" name="addressListForm"は、addressListFormクラスに紐づいています。
9行目~35行目:テーブル(table)タグです。
10行目~18行目:ヘッダ行です。

19行目~34行目:リスト数分だけ繰り返します。
住所情報をリストに設定します。

プロジェクト・エクスプローラーは以下の通りです。

注意点として、JavaのmapperとSQLのmapperは同じ階層にしないといけないルールがあります。
Javaのマッパーは
 ➡java/com/example/demo/mapper/AddressMapper.java
SQLのmapperは
 ➡resources/com/example/demo/mapper/AddressMapper.xml

これで、やっと準備が整いました。それでは、Bootダッシュボードから起動しましょう。
URLに、localhost:8080/listと打ちましょう。
以下の画面が表示すれば、成功です。今回は大変でしたね。お疲れ様です。

☆まとめ☆ 今回は、MyBatisについて学びました。
作業量が多かったので、大変だったかもしれません。
昔は、データベースのアクセスは、JDBC(Java DataBase Connectivity)というデータベースアクセス用のAPIを使ってアクセスしていました。
これは、Javaのソースに、SQL文の文字列を埋め込んで記述するやり方でした。
JavaのソースとSQLが分離できていないので読みにくいソースになってしまいます。
MyBatisを使うと、JavaソースとSQLを分離することができて、
メンテナンスし易くできることがメリットだと思います。

Follow me!