MyBatis を Spring Boot で利用するための基本的な設定およびサンプルコードをまとめます。サンプルコードにおいては、特に MySQL を対象とします。
公式の解説動画
サンプルプロジェクト構成
基本的な Gradle プロジェクトです。
build.gradle
org.mybatis.spring.boot:mybatis-spring-boot-starter
のバージョンは spring-boot-gradle-plugin
によって自動解決されないため、こちらのページをもとに調べて指定する必要があります。今回は 1.3.0 を利用します。
src/main/resources/application.yml
MySQL DB 接続情報を設定します。
src/main/resources/{schema|data}.sql
出力先 MySQL テーブルの DDL および DML です。こちらのページに記載されているとおり、schema.sql および data.sql というファイル名の SQL がアプリケーション起動時に実行されます。より柔軟かつ高度な初期化処理が必要な場合は Flyway と連携するように設定します。
schema.sql
data.sql
src/main/java/hello/Application.java
src/main/java/hello/City.java
Getter/Setter が定義されたドメインクラスです。Lombok の @Data
などを利用すると簡潔な記述が可能になりますが、今回は使用していません。
src/main/java/hello/CityMapper.java
@Param
アノテーションは、今回のようにパラメータが一つの場合は指定しなくても問題ありませんが、複数パラメータが存在する場合は SQL クエリ内のパラメータとメソッド引数の対応関係を設定するために指定する必要があります。また、ここでは @Select
アノテーションで SQL を設定していますが、より柔軟な設定を行うためには後述の XML ファイルを利用します。
src/main/java/hello/HelloController.java
cityMapper.findByState()
および sqlSession.selectOne()
を利用する例です。実際にはコントローラ内で直接利用するのではなく、@Service や @Repository を設定したクラス内で利用します。
XML による SQL 設定
サンプルプロジェクトにおいて、アノテーションで設定していた箇所を XML ファイルに置き換えると以下のようになります。
src/main/java/hello/CityMapper.java
src/main/resources/hello/CityMapper.xml
SQL 設定のサンプル集
凡例
適宜 @Param
設定を設定してください。返り値も適宜 List<City>
に変更してください。
動的 SQL
if
choose
いずれか一つだけ選択されます。switch-case 文のようなものです。
where
where
を利用すると、条件に一つも合致しない場合は何も挿入されず、合致した最初の条件が AND や OR から始まる場合は取り除かれます。以下の例で name も state も指定しないと city が全件返されます。state だけ指定すると AND が削除されて WHERE 句が挿入されます。
trim
where
のような機能をカスタマイズして実現したい場合は trim
を利用します。where
のサンプルコードを trim
で記述すると以下のようになります。
set
UPDATE 文について、set
を利用すると合致した最後の条件が ,
で終わる場合は取り除かれます。where
の場合と同様に trim
で同等の機能を実現できます。
foreach
bind
一時変数を定義できます。引数も参照できます。
静的 SQL
select
ここまでのサンプルで利用してきた、独自に定義した City 以外にも、基本的な resultType
が予め用意されています。例えば hashmap
を利用すると以下のようになります。
Mapper interface
XML
利用例
insert
Mapper interface
XML
useGeneratedKeys
MySQL のAUTO_INCREMENT
などを利用したい場合keyProperty
設定したuseGeneratedKeys
の対象となる列名
利用例
前述の foreach
と合わせて利用する例は以下のようになります。
Mapper interface
XML
利用例
update
前述の set
を利用せずに update を記述すると以下のようになります。
Mapper interface
XML
利用例
delete
Mapper interface
XML
利用例
sql (部分的な SQL 文)
sql
を利用すると、SQL 文をパーツ化して使い回すことができます。例えば、以下のクエリは無理矢理三つの設定に分解できます。
↓
resultMap
resultMap
を利用すると、SQL の結果列と Java オブジェクトのプロパティの対応関係を設定できます。以下のような基本的な場合であれば自動で対応関係が解決されるため設定は不要ですが、無理矢理 name
列を name
, state
, country
プロパティに対応させるための設定を行いたい場合は以下のようになります。
↓
resultMap を利用した JOIN クエリの記述の準備
resultMap
の主な用途は JOIN クエリの結果のマッピングです。
JOIN 対象となるデータの準備
schema.sql
data.sql
結果の確認
ドメインモデル
既出の City に people
を追加しました。今回 Person を新規追加します。
City.java
Person.java
JOIN クエリの XML 設定例
Rails の ActiveRecord における「belongs_to
に相当する association
」と「has_many
に相当する collection
」のサンプル設定を記載します。
association (belongs_to)
上記 resultMap
は分割して設定することができます。
collection (has_many)
実行例
MyBatis Generator (補足)
MyBatis の SQL 設定 XML ファイルの雛形を、DB のスキーマ情報から自動生成するプラグイン MyBatis Generator を利用すると、初期設定の手間が軽減されます。
build.gradle
src/main/resources/autogen/generatorConfig.xml
実行例
結果ファイル
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- Spring Security フォームログインのサンプルコードSpring フレームワークによる Web アプリケーション開発で、ログイン処理を実装する際は Spring Security が便利です。ここでは特に Spring Boot で Web アプリケーションを開発する場合を対象とし、フォームによる ID/Password ログインを行うためのサンプルコードをまとめます。 公式ドキュメント [Spring Security チュートリアル](http...
- Java配列の宣言方法 (C/C++との違い)Javaの配列 Javaの配列宣言方法はC/C++と似ているようで若干異なる。 初期化しない場合 C/C++の int array[10]; はJavaでは int array[] = new int[10]; となる。同様にC/C++の int array[3][3]; はJavaでは int array[][] = new int[3][3]; となる。 初期化
- PlantUML による UML 図の描き方PlantUML はテキスト形式で表現されたシーケンス図やクラス図といった UML (Unified Modeling Language) 図の情報から画像を生成するためのツールです。簡単な使い方をまとめます。 インストール方法の選択 Atom や Eclipse のプラグインをインストールしてエディタから利用する方法、JAR をダウンロードして Java コマンドで実行する方法、Redmine ...
- Akka HTTP サンプルコード (Scala)Akka アクターを用いて実装された汎用 HTTP フレームワークです。Spray の後継です。コアモジュールである akka-http-core は 2016/2/17 に experimental が外れました。akka-http などのいくつかのサブモジュールは 2016/3/1 現在 experimental のままですが、基本的な
- Kestrel の使用例Kestrel は Message Queue (MQ) の実装のひとつです。一般に MQ はアプリケーション間やプロセス間、スレッド間で非同期に通信するために用いられます。メッセージの送信側は MQ に書き込めば受信側の応答を待たずに次の処理に非同期に進むことができます。Kestrel はわずか 2500 行程の Scala で実装されており JVM で動作します。MQ 自体はメモリ上に存在する...