MyBatis
MyBatis とは
MyBatis は、Java アプリケーションとリレーショナルデータベースの間を仲介する SQL マッパーフレームワークである。開発者が SQL を直接記述し、その SQL の実行結果を Java オブジェクトにマッピングする仕組みを提供する。元々は iBATIS という名前で Apache Software Foundation の下で開発されていたが、2010 年に MyBatis に改名された。
なぜ SIer で重要か
SIer の Java プロジェクトにおけるデータベースアクセスの手段として、MyBatis は最も広く採用されているフレームワークの一つである。SIer の業務システムでは複雑な SQL が頻繁に登場するため、SQL を直接制御できる MyBatis は現場のニーズに合致している。NTTデータの TERASOLUNA ガイドラインでも MyBatis が推奨されており、この点も SIer での普及を後押ししている。
基本概念
SQL マッパーの仕組み
MyBatis では、SQL を Mapper XML ファイルに記述し、Java の Mapper インターフェース とマッピングする。開発者は SQL を書き、MyBatis が JDBC の煩雑な処理(コネクション管理、パラメータバインド、結果セットのマッピング等)を自動で行ってくれる。
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
<select id="findById" resultType="com.example.model.User">
SELECT user_id, user_name, email, created_at
FROM users
WHERE user_id = #{userId}
</select>
<insert id="insert" parameterType="com.example.model.User">
INSERT INTO users (user_name, email, created_at)
VALUES (#{userName}, #{email}, #{createdAt})
</insert>
</mapper>
// UserMapper.java(Mapper インターフェース)
public interface UserMapper {
User findById(Long userId);
void insert(User user);
}
Mapper インターフェースのメソッドを呼び出すと、MyBatis が対応する XML の SQL を実行し、結果を Java オブジェクトに変換して返してくれる。
動的 SQL
MyBatis の大きな特徴の一つが動的 SQL のサポートである。検索条件が可変の場合、<if>、<choose>、<foreach> などのタグを使って条件に応じた SQL を組み立てられる。
<select id="search" resultType="com.example.model.User">
SELECT * FROM users
<where>
<if test="userName != null">
AND user_name LIKE #{userName}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
SIer の業務システムでは「検索画面で入力された条件に応じて SQL を組み立てる」というパターンが非常に多く、この動的 SQL の機能が大いに活躍する。
JPA / Hibernate との違い
Java のデータベースアクセスには MyBatis 以外に JPA(Jakarta Persistence API)とその代表的な実装である Hibernate がある。両者のアプローチは根本的に異なる。
| 観点 | MyBatis | JPA / Hibernate |
|---|---|---|
| 設計思想 | SQL 中心(SQL をそのまま書く) | オブジェクト中心(SQL を自動生成する) |
| SQL の制御 | 開発者が完全に制御する | フレームワークが自動生成する |
| 複雑なクエリ | 得意(SQL を直接書けるため) | 苦手(JPQL や Criteria API の制約がある) |
| 学習コスト | SQL の知識があれば低い | ORM の概念理解が必要で高め |
| テーブル設計への影響 | 少ない(既存テーブルにそのまま対応) | 大きい(エンティティ設計に合わせる必要がある) |
SIer での使われ方
SIer で MyBatis が好まれる理由
SIer の現場で MyBatis が広く採用されている理由は以下の通りである。
SQL の制御が可能
SIer の業務システムでは、パフォーマンスチューニングのために SQL を細かく制御したいケースが多い。JPA の自動生成 SQL では意図しない SQL が発行されることがあるが、MyBatis では開発者が SQL を直接記述するため、実行される SQL を完全に把握できる。
DBA との分業がしやすい
大規模プロジェクトでは DBA(データベース管理者)が SQL のレビューやチューニングを行う。MyBatis の Mapper XML は SQL がそのまま記述されているため、DBA が直接レビューしやすい。
複雑なクエリへの対応
業務システムでは、複数テーブルの結合や集計、サブクエリなど複雑な SQL が頻出する。MyBatis では SQL をそのまま書けるため、データベースの機能をフルに活用できる。
TERASOLUNA との関係
NTTデータの TERASOLUNA ガイドラインでは、データベースアクセスに MyBatis を推奨している。TERASOLUNA のガイドラインには MyBatis の使い方に関する詳細な規約やベストプラクティスが記載されており、NTTデータ系の案件では TERASOLUNA + MyBatis の組み合わせが事実上の標準となっている。
Spring との連携
MyBatis は Spring Framework と組み合わせて使うことが一般的である。mybatis-spring というライブラリを使うことで、Spring の DI コンテナから Mapper インターフェースを注入でき、トランザクション管理も Spring に委ねられる。Spring Boot では mybatis-spring-boot-starter を追加するだけで自動設定が行われる。
まとめ
- MyBatis は SQL マッパーフレームワークであり、開発者が SQL を直接記述して Java オブジェクトにマッピングする
- JPA / Hibernate がオブジェクト中心のアプローチであるのに対し、MyBatis は SQL 中心のアプローチを取る
- SIer の現場では SQL の制御性、DBA との分業のしやすさ、複雑なクエリへの対応力が評価されて広く採用されている
- TERASOLUNA ガイドラインでも MyBatis が推奨されており、SIer での標準的な選択肢となっている
- Spring Framework との連携も容易で、Spring Boot + MyBatis の組み合わせが一般的である