LoginSignup
9
5

More than 5 years have passed since last update.

mybatisを半年使ってみて思ったことを書く

Posted at

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には満足しています
  • レガシーアプリのメンテの際には、ぜひ検討してみてはいかがでしょうか
9
5
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5