SpringBootでMyBatis使ってみた

Java

前回、JPARepositoryについて簡単な記事を書いたのですが

使ってみてやっぱり個人的にはMyBatisの方が好きなんでその紹介を兼ねて使ってみたいと思います。

JPARepositoryはORMでオブジェクトとRDBのテーブルを紐付けるフレームワークです。これも便利なんですが、既にテーブル設計ができていたりしてそのテーブルがオブジェクト指向で考えられてなかった場合は、アプリ側でそこを吸収してやらないといけなかったり

SQLを自動生成して実行するため、処理速度が遅かったりテーブル間結合がややこしく、SQL文を少しはやってきた私としてはJPAは使いにくかったです。

その点、

MyBatisはSQL Mapperと言われることもあって、SQL文とオブジェクトを紐付けてデータアクセスを行うフレームワークになります。

どういうことかというと、例えば、SELECT文で複数のテーブルを結合していくつかのカラムを取得するとします。その取得したカラムをフィールド変数にもつJavaクラスを作成し、紐づけることで、フィールド変数に取得した値をもつインスタンスが自動生成されます。これ、めちゃ画期的です!

いちいち、カラム1個ずつ値を取得してDataObjectみたいなオブジェクトに格納して、レスポンス返すときに取り出してってことをやらなくていいわけですから!

しかも!テーブル間結合はSQL文で書けるため、SQL文書いてきた人からすると使いやすいったらありゃしない

前置きは、このぐらいにしてMyBatisの使い方をみていきましょう!

前述した通り、MyBatisはSQL文とJavaクラスを紐づけて使用するんですが、その紐付け方が2通りあります。

・マッピングファイルによる紐付け

・アノテーションによる紐付け

今回は、マッピングファイルによる紐付けを紹介するので、アノテーションによる紐付けを軽く説明すると、

こんな感じで、アノテーションにSQL文を書き込んでしまうやり方です。

簡単なSQL文だったらこれで事足りるんですが、複雑なSQL文になってくるとStringを+で繋いでくことになるため、可読性が低くなってしまいます。個人的にあまり好きじゃない。

一方、マッピングファイルによる紐付けは、あとで詳しく説明しますが、xmlファイルにSQL文を外だしできます!

さらなる朗報として、SpringBootでMyBatisを使うと

SqlSessionTemplateのBean定義なんかもこっちがやる必要はなく全て自動でやってくれます!!最高すぎかよ!

ではでは、早速作っていきましょう!

手順は以下の通り。

1:dependencyの追加

2:DB関連の設定

3:Entityクラスの作成

4:Mapperインターフェースの定義とマッピングファイルの作成

5:Mapperインターフェースの利用

6:テンプレートの作成

1:dependencyの追加

pom.xmlにdependencyを追加していきます。

特筆すべきは「mybatis-spring-boot-starter」です!

これのおかげで、SqlSession関連の定義を自動で行うことができます!

あとは、よく見かけるものばかりです。

あ、ちなみに今回もDBはH2を使います。

2:DB関連の設定

次にDB関連の設定をしていきます。

まず、application.propertiesです。

H2の設定です。

DBのデータを保存するためのファイルを「main/resources/h2db」配下に「sampledb」として置いておきます。これ忘れるとアプリが起動しないので注意。

で、スキーマと初期データを登録するために、「main/resources」配下にそれぞれ、「schema.sql」と「data.sql」をおきます。

中身はこんな感じ。

3:Entityクラスの作成

次にEntityクラスを作ります

このクラスが、MyBatisで実行するSQL文と紐付くクラスとなります。

フィールド変数についているアノテーションはバリデーション用のものです。詳しくは、「SpringBoot JPARepositoryを使ってみた」をみて下さい。

4:Mapperインターフェースの定義とマッピングファイルの作成

ここからが本番です。

まず、Mapperインターフェースを作ります。

これだけでーす笑

@Mapperアノテーションをつけることで、SpringBootはこのクラスがMapperインターフェースだな!と判断します。MapperScanとかもしなくていいんですねー!楽チンだ!

で、実処理も書かないし、マッピングファイルによる紐付けを行うため、SQL文もここには書きません!

この次が大事なステップになります!マッピングファイルの作成です

何が大事かというと、このMapperインターフェースが存在するディレクトリ構成と全く同じディレクトリ構成を「main/resouces」配下に作成し、そこに同じファイル名で拡張子をxmlのファイルを作成します!

今回だと、こうです。

xmlファイル(マッピングファイル)の中身がこちら。

今回は、update,deleteは割愛します。

mapperタグのnamespace属性にマッピングするMapperインターフェースの名前空間を指定します。

その中にCRUDタグをつけていくって流れ。

このタグ内のid属性が、Mapperインターフェースのメソッド名になります。

続くresultTypeが紐づけるJavaクラス( Entity)の名前空間です。

で、タグ内にはSQL文をそのまま記述できます。

insertタグには、useGeneratedKeysとkeyPropertyって属性がありますね。

これは、主キーを自動生成しますということと

USRE_TABLEが持つidカラムが主キーですよっていう設定をしているんですね。

ちなみに、このINSERT分には、#{}で囲まれた値が3つありますよね。

これは何かというと、Mapperインターフェースを思い出して欲しいんですが

これ!引数にUserクラスを渡していますよね。Userクラスはフィールド変数に「id」「user_name」「phone」「age」を持っています。

idは自動生成なので、パス。そのほかの変数の値を#{}で参照できるんです!

このようにMapperインターフェースのメソッドの引数に値を渡してSQL文で使うことも簡単です。

5:Mapperインターフェースの利用

作成したMapperインターフェースの利用はこんな感じ

フィールドにMapperインターフェースをDIして使うんですね!

簡単すぎワロタ

あとは、このDAOクラスをリクエストハンドラーの「MainController」から呼びます。

このクラスで使用しているアノテーションに関しては、「SpringBoot JAPRepository 使ってみた」記事で説明しているので、今回は割愛!

DAOクラスをDIして、使用しているってとこがミソ。

6:テンプレートの作成

index.html

form.html

result.html

all.html

特筆すべきことは、何もないです笑

では、動かしてみます!

index.htmlはこんな感じです。

Get All UsersをクリックするとMapperインターフェースのgetAllメソッドが呼ばれます。

data.sqlにて初期登録したデータですね。

UIはめんどかったんで、スタイル何もいじってなくてダサいですが、悪しからず笑

次は、データを登録してみましょう。

Register A New Userをクリックしてデータを入力しRegisterボタンを押します

Get All Usersで確かめます!

増えてますね!

次は、あえてバリデーションエラーにしてみます!

なので、名前を空白にし、phoneを2桁とかにしてみます

はい、ちゃんとチェックされましたね!

この文字列を日本語にする方法とかは、「SpringBoot JPARepository使ってみた」という記事をみてください。

以上、MyBatisを使ってのデータアクセスでした!

BYE

コメント

タイトルとURLをコピーしました