2024.09.20 コラム

MyBatisによる基本的なDBアクセス

こんにちは。松山本社のOGです。

以前、社内勉強会「java(Spring Framework)を使ったwebアプリ開発」にて使用した、「MyBatis(MyBatis Generator)」が非常に便利だったので、そちらを利用した基本的なDBアクセスをご説明いたします。

MyBatisとは

MyBatis はカスタム SQL、ストアドプロシージャ、高度なマッピング処理に対応した優れた永続化フレームワークです。

と記載がある通り、オブジェクト指向言語(Java)上のオブジェクトとデータベースを紐づけ(O/Rマッピング)て、プログラムで編集したオブジェクトをデータベースに登録や更新(永続化)をしてくれるフレームワークとなります。
まぁ、SQLを書かなくてもフレームワークのお作法に則れば、Javaの記述だけでデータベースと値のやり取りができるよーって思っておけば良いかと思います。

システム概要図

開発環境について

Java 1.8
Spring Framework 4.3.1.RELEASE
MyBatis 3.4.0
MyBatis-Spring 1.3.0
MySQL 5.7
Pleiades 4.6(Eclipse 4.6 Neon)
 Spring Tool Suite(Eclipseプラグイン)
 MyBatis Generator(Eclipseプラグイン)

上記に、勉強会で使用したシステム概要図と開発環境を記載しております。
本ブログでは、以下のパッケージの内容について簡単にご説明いたします(環境の構築手順につきましては、今回は説明範囲外とさせていただきます)。

mapper

MyBatis Generatorにて自動生成されるソース。
DBの基本的操作が記載されている。

model

MyBatis Generatorにて自動生成されるソース。
テーブルと対となるデータクラス。

service

ビジネスロジックを記載するソース。
上記mapper(自動生成)を「@Autowired」で宣言し、MyBatisを利用したDBアクセスを行う。

下記テーブルを想定し、以降の説明を致します。

テーブル名:HOGE_PIYO

カラム名 属性 Null
許可
初期値 コメント
DATA_KEY VARCHAR(14) No (null) 主キー
DATA_TYPE VARCHAR(2) Yes (null) 種別
DATA_NUM INT No 0 種別
ACCESS_DATETIME DATETIME Yes (null) アクセス日時

mapperについて

MyBatis Generator(Eclipseプラグイン)により自動生成されるソース群です。
Javaファイル(インターフェイス)とXMLファイル(SQL)の2セット生成され、基本的なDBアクセスおよび検索条件設定クラスが記述されます。

注意事項

自作のSQLを記載することも可能ですが、MyBatis Generatorが起動されるたびに削除~再作成されるため、自動生成部分の改造は不可となります。
また、MyBatis Generatorは、コメント欄に「@mbggenerated」が存在するメソッド等を自動生成部分と判定し削除するため、各自で追記したSQLのコメント欄に「@mbggenerated」の文言を記載しないでください。
そうしないと、MyBatis Generatorが起動されると、せっかく書いたSQLはキレイに削除されてしまいます。
特に自動生成部分を流用する際は注意が必要です。

命名規約

MyBatis Generatorは、下表のようにテーブル名を元に各単語の先頭を大文字にするパスカルケースで、各ファイルを生成します。

テーブル名 インターフェイスファイル名 XMLファイル名
HOGE_PIYO HogePiyoMapper.java HogePiyoMapper.java

 

自動生成されるテーブルアクセスのメソッド一覧

MyBatis Generatorで自動生成されるテーブルアクセス用のメソッドを、下表に記述します。

メソッド 説明
long countByExample(HogePiyoExample example) long countByExample(HogePiyoExample example)
HogePiyo selectByPrimaryKey(String dataKey) 引数で指定された主キーのレコードを返却する(レコードが無い場合は、Nullを返却)。
List<HogePiyo> selectByExample(HogePiyoExample example) 引数で指定された検索条件での検索結果(複数レコード)を返却する(レコードが無い場合は、0個のListを返却)。
int insert(HogePiyo record) 引数で指定されたレコードを登録する。※1
int insertSelective(HogePiyo record) 引数で指定されたレコードを登録する(Nullの項目はSKIPする)。※1
int updateByExample(HogePiyo record, HogePiyoExample example) 引数で指定されたレコード、条件で更新する。※1
int updateByExampleSelective(HogePiyo record, HogePiyoExample example) 引数で指定されたレコード、条件で更新する(Nullの項目はSKIPする)。※1
int updateByExampleSelective(HogePiyo record, HogePiyoExample example) 引数で指定されたレコードを主キーで更新する。※1
int updateByPrimaryKeySelective(HogePiyo record) 引数で指定されたレコードを主キーで更新する(Nullの項目はSKIPする)。※1
int deleteByExample(HogePiyoExample example) 引数で指定された条件でレコードを削除する。※1
int deleteByPrimaryKey(String dataKey) 引数で指定された主キーでレコードを削除する。※1

※1:戻り値は、各SQLの処理件数が返却される。

modelについて

MyBatis Generator(Eclipseプラグイン)により、各テーブルと対となるデータクラスが自動生成されます。
基本、各テーブルに対応したデータクラスと、そのテーブルを検索するための検索データ格納用データクラスの2セット生成されます。

注意事項

こちらもmapper同様に、自作のmodelを記載することも可能ですが、MyBatis Generatorが起動されるたびに削除~再作成されるため、自動生成部分の改造は不可となります。
また、MyBatis Generatorは、コメント欄に「@mbggenerated」が存在するメソッド等を自動生成部分と判定し削除するため、各自で追記したmodelのコメント欄に「@mbggenerated」の文言を記載しないでください。
そうしないと、MyBatis Generatorが起動されると、せっかく書いたコードはキレイに削除されてしまいます。
特に自動生成部分を流用する際は注意が必要です。

命名規約

MyBatis Generatorは、下表のようにテーブル名を元に各単語の先頭を大文字にするパスカルケースで、各ファイルを生成します。

テーブル名 テーブルデータクラスファイル名 検索データクラスファイル名
HOGE_PIYO HogePiyo.java HogePiyoExample.java

serviceについて

ビジネスロジックを記載するクラスとなります。
基本、コントローラより呼ばれ、各メソッド単位でのトランザクションが行われます。
トランザクションを行いたいメソッドにアノテーション「@Transactional」を記載することでSpringFrameworkにてトランザクションの管理を実施してくれます。

トランザクション動作(デフォルト)

メソッド呼ばれた際に、トランザクション開始(すでに開始されている場合は、そのトランザクションを利用)
正常終了でコミット
異常終了(RuntimeExceptionが発生)でロールバック

また、MyBatisを使用してDBアクセスする際は、そのアクセスが記述されているmapperを「@Autowired」指定で宣言すれば、SpringFrameworkがmapper&XMLに従ってインスタンスを生成してくれます(new演算子によるインスタンス生成を行わなくても、使用することが可能)。
以下に、serviceクラスならびに、SELECT/INSERT/UPDATE/DELETEの各サンプルソースをUPしておきます。

最後に

以上が「MyBatis(MyBatis Generator)」を利用した基本的なDBアクセスの説明となります。
DBアクセス部分のみ掻い摘んでの説明となってしまい、分かりづらい箇所も多数あったかと思いますが、非常に便利なフレームワークかと思います。
また、SpringFrameworkと連係することで、DBのコネクションやトランザクション制御など気にせずにプログラムを記載することができますので、Webアプリを構築する際には「MyBatis(MyBatis Generator)」の導入を考慮してみてはいかがでしょうか?