[Java] 脱・全自動?Springで「MyBatis」を使ってSQLを自在に操る方法

こんにちは。ゆうせいです。

前回は、魔法のようにSQLを自動生成してくれる「JPA」についてお話ししましたね。

「SQLを書かなくていいなんて最高!」と思った方も多いのではないでしょうか?

しかし、実際の開発現場に出ると、こんな声を聞くことがあります。

「JPAだと、複雑な検索が遅すぎる…」

「もっと細かいチューニングがしたいのに、勝手にSQLを作られると困る!」

そんなときに颯爽と登場するのが、今回紹介する MyBatis(マイバティス) です。

JPAが「全自動運転の車」だとしたら、MyBatisは「マニュアル運転のスポーツカー」のような存在です。

今回は、Spring Frameworkで愛され続けるこのMyBatisについて、JPAとの違いを明確にしながら解説していきます。


MyBatisとは?

MyBatisは、データベースとJavaをつなぐフレームワークの一つです。

JPAと同じく「O/Rマッパー(オブジェクトとリレーショナルの橋渡し役)」の仲間として扱われることが多いですが、厳密には少し性格が異なります。

MyBatisは、しばしば 「SQLマッパー」 と呼ばれます。

JPAは「Javaの命令をSQLに翻訳してあげるよ」というスタンスでしたが、MyBatisは「SQLはあなたが書いてね。でも、実行結果をJavaのオブジェクトに詰め替える面倒な作業はやってあげるよ」というスタンスなのです。

つまり、「SQLを書く自由」をプログラマーに残してくれる のが最大の特徴です。

JPAとMyBatisの決定的な違い

初心者の方が一番迷うのが、「結局、どっちを使えばいいの?」という点ですよね。

二つの違いを、身近な「引っ越し」で例えてみましょう。

JPA(おまかせパック)

引っ越し業者に「この家の中身を全部、新しい家に運んで」と頼むプランです。

業者が勝手にダンボールに詰め(SQL生成)、トラックで運び、新居に配置してくれます。

楽ちんですが、「この大事な皿は、新聞紙じゃなくてタオルで包んでほしい」といった細かい指定をするのは少し大変です。

MyBatis(自分で梱包プラン)

ダンボールへの箱詰め(SQL記述)は、すべて自分で行います。

業者は「詰め終わったダンボールを運ぶ(実行とマッピング)」だけを手伝ってくれます。

手間はかかりますが、「ここは厳重に」「ここは適当でいい」といったコントロールが自由自在です。

機能比較

わかりやすく表で整理してみましょう。

項目Spring Data JPAMyBatis
SQLの記述基本的に書かない(自動生成)自分で書く(必須)
難易度簡単な処理なら超簡単SQLの知識が必要
パフォーマンス自動生成のため、最適化が難しい場合がある自分で書くため、高速化(チューニング)しやすい
向いている場面単純な保存・更新が多いアプリ複雑な検索や帳票出力が多いアプリ

MyBatisの使い方(コードのイメージ)

では、SpringでMyBatisを使うとどうなるのか、実際の雰囲気を見てみましょう。

MyBatisでは、Javaの「インターフェース」と、SQLを書く「XMLファイル」の2つを使います。

1. Java側(Mapperインターフェース)

まず、「このメソッドを呼んだらSQLを実行したい」という定義を書きます。これを Mapper(マッパー) と呼びます。

@Mapper
public interface UserMapper {
    // ユーザーIDを使って、ユーザー情報を1件取得したい
    User findById(int id);
}

2. XML側(SQLを書く場所)

次に、上記のメソッドが呼ばれたときに実行するSQLを書きます。ここがMyBatisの真骨頂です。

<mapper namespace="com.example.UserMapper">
    <select id="findById" resultType="com.example.User">
        SELECT
            id,
            name,
            email
        FROM
            users
        WHERE
            id = #{id}
    </select>
</mapper>

ご覧ください。ガッツリと SELECT 文を書いていますよね?

「Javaのコードの中にSQLが混ざる」のではなく、「XMLという別のファイルにSQLを隔離できる」のがポイントです。

これにより、JavaエンジニアはJavaに集中し、DBエンジニアはXMLのSQLに集中する、といった分業もしやすくなります。

メリットとデメリット

現場でMyBatisを採用するかどうかの判断基準になる、メリットとデメリットを見ていきましょう。

メリット

  1. 複雑なSQLも自由自在「3つのテーブルを結合して、特定の条件で集計して…」といった複雑な処理も、SQLさえ書ければそのまま実行できます。JPAでこれをやろうとすると、非常に難解な設定が必要になることがあります。
  2. SQLのチューニングができる「この検索が遅いから、ヒント句を追加して高速化しよう」といった、データベース特有の細かい調整が可能です。大規模なサービスでは、これが命取りになることもあります。
  3. SQLの知識がそのまま活きるJPA特有のルールを覚えなくても、標準的なSQLを知っていればすぐに使いこなせます。

デメリット

  1. 書く量が多い(面倒くさい)単純な「保存(INSERT)」や「全件取得(SELECT ALL)」であっても、いちいちXMLにSQLを書かなければなりません。テーブル項目が50個あったら、50個分書く必要があります。
  2. コンパイルエラーになりにくいSQLを文字列(XML)として書くため、もしスペルミスをしていても、Javaのコンパイル時点では気づけません。実際に動かして初めて「エラーだ!」と気づくことになります。

今後の学習の指針

いかがでしたか?

「JPAがあればSQLなんていらない」と思っていた方も、「やっぱりSQLの知識は大事なんだな」と感じていただけたのではないでしょうか。

日本国内の開発現場(特に業務システムや大規模システム)では、MyBatisの採用率は依然として非常に高い です。

そのため、新人エンジニアとしては、JPAとMyBatisの両方を使えるようになっておくのが理想です。

これからの学習ステップとして、以下をおすすめします。

  1. SQLを復習するMyBatisを使うには、SQLが書けなければ始まりません。SELECT, INSERT, UPDATE, DELETE の基本はもちろん、JOIN(テーブル結合)についても理解を深めましょう。
  2. MyBatisで検索アプリを作る前回JPAで作ったアプリを、今度はMyBatisで書き換えてみてください。「自分でSQLを書く安心感」と「面倒くささ」の両方を体感することが大切です。
  3. 動的SQL(Dynamic SQL)を知るMyBatisには「もし検索条件に名前が入っていたら、WHERE句を追加する」といった、SQLをプログラムのように変化させる機能があります。これが使えると、MyBatisがもっと楽しくなります。

「自動のJPA」と「手動のMyBatis」。

適材適所で使い分けられるエンジニアを目指して、まずはSQLの海に飛び込んでみましょう!

それでは、また次の記事でお会いしましょう。

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。