#想定読者
- MyBatisという言葉を聞いたことがあるが何者なのか知らない方
- MyBatisを使っているが他と比べて何が違うか知らない方
#MyBatisとは何か
mybatis.orgにはこう書かれています。
MyBatis はカスタム SQL、ストアドプロシージャ、高度なマッピング処理に対応した優れた永続化フレームワークです。
##永続化とは何か
Hatenaに聞いてみました。
ファイルやDBなど、プログラム終了後もデータが失われないような場所へのデータ保存を指す
オブジェクト指向プログラミングでは、あるクラスのインスタンスを生成し、メソッドを呼び出すことで特定の処理を実行します。例えば、ショッピングサイトであれば、注文やキャンセルなど様々な処理が考えられます。
当然のことならが、各処理の記録をデータとして長期的に記録する必要が出てきます。
しかし、インスタンスは主記憶装置上に生成されるため、プログラムの終了とともにその内容は消えてしまうのです。ゆえに、プログラムで実行された処理内容をデータベースに保存する処理(永続化)が必要となります。
##結局MyBatisとは何か
私なりにまとめると以下のようになりました。
オブジェクト指向言語におけるオブジェクトとデータベースに関する処理との対応づけを容易にする便利ツール
このようなフレームワークのことをO/Rマッパーといいます。
##O/Rマッパーとは何か
O/RマッパーとはO/Rマッピングを実現するライブラリやフレームワークのことです。
weblioに聞いてみました。
O/Rマッピングとは、オブジェクト指向言語におけるオブジェクトと、リレーショナルデータベースにおけるレコードとを対照させることである。ここでの「マッピング」とは「対応付ける」というほどの意味である。
O/Rマッピングによって、リレーショナルデータベースのレコードがオブジェクトとして直感的に扱えるようになり、リレーショナルデータベースにアクセスするプログラムを記述する処理を容易にすることが可能となる。
MyBatisもO/Rマッパーの一つということになります。
#コードから読み解くMyBatis
MyBatisではデータベースへの操作(SQL)をXMLに記載してJava側で呼び出します。
(Annotationも使用できますがここでは省略します)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
<select id="selectUser" resultType="User">
select * from Users where id = #{id}
</select>
</mapper>
MyBatisスタートガイドをもとに作成
ここではユーザーのIDをもとにユーザのデータをデータベースから取得するSQLを記載しています。
JavaでselectUser(任意のユーザID)を呼び出すことでSQLを実行し、取得した結果をresultTypeで指定したクラス(User)に代入できます。
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUser(16280001);
#MyBatisの特徴
MyBatisは、一般的なO/Rマッパーのようにデータベースのテーブル構造とオブジェクトをマッピングするのではなく、SQL文とオブジェクトをマッピングするという特質を持っています。
Java側ではSQLで取得するデータに着目すればよく、テーブル構造を意識する必要がないため柔軟性が高いといえます。
#Hibernateと比較してみる
代表的なO/RマッパーであるHibernateとMyBatisを比較してみましょう。
比較項目 | MyBatis | Hibernate |
---|---|---|
マッピング | SQL文とオブジェクト | テーブル構造とオブジェクト |
SQL | 手動作成 | 自動生成 |
##SQLの扱いの違いが意味すること
###手動生成
- SQLの細かいチューニングが可能
- SQL文によってはDBMSに依存する(特定のDBMSでしか使えない)
- 開発者がSQLを意識する必要がある
###自動生成
- 実際に発行されるSQLが非効率になる恐れがある(=細かいチューニングが不可能)
- 特定のDBMSに依存しない
- 開発者はSQLを意識しなくてよい
MyBatisを使用するということはSQLをガッツリ書かなければならないということです。
手間はかかるものの、開発者がSQLを完全にコントロールできるため、開発者が意図した通りのデータ操作を実現することができるのです。
#最後に
この記事では、有名なO/Rマッパーの一つであるMyBatisについて説明しました。
MyBatisの概要だけでもわかっていただけたのであれば幸いです。