MyBatisはSQLをゴリゴリ書きたい人のための永続化フレームワーク

Spring Frameworkについて調べていたら永続化フレームワークについてもセットで語られていたので、MyBatisについて読んでみる。

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.

永続化フレームワークというと「SQLを書かなくてもいいよ」というイメージだったが、MyBatisはSQLをゴリゴリ書けるようだ。

でも、それだったらJDBCで十分じゃないかというと、XMLやアノテーションでPOJOとデータベースの対応付けを少ないコードでできるということらしい。

String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);

上記は昔ながらのJDBCコード。SQL文のプリペアドステートメントを作って「?」に値を入れて返り値をオブジェクトにマッピングする。(上のコードでは「?」に値を入れるところまで)

<select id="selectPerson" parameterType="int" resultType="hashmap">
 SELECT * FROM PERSON WHERE ID = #{id}
</select>

MyBatisでは、このようなXMLを用意する。ここでresultType="hashmap"と書いているところがポイントで、こう書くだけで実行結果の取得も指定できる。同じようにデータベースとの接続条件や、その後の処理をXMLで細かく指定できる。

<select id="findActiveBlogWithTitleLike"
    resultType="Blog">
 SELECT * FROM BLOG
 WHERE state = ‘ACTIVE’
 <if test="title != null">
   AND title like #{title}
 </if>
</select>

SQLにifを入れるといったこともXMLで書ける。内部で、どのように動いているのだろう?

Tutorial Pointというサイトでは、MyBatisをHibernateと比べて下記のように表現している。

MyBatis is suggested in case −
- You want to create your own SQL's and you are willing to maintain them.
- Your environment is driven by relational data model.
- You have to work on existing and complex schemas.

リレーショナルDBがあって、既存のスキーマがあって、SQLを自分で書くような場合はMyBatisがいいと。

Use Hibernate, if the environment is driven by object model and needs to generate SQL automatically.

一方のHibernateはオブジェクトモデルで、SQLを自動生成したい場合に向いている。

一時期、SQLを自ら書くのは時代への逆行かのような雰囲気があったが、既存からの置き換えという需要も少なくはない。このように既存のSQLを利活用する場合はMyBatisが選択肢になりそうだ。


この記事が気に入ったらサポートをしてみませんか?