.net column

.NET開発者のためのブログメディア

MyBatisを利用するコツ12個!Mapperファイルの扱い方

2020年06月04日

SE
MyBatisを利用するコツには、どのようなものがあるでしょうか?

PM
のコツは複数あるので、詳しくご紹介していきましょう。

MyBatisとはどんなフレームワーク?

MyBatisは、オブジェクト指向マッピングでデータベースへのアクセスをコントロールする永続化フレームワークで、カスタムSQL、ストアドプロシージャや高度なマッピング処理などに対応しています。MyBatisを利用すると、Javaでデータベースのアクセス時に行うコーディングやクエリに関する記述をサポートしてくれて、個々に記述する必要がなくなります。オブジェクト指向アプリケーション開発で、リレーショナルデータベースを扱う場合に、実装を容易にできます。

MyBatisを利用するコツ12個

Mybatisとは、同じオブジェクト指向マッピングのHibernateと違って、設定ファイルの中でSQL文を記述するタイプのORMフレームワークです。MyBatisではSQLコーディングができるため、開発の手数は増えてしまいますが、クエリのチューニングなどはやりやすく、カスタマイズして性能を追求する場合にはおすすめです。ここでは、MyBatisを利用するにあたって、より効率を上げられるやり方、ほかのフレームワークと異なる点などについて、使う際のコツをご紹介します。

利用するコツ1:Mapperファイルの扱い方

MyBatisで設定するMapperファイルでは、その各々の要素の中で多くの機能を実現しており、ここをうまく扱うのがJavaプログラミングの効率を上げるコツです。Mapperファイルのステートメントとパラメータをうまく設定することで、クエリ引数やクエリ結果の取得について、記述を1割程度に抑えることができます。Mapperファイルの扱いについては、インターフェースと同一パッケージに配置する、ファイル名の付け方やインターフェースとの紐付けの仕方などいくつかのコツがありますので、ご紹介します。

インターフェースに対応しているか確認

MyBatisでは、mapperファイルがインターフェースに対応していない場合、エラーになります。インターフェースに対応するmapperファイルが見つからない場合は、初期化する段階でエラーになるので、アプリケーションが起動できません。mapperファイルが存在しないとエラーになりますが、逆にインターフェースが存在しない場合はエラーになりません。

インターフェースとの紐付け方

MyBatisで、インターフェースとMapperファイルを紐づける場合は、Namespace属性でインターフェースのFQCNを指定することで紐づけることができます。FQCNは、異なるクラスのパッケージを紐づける場合に使用するクラス名です。クラス名の先頭にパッケージをつけることで、完全限定クラス名(Fully qualified class name)として使えます。

インターフェースと同一パッケージに配置

MyBatisでMapperファイルを読み込む場合には、インターフェースと同じパッケージになるように配置するのがお勧めです。ほかにもMyBatisでMapperファイルを読み込む方法はありますが、同じパッケージに配置するのが一番簡単で、間違いのないやり方です。

インターフェースと同一のファイル名で作成

MyBatisでインターフェースとMapperファイルの関係がわかるようにするため、インターフェースとMapperファイルは同じファイル名で作成します。ただし、同じファイル名にしても紐付けされるわけではなく、実際の紐づけはNamespace属性でインターフェースのFQCNを指定することで行われます。

利用するコツ2:メソッドとSQLを紐付け方

MyBatisでメソッドとSQLを紐づけるには、CRUDに対応したXMLタグで、id属性にインターフェースのメソッド名を指定すれば可能です。インターフェースのメソッドとSQLが紐づけられていれば、メソッドが呼び出された時に指定したSQLが実行されます。

利用するコツ3:引数データ型の特定方法

MyBatisで、引数データ型を特定するには、引数が1つの場合と複数の場合で変わってきます。引数のデータ型は、FQCNかタイプエイリアスを使用する場合は、エイリアスで指定でき、記述量を減らすことができます。汎用のJavaタイプには、事前にエイリアスが設定されていますが、プリミティブ型の場合は表記が特殊になります。引数が一つの場合と、複数の場合について説明します。

利用するコツ4:メソッド引数が1つの場合

MyBatisで、メソッド引数が一つの場合に引数のデータ型を特定するためには、parameterType属性に引数のデータ型を指定することで実現できます。記入するデータ型はエイリアスを使用することができるため、記述の量を減らすことができます。

利用するコツ5:メソッドの引数が複数の場合

MyBatisでメソッドの引数が複数ある場合、それぞれの引数のデータ型は異なる可能性があります。MyBatisでメソッドの引数が2つ以上ある場合は、どのparameterType属性にどの引数が対応するのかわからないので、parameterType属性は指定しないでください。

利用するコツ6:検索(READ)のSQLの指定方法

MyBatisで、検索(Read)でSQLを指定するには、戻り値のデータ型の特定が必要なので、resultType属性に戻り値のデータを指定してください。resultType属性は、登録(Create)、更新(Update)、削除(Delete)に関しては指定しないでください。

利用するコツ7:複雑なマッピングが必要なときは?

MyBatisで複雑なマッピングを行いたい場合は、resultMap属性に別に定義している要素のid属性を指定してください。MyBatisでは、標準の状態で一般的なマッピングは自動で行われますが、それ以外のデータマッピングを行いたい場合や、ネストしたクラスに戻り値をマッピングしたい場合、1対多のコレクションを同時にマッピングするような場合はresultMap属性を使用します。

利用するコツ8:resultType属性に戻り値のデータ型を指定

MyBatisでresultType属性に戻り値のデータを指定するのは、検索(Read)のSQLで戻り値のデータ型を特定したい場合です。検索(Read)以外の登録(Create)や更新(Update)、削除(Delete)の場合には、ResiltType属性は指定しません。また、複雑なマッピングを行う場合はresultMap属性を指定しますが、その場合はresultType属性は指定しません。両方とも記述された場合は、resultMap属性が優先されます。

利用するコツ9:インターフェースのメソッドの戻り値の設定方法

MyBatisでインターフェースのメソッドの戻り値を設定する場合は、検索(Read)のSQLのならresultTypeで戻り値を設定し、複雑なマッピングが必要な場合は、resultMap属性で戻り値のデータ型を設定します。戻り値を指定する時に、resultType属性とresultMap属性は同時に使用することはできません。

利用するコツ10:戻り値指定で同時に利用しない方が良い属性

MyBatisで戻り値を得るには、resultType属性かresultMap属性を使用しますが、この二つは同時に利用することはできません。通常はresultType属性を利用し、resultType属性では対応できない場合にresultMap属性を使用します。resultType属性とresultMap属性を同時に設定してしまった場合は、resultMap属性で指定された内容が優先されます。

利用するコツ11:メソッド引数における付与方法

MyBatisにおいて、メソッド引数が複数の場合、読みやすさと保守性を考えて、@Paramアノテーションを引数に付与しましょう。メソッド引数が複数の場合は、@Paramアノテーションを付与した方がわかりやすくなるのですが、メソッド引数が一つの場合は、Mapperファイルの記述で間違いが起こる可能性もあるので、@Paramアノテーションを付与しないのがお勧めです。

利用するコツ12:「>」や「<」はエスケープ処理をする

MyBatisで使用するMapperファイルはXMLファイルなので、「>」や「<」を使用する場合はエスケープ処理が必要です。XMLファイルでは、タグの記述に「>」や「<」を使用するので、「>」や「<」を別の文字列に置き換えて記述するのですが、これがエスケープ処理です。「>」を表示する場合には「>」を、「<」を表示する場合には「<」という文字列で記述すれば、Mapperファイルの中で「>」や「<」を利用することができます。

MyBatisの2つのメリット

MyBatisという永続化フレームワークは、ストアドプロシージャや高度なマッピング処理に対応しており、コードの記述やクエリ引数やクエリ結果の取得を自動化して、大幅に開発工数を削減することができます。ここではJDBCコードを直接書けるメリットと、クエリ引数やクエリ結果の設定の簡略化のメリットについてご紹介します。

メリット1:JDBC を扱うコードを直接記述できる

MyBatisでは、JDBCを直接記述でき、JDBC単体で使用するよりも容易にデータベースとアプリケーションを接続することができます。JDBCは、Javaがリレーショナルデータベースにアクセスするための標準Java APIで、JDBCを使うことでデータベースへの接続やSQLの実行、データベースからの結果取得が行えます。MyBatisのXML形式の設定ファイルに含まれている基本設定には、JDBCで行う作業がすでに入っており、SqlSessionFactoryを生成します。

メリット2:クエリ引数・結果の設定の手間がない

MyBatisのMapper XMLファイルのMapped Statementのおかげで、クエリ引数やクエリ結果の取得について、JDBCの1割ほどの記述で実現することができます。Mapper XMLファイルに設定をしておくことで、細かいコーディングをすることなくクエリ引数を設定することができ、resultMap要素を使うことでクエリ結果の取得のためのコードを9割ほど減らすことができます。必要があれば、属性を指定することで細かいステートメントの設定が可能です。

SE
MyBatisを利用することで効率化が期待できるのですね。

PM
そうですね。より短時間で品質の高いアプリケーションの作成を目指しましょう!

MyBatisを利用しよう

MyBatisはJavaとリレーショナルデータベースに紐づける機能を持った、XMLベースの永続化フレームワークです。XMLベースのため、記述したSQL文を普通のオブジェクトと組み合わせることができます。MyBatisを利用することで、Javaでリレーショナルデータベースを利用する手順を大幅に効率化できます。MyBatisを理解して、より短時間で品質の高いJavaアプリケーションを作成していきましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)