Reasonable Code

ほどよいコードを書きたい

Spring Framework

Spring BootでMyBatisを使ってみる

更新日:

Spring BootでMyBatisを使ったときのメモを残しておきます。具体的には、MyBatisを使ってSELECT文を発行し、結果をコンソールに表示するプログラムを作ります。今回使用するデータベース(H2)はメモリ上で利用するものなので、事前にMySQLやOracleといったクライアントを用意する必要はありません。

環境

今回使用した環境は以下のとおりです。

Javaのインストール方法は以下記事をご覧ください。

プロジェクトの雛形を作成する

まずはSpring Initializrでプロジェクトの雛形を作成します。Webからでも作成できますが、今回はコマンドでサクッと作成します。ポイントは、依存関係にMyBatisとH2(メモリ上で使えるDB)を追加しているところです。

プロジェクトのディレクトリ構造は以下のようになっているはずです。

SQLファイルを作成する

Spring Bootでは、アプリケーション起動時にschema.sqldata.sqlといったファイル名のSQLを実行してくれます。Spring Bootすごいですね。

今回は、schema.sqlCREATE TABLE文を、data.sqlINSERT文を定義します。これらのSQLは、H2(メモリ上で使えるDB)に対して発行されます。

src/main/resources/schema.sql

src/main/resources/data.sql

ドメインクラスを作成する

Getter, Setterが定義されたドメインクラスを作成します。

src/main/java/com/example/demo/City.java

Mapperインタフェースを作成する

SQLとドメインクラスを紐付けるMapperインタフェースを作成します。@Mapperを付与したインタフェースを定義し、メソッドにアノテーションを使ってSQL文を定義するだけです。インタフェースの実装はMyBatisが自動で行ってくれるので、自分で実装クラスを書く必要はありません。

src/main/java/com/example/demo/CityMapper.java

アプリケーションクラスを修正する

Mapperをインジェクションし、Mapperのメソッドを呼び出してやればOKです。CommandLineRunnerインタフェースの使い方については、以下記事をご覧ください。

Spring Bootで簡単なコマンドラインアプリケーションを作成してみる - Reasonable Code

src/main/java/com/example/demo/DemoApplication.java

アプリケーションクラスを実行すれば、SELECT文の結果(1,Osaka,Japan)がコンソールに表示されるはずです。

XMLファイルでSQLを定義する場合

Mapperインタフェース内でSQLをアノテーションで定義しましたが、XMLファイルに置き換えることも可能です。複雑なSQLを定義するときはXMLファイルに定義した方が可読性が高まりそうです。

まずは、Mapperインタフェース内でアノテーションを使ってSQL文を定義していた箇所を取り除きます。

src/main/java/com/example/demo/CityMapper.java

あとは、XMLファイルを作成し、SQL文を定義してやればOKです。

src/main/resources/com/example/demo/CityMapper.xml

各項目について簡単に補足しておきます。

  • namespace:Mapperの完全修飾名
  • id:Mapperのメソッド名
  • resultType:返却されるオブジェクトの型

XMLファイルでSQLを定義する場合も、アプリケーションクラスを実行すれば、SELECT文の結果(1,Osaka,Japan)がコンソールに表示されるはずです。

お疲れさまでしたー。

まとめ

Spring BootでMyBatisを使ってみました。想像以上に簡単にデータベースアクセスができてびっくりです。

ソースはGitHubに上げています。

donchan922/mybatis-sample

参考リンク

【RC】記事下記事内広告


-Spring Framework

Copyright© Reasonable Code , 2019 All Rights Reserved Powered by STINGER. App icon by icons8. Privacy Policy.