mybatisとは?
OR mapper for Javaの一種で、以下のような特徴がある。
- SQLをアノテーション内もしくはxmlファイル内に記述する
- 正規化されてないレガシーシステムにも適用しやすい
- SQLチューニングしやすいのでDBが性能ボトルネックになりやすいようなシステムにも適用しやすい
自分が担当しているプロジェクトで使用して半年たったので、良かった点や課題部分について記していく。
良かった点
SQLアクセスするために使うクラスがへる
JDBCの場合
- お約束として以下のようなクラスを使う
- DataSource
- Connection
- PreparedStatement
- ResultSet
- SQL発行処理が終わったら、Coneection, PreparedStatement, ResultSet を忘れず閉じる必要がある
mybatisの場合
- SQLアクセスに使うライブラリは以下の二つ
- SqlSessionFactory
- SqlSession
- 閉じるのはSqlSessionだけでよし
- 当然ながら、ResultSetからgetValue()してオブジェクトにsetして、は不要
SQLをXMLに書ける
JavaでSQL組み立てる時
StringBuffer sql = new StringBuffer();
sql.append("select * from table ");
sql.append("where id=? ");
sql.toString();
- これだとSQLだけ抜き出してちょっとWorkbenchとかpgAdminから実行したい、って時にすごくめんどい
MybatisのMapperXMLの場合
<select id="selectPerson" parameterType="int" resultType="hashmap">
SELECT * FROM PERSON WHERE ID = #{id}
</select>
- XMLタグ要素の中身として書けるので、ここだけ切り出してちょっと実行してみる、ってのが格段にやりやすい
SQLがロジック(Javaファイル)と完全に分離される
- ゆえに、SQLとロジックのステップ数を分離してカウントするのが容易
- うちらのプロダクトってSQLがロジックと同じだけステップ数あるで!DBおばけシステムやな!とかいう自虐ができる
悪かった点
XMLなのでeclipseのリファクタリング機能が使えない
- Modelクラス名変更しよう、とかいう時にソースをgrepして・・・と、スクリプト言語のようなことをする必要がある
XMLなのでカバレッジが取れない
- うちのプロジェクトではJacocoを使ってカバレッジを計測してるけど、当然Mapper XMLファイル内のカバレッジは計測できない
- XML内で、値が指定されている時だけwhere句を追加する、とかいうif文が書けるけど、これを全部網羅しているかがわからない
まとめ
- 大した洞察はしてませんが、概ねmybatisには満足しています
- レガシーアプリのメンテの際には、ぜひ検討してみてはいかがでしょうか