はじめに
この記事は自分の学習用、備忘録として書いてるものです。
もし内容に間違いなどがあればご指摘ください。
この記事で扱う学習範囲
今回の範囲は、Webアプリとデータベースをつなぐ部分。
構成としては以下のイメージ。
Webアプリ
↓
Spring Bootプロジェクト
↓
MyBatis
↓
DBMS
↓
MySQL
つまり、JavaのWebアプリからDBに対して、検索・登録・更新・削除を行うための仕組みを学ぶための基礎知識をまとめた。
前提知識
この内容を理解するには、最低限以下の知識が必要。
- Javaの基本文法
- インスタンス生成
- メソッド呼び出し
- HTML / CSSの基礎
- SQLの基礎
- Spring Boot / Spring MVC / DIの基礎
MyBatisはDB操作に関わるため、特にSQLの理解が重要になる。
MyBatisとは
MyBatisは、Javaアプリケーションとデータベースをつなぐためのフレームワーク。
JavaアプリからDBのデータを読み書きする場合、何らかのDBアクセスの仕組みが必要になる。
代表例は以下。
Java標準 → JDBC
Spring系 → Spring JDBC
Spring系 → Spring Data JPA
SQL重視 → MyBatis
MyBatisはこの中でも、SQLを直接書いてDB操作することを重視したフレームワーク。
ORMとは
ORMは、Object-Relational Mapping の略。
簡単に言うと、Javaのオブジェクトと、RDBのテーブルとのデータ変換を簡単にする技術。
Javaのオブジェクト
↕
ORM
↕
DBのテーブル
Javaではデータをオブジェクトとして扱う。
一方、DBではデータをテーブルとして扱う。
この違いを埋めるのがORM。
一般的なORMの特徴
一般的なORMでは、JavaのオブジェクトとDBのテーブルをマッピングする。
たとえば、以下のようなイメージ。
Userクラス → usersテーブル
Taskクラス → tasksテーブル
Orderクラス → ordersテーブル
メリット
- SQLを書かなくてもDB操作できる
- 単純なCRUD処理を簡単に書ける
- Javaのオブジェクト操作に近い感覚でDBを扱える
デメリット
- 複雑なSQLを書きにくい
- パフォーマンスチューニングが難しい場合がある
- 実際にどんなSQLが発行されているか意識しづらい
MyBatisの位置づけ
MyBatisも大枠ではO/Rマッピングフレームワークに分類される。
ただし、一般的なORMとは考え方が少し違う。
MyBatisは、オブジェクトとテーブルを直接マッピングするというより、オブジェクトとSQLをマッピングする。
Javaのオブジェクト
↕
MyBatis
↕
SQL
↕
DBのテーブル
そのため、MyBatisは SQLマッパーフレームワーク と呼ばれることもある。
MyBatisの一番重要な特徴
SQLを開発者が直接書く
ここがJPAなどの一般的なORMとの大きな違い。
SQLを直接書くので、複雑な検索条件やJOIN、パフォーマンスを意識したSQLを書きやすいらしい。
MyBatisの特徴まとめ
| 項目 | 内容 |
|---|---|
| マッピング対象 | オブジェクトとSQL |
| SQLの管理 | SQLを直接記述する |
| SQL知識 | 必要 |
| 柔軟性 | 高い |
| パフォーマンス調整 | しやすい |
| 向いている場面 | 複雑なクエリが多いプロジェクト |
| 注意点 | SQLを理解していないと使いこなせない |
MyBatisが向いているケース
MyBatisは、以下のようなプロジェクトで効果を発揮する。
- 複雑なSQLが多い
- JOINが多い
- 検索条件が多い
- DB依存の処理が多い
- パフォーマンスを意識したSQLを書きたい
- 自動生成SQLではなく、自分でSQLを制御したい
業務システムでは、単純なCRUDだけでなく、複雑な検索や集計が必要になることが多い。
そういう場面では、SQLを直接書けるMyBatisは使いやすい。
MyBatisを使うメリット
1. SQLを自分で制御できる
MyBatisではSQLを直接書くため、どんなSQLが実行されるか明確になる。
SELECT *
FROM users
WHERE name = #{name}
フレームワーク任せではなく、自分でSQLの内容を確認できる。
2. 複雑なSQLに対応しやすい
業務システムでは、単純な1テーブル検索だけではなく、複数テーブルをJOINする処理がよくある。
MyBatisなら、複雑なSQLもそのまま書ける。
SELECT
u.id,
u.name,
o.order_date
FROM users u
JOIN orders o
ON u.id = o.user_id
WHERE u.id = #{userId}
3. パフォーマンスチューニングしやすい
SQLを直接書けるので、無駄なカラム取得を避けたり、JOIN条件を調整したりできる。
SELECT id, name
FROM users
WHERE status = 'ACTIVE'
必要なカラムだけ取得する、条件を工夫するなど、SQLレベルで改善しやすい。
JPAとの違い整理
| 観点 | JPA | MyBatis |
|---|---|---|
| 考え方 | オブジェクト中心 | SQL中心 |
| SQL | 自動生成が多い | 自分で書く |
| 学習対象 | Entity、Repository、永続化コンテキストなど | Mapper、SQL、DTOなど |
| 複雑なSQL | 書きにくい場合がある | 書きやすい |
| SQLの見通し | 隠れやすい | 見えやすい |
| 向いている処理 | 単純なCRUD中心 | 複雑な検索・業務SQL中心 |
MyBatisは「SQLを自分で書いて制御したい場合」に向いている。
まとめ
MyBatisは、Spring BootアプリからDBを操作するためのフレームワーク。
一般的なORMのようにSQLを完全に自動生成するというより、開発者がSQLを直接書き、そのSQLとJavaのオブジェクトをマッピングする。
そのため、SQLの知識は必要になるが、複雑なクエリやパフォーマンスを意識したDB操作に対応しやすい。
Spring Bootで業務アプリを作る場合、単純なCRUDだけでなく、検索条件が多い画面や複雑なJOINが必要になることがある。
そういう場面でMyBatisを使うと、SQLを明確に管理しながらDBアクセス処理を書ける。