マッパーは MyBatis の最も重要かつ複雑なコンポーネントであり、インターフェイスと対応する XML ファイル (または注釈) で構成されます。以下のように設定できます。
- マッピングルールについて説明します。
- SQL ステートメントを提供し、SQL パラメーターの型、戻り値の型、キャッシュの更新、その他の情報を構成できます。
- キャッシュを構成します。
- 動的SQLを提供します。
このセクションでは、マッパーを実装する 2 つの方法、XML ファイルの形式と注釈の形式について説明します。ただし、その前に、次の SQL ステートメントでロール テーブルを作成します。
CREATE TABLE `ロール` ( `id` bigint(20) NOT NULL、 `role_name` varchar(20) デフォルト NULL、 `note` varchar(20) DEFAULT NULL、 主キー (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
次に、以下に示すように、非常に単純な POJO を定義します。
パッケージcom.mybatis.po; パブリック クラス ロール { プライベートロングID; プライベート文字列ロール名; プライベート文字列メモ。 /**セッターとゲッター**/ }
マッパーの主な機能は、SQL クエリの結果を POJO にマップするか、POJO のデータをデータベースに挿入し、キャッシュに関する重要な内容を定義することです。
開発は単なるインターフェイスであり、実装クラスではないことに注意してください。初心者にとっては、インターフェースが機能しないのではないかという大きな疑問があるかもしれません。
はい、インターフェイスは直接機能しません。MyBatis は動的プロキシ テクノロジを使用してインターフェイスの実行を可能にします。開始段階では、MyBatis がこのインターフェイス用のプロキシ オブジェクトを生成し、プロキシ オブジェクトが関連ロジックを処理することを理解するだけで済みます。
XML でのマッパーの実装
XML でのマッパーの定義は、インターフェイスと XML の 2 つの部分に分かれています。まず、以下に示すようにマッパー インターフェイスを定義します。
パッケージcom.mybatis.mapper; com.mybatis.po.Role をインポートします。 パブリックインターフェイスRoleMapper { public role getRole(Long id); }
XML で SqlSession を作成するための構成ファイルには、次のようなコードがあります。
<mapper resource="com/mybatis/mapper/RoleMapper.xml" />
XML ファイルをインポートすることです。以下に示すように、XML でマッパーを作成します。
<?xml バージョン="1.0" エンコーディング="UTF-8"?> <!DOCTYPE マッパー PUBLIC "-//mybatis.org//DTD マッパー 3.0//EN" 「http://mybatis.org/dtd/mybatis-3-mapper.dtd」 <mapper namespace="com.mybatis.mapper.RoleMapper"> <select id="getRole"parameterType="long" resultType="role"> SELECT id,role_name as roleName,note FROM role WHERE id =#{id} </選択> </マッパー>
この 2 つのファイルでマッパーの定義が完了します。XML ファイルは比較的単純です。少し説明しましょう。
<mapper> 要素の属性名前空間はインターフェイスの完全修飾名に対応するため、MyBatis コンテキストはそれを通じて対応するインターフェイスを見つけることができます。
<select> 要素は、これがクエリ ステートメントであることを示し、属性 id はこの SQL を識別します。属性parameterType="long" は長いパラメータが SQL に渡されることを示し、resultType="role" はロールが返されることを示します。戻り値の型。また、role は、前の設定ファイル mybatis-config.xml で設定されたエイリアスで、com.mybatis.po.Role を参照します。
この SQL の #{id} は、渡されるパラメータを示します。
SQL 実行とロールの間の対応関係が設定されていないことに注意してください。どのようにマッピングされるのでしょうか?
実はここで自動マッピングと呼ばれる機能が使われており、MyBatis では SQL で返されるカラム名が POJO に対応できる限り、デフォルトで自動マッピングが提供されています。
ここで、SQL によって返される列名 id と note は、以前に定義した POJO の属性に対応できます。テーブル内の列 role_name は、SQL エイリアスによって roleName に書き換えられます。これも POJO に対応します。 time MyBatis SQLクエリの結果は自動マッピング機能によりPOJOにマッピングできます。
アノテーションはマッパーを実装します
XML でマッパーを定義することに加えて、アノテーションでマッパーを定義することもできます。以下に示すように、MyBatis アノテーションを介して SQL を挿入するために必要なインターフェイスは 1 つだけです。
パッケージcom.mybatis.mapper; org.apache.ibatis.annotations.Select をインポートします。 com.mybatis.po.Role をインポートします。 パブリックインターフェイスRoleMapper2 { @Select("id、role_nameをroleNameとして選択、t_roleからid=#{id}のメモを選択") public role getRole(Long id); }
これは、XML でマッパーを作成する方法とまったく同じです。おそらく、アノテーションを使用する方法は、XML を使用する方法よりもはるかに簡単だと思うかもしれません。XML メソッドと同時に定義すると、XML メソッドがアノテーション メソッドをオーバーライドするため、MyBatis は公式に XML メソッドの使用を推奨しているため、このチュートリアルでは XML メソッドに焦点を当てて MyBatis のアプリケーションについて説明します。
仕事や勉強において、SQL の複雑さは、次の SQL のように、現在私たちが目にする SQL をはるかに超えています。
select * from t_user u u.id = ur.user_id で t_user_role ur に参加したままにしておきます ur.role_id = r.id で t_role r に参加し続けます u.id = ui.user_id で t_user_info ui に参加し続ける u.id = fh.user_id で t_girl_health fh に参加したままにしておきます u.id = mh.user_id で t_male_health mh に参加したままにしておきます ここで u.user_name は concat('%', ${userName},'%') のようになります および r.role_name のような concat('%', ${roleName},'%') そしてu.sex = 1 ui.head_image は null ではありません。
明らかにこの SQL はより複雑です。これを @Select に含めると、アノテーションの内容が明らかに増加します。Javaコードに大量の SQL を組み込むと 、コードの可読性は明らかに低下します。
動的 SQL の使用も検討する場合、たとえば、パラメーター userName が空の場合は、クエリ条件として concat ('%', ${userName}, '%') のような u.user_name を使用しないでください。roleName が空の場合は、 concat ('%', ${roleName}, '%') のように r.role_name を使用しないでください。クエリ条件として使用されますが、他のロジックを追加する必要があるため、このアノテーションがより複雑になり、将来の使用に役立ちません。メンテナンスと改造。
さらに、XML は相互に導入できますが、注釈は導入できないため、より複雑なシナリオでは XML を使用した方が柔軟で便利です。したがって、ほとんどの企業は XML に基づいており、このチュートリアルでも一貫して XML でマッパーを作成できます。もちろん、一部の単純なテーブルやアプリケーションでは注釈を使用する方が簡単です。
このインターフェースは XML で定義できます。mybatis-config.xml の構成 XML ステートメントを模倣します。
<mapper resource="com/mybatis/mapper/RoleMapper.xml" />
以下の形式に変更するだけです。
<mapper resource="com/mybatis/mapper/RoleMapper2" />
構成オブジェクトを使用して、このインターフェイスを登録することもできます。次に例を示します。
構成.addMapper(RoleMapper2.class);