冬眠を学ぶとき、編集者はさまざまなマッピングにさらされています。 MyBatisのマッピングはどのように機能しますか?本日のこのブログ投稿では、編集者は主に、1対1、1対多、および多くの多数を含むMyBatisの高度なマッピングを簡単に紹介します。ますます多くの友達が役立つことを願っています。エディターは、主に注文製品データモデル、1対1のクエリ、1対多クエリ、および多くのクエリを紹介します。
1。製品データモデルを注文します
1.データベース実行スクリプトは次のとおりです。
<span style="font-family:Comic Sans MS;font-size:18px;">CREATE TABLE items ( id INT NOT NULL AUTO_INCREMENT, itemsname VARCHAR(32) NOT NULL COMMENT 'Product name', price FLOAT(10,1) NOT NULL COMMENT 'Product price', detail TEXT COMMENT 'Product description', pic VARCHAR(64) DEFAULT NULL COMMENT 'Product picture', createtime DATETIME NOT NULL COMMENT 'Production date',プライマリキー(ID))デフォルトcharset = utf8; / *テーブルのテーブル構造 `OrderDetail` */ CREATE TABLE ORDERDETAIL(ID INT NOT NOLL AUTO_INCREMENT、ORDERS_ID INT NOT NOLL COMMENT 'ORDER ID'、items_id int not Notl not not null comment 'product id'、items_num int default null comment 'product null commite'、Primary Key(ID)、Key` fk_ordetail_1`( `fk_det」 ( 'items_id`)、制約 `fk_orderdetail_1`外部キー(` order_id`)参照 `orders`(` dea `id`)on delete on constraint` constraint `fk_orderdetail_2` fk_orderdetail_2` fk_orderdetail_2`外部キー(` items_id`)参照 `items`(` items `) / *テーブルのテーブル構造「注文」のテーブル構造 */テーブルオーダーの作成(ID int null auto_increment、user_id int not null comment 'order' order 'aruth' varchar(30)null comment not null comment 'order number'、noll comment 'not null comment' Create older time '、note varchar(100)デフォルトのnullコメント' note '、contraint `fk_orders_id`外部キー(` user_id`)参照 `t_user`(` id`)on delete on update on action no action no action)default charset = utf8; / *テーブルのテーブル構造 `t_user` */ create table t_user(id int not not null auto_increment、username varchar(32)nullコメント「ユーザー名」、誕生日デフォルトのコメント「誕生日」、セックスチャー(1)デフォルトヌルコメント「ジェンダー」、アドレスvarchar(256)デフォルトヌルコメント 'アドレス= defay = defaly = defay = defay = defaly chars( </span>
データコードをテストします
<span style = "font-family:comic sans ms; font-size:18px;">/ *テーブルのデータのデータ */挿入項目(アイテム名、価格、詳細、pic、createtime)値( 'desktop'、3000.0、 'このコンピューターは素晴らしい品質です! (「ノートブック」、6000.0、「ノートブック」、良いパフォーマンス、良質! '、ヌル、' 2015-07-08 13:22:57 ')、(「バックパック」、200.0、「クラスブランドバックパック、「クラスブランド」、高品質!」、null、' 2015-07-010 13:25:02 '); / *テーブルのデータ `orderdetail` */挿入` orderdetail`( `orders_id`、` item_id`、 `items_num`)値(1,1,1)、(1,2,3)、(2,3,4)、(3,2,3); / *テーブルのデータ `orders` */ inserting` orders`( `user_id`、` number`、 `createtime`、` note`)values(1、 '1000010'、 '2015-06-04 13:35'、null)、(1、 '1000011'、 '2015-07-08 13:22:41'、null) (2、 '1000012'、 '2015-07-17 14:13:23'、null)、(3、 '1000012'、 '2015-07-16 18:13:23'、null)、(4、 '1000012'、 '2015-07-15 19:13:23'、null) (6、 '1000012'、 '2015-07-13 16:13:23'、null); / *テーブルのデータ `user` */ inserting `t_user`(` username`、 `Birthday`、` sex`、 `address``)values( 'wang wu'、null、 '2'、null)、( 'Zhang San'、 '2014-07-10'、 '1')、「Zhang」 Xiaoming '、null、' 1 '、' zhengzhou、henan ')、(' Chen Xiaoming、null、 '1'、 'Zhengzhou、henan')、( 'Zhang Sanfeng'、 '1' 1 '、' Zhengzhou、henan ') ( 'Chen Xiaoming'、null、 '1'、 'Zhengzhou、henan')、( 'wang wu'、null、null、null)、( 'xiao a'、 '2015-06-27'、 '2'、 '北京') C '、' 2015-06-27 '、' 1 '、' Beijing ')、(' Xiao D '、' 2015-06-27 '、' 2 '、' Beijing '); </span>
2。データモデル分析のアイデア
(1)。各テーブルに記録されたデータコンテンツ:モジュールの各テーブルに記録されたコンテンツに慣れてください。これは、システムの要件(関数)の学習プロセスに相当します。
(2)。各テーブルの重要なフィールド設定:空でないフィールド、外部キーフィールド。
(3)。データベースレベルのテーブルとテーブルの関係:外部キー関係。
(4)。テーブル間のビジネス関係:テーブル間のビジネス関係を分析する場合、分析するための特定のビジネスの重要性に基づいている必要があります。
3。下の図に示すように、注文製品モデルのデータベースのアイデアの分析:
2。1対1のクエリ
2.1。要件:注文情報をクエリし、ユーザー情報を関連付けます
2.2。 resultType実装
2.2.1 SQLステートメント
クエリのメインテーブルを決定します。注文テーブル、クエリの関連表、ユーザーテーブル、コードは次のとおりです。
<span style = "font-family:comic sans ms; font-size:18px;"> select t1。*、t2.username、t2.sex、t2.address t1、t_user t2 where t1.user_id = t2.id </span>
2.2.2エンティティエンティティを作成します
ユーザーエンティティuser.java、コードは次のとおりです。
<span style = "font-family:comic sans ms; font-size:18px;">パッケージcom.mybatis.entity; Import Java.util.date; java.util.listをインポートします。 / ** * @classname:user * @description:todo(user entity) * @author ahvari */ public class user {private integer id; //名前プライベート文字列ユーザー名。 //ジェンダープライベートストリングセックス; //アドレスプライベート文字列アドレス。 //誕生日プライベートデートの誕生日。 //ユーザーが作成した注文リストプライベートリスト<注文>注文リスト; // getter and setter ......} </span>Order Entity Orders.java
<span style = "font-family:comic sans ms; font-size:18px;">パッケージcom.mybatis.entity; Import Java.util.date; java.util.listをインポートします。 / *** @ClassName:注文* @Description:TODO(注文エンティティ)* @Author Ahvari*/ public class Orders {/ ** Primary Key Order ID*/ private Integer id; / **ユーザーIDを注文*/ private integer userid; / **注文番号*/プライベート文字列番号。 / **注文時間*/ private Date CreateTime; / ** note*/ private string note; //ユーザー情報プライベートユーザーユーザー。 //詳細を注文プライベートリスト<OrderDetail> OrderDetails; // getter and setter ......} </span>製品エンティティ:items.java
<span style = "font-family:comic sans ms; font-size:18px;">パッケージcom.mybatis.entity; Import Java.util.date; / *** @classname:items* @description:todo(product entity class)* @author ding guohua*/ public class etems {/ ** Product TableプライマリキーID*/ private Integer id; / **製品名*/プライベート文字列itemsName; / **製品価格*/プライベートフロート価格。 / **製品の説明*/プライベート文字列の詳細; / **製品画像*/プライベート文字列画像; / **生産日*/ private Date CreateTime; // getter and setter ......} </span>注文詳細エンティティorderdetail.java
<span style = "font-family:comic sans ms; font-size:18px;">パッケージcom.mybatis.entity; / *** @ClassName:OrderDetail* @Description:TODO(注文詳細エンティティ)* @Author Ding Guohua*/ Public Class OrderDetail {/ ** Main、詳細リストID*/ Private Integer ID; / ** id*/ private Integer Orderid; / **製品ID*/ Private Integer Itemid; / **製品購入数量*/ private integer itemsnum; //詳細に対応する製品情報プライベートアイテムアイテム。 // getter and setter ......} </span>ラッパークラスを作成して、すべてのクエリ情報をこのクラスにマッピングしてandorcustom.java
<span style = "font-family:comic sans ms; font-size:18px;">/ ** * @classname:Orderscustom * @description:todo(注文とユーザークエリの結果、このクラスを介してこのクラスがより多くのエンティティを継承できるようにする)ユーザー名;プライベートストリングセックス;プライベート文字列アドレス。 // getter and setter ......} </span>
2.2.3 OrdersCcustommapper.javaを作成すると、コードは次のとおりです。
<span style = "font-family:comic sans ms; font-size:18px;"> package com.mybatis.mapper; java.util.listをインポートします。 com.mybatis.entity.orderscustomをインポートします。 / *** @ClassName:Ordermappercustom* @Description:Todo(Ordermappercustom Mapper)* @author Ding Guohua*/ public Interface OrdersCustommapper {/ **クエリ注文、アソシエイトクエリユーザー情報*/パブリックリスト<OrdersCustom> FindOrderSuser(); } </span>2.2.4 Orderscustomper.xmlの作成は、対応するインターフェイス名と同じです。 Mapperインターフェイスを介して構成ファイルをロードしている間、コードは次のとおりです。
<span style = "font-family:comic sans ms; font-size:18px;"> <?xml version = "1.0" encoding = "utf-8"?> < <! - 名前空間名のスペース、関数はSQLの管理を分類することです。これはSQL分離として理解されます注:マッパーエージェント開発を使用する場合、名前空間にはマッパーインターフェイスアドレスに等しくなります - > <マッパーネームスペース= " resultType = "com.mybatis.entity.orderscustom"> select t1。*、t2.username、t2.sex、t2.address t1、t_user t2 where t1.user_id = t2.id </select> </mapper> </span>
2.3結果マップの実装
2.3.1上記と同じSQLステートメント
2.3.2 resultmapマッピングのアイデア:
結果マップを使用して、クエリ結果の注文情報を注文オブジェクトにマッピングし、注文クラスにユーザー属性を追加し、関連するクエリユーザー情報を注文オブジェクトのユーザー属性にマッピングします(上記の注文エンティティに追加されました)。
2.3.3 OrdersCustomper.xml
1.結果マップを定義します。コードは次のとおりです。
<span style = "font-family:comic sans ms; font-size:18px;"> <! - Query Order Assotioningユーザーの結果マップを定義し、クエリ結果全体をcom.mybatis.entity.orders-> <resultmap type = "com.mybatis.entity.orders" odserersultmap "> <識別子クエリ列の識別子、注文情報の一意の識別子。複数の列が一意の識別子(次のような辞書テーブルが一般的なプライマリキーを使用します)を形成する場合、複数のIDを構成する必要があります:注文情報プロパティの一意の識別列:注文情報の一意の識別列にマッピングされた属性(:以下:順序付け_id = "surtive is odribute vid is odribute vid intid id sultive is odsion is surtionid emption Property = "OrdersID"/>、Hibernate Entityマッピングファイル構成と同様)。 - > <id column = "id" property = "id"/> <result column = "user_id" property = "userid"/> <result column = "number" property = "number"/> <result column = "createtime" property = "createTime"/> <result列= "note" property = "note"/> <result column = "note" note "/> <関連関連のクエリ単一オブジェクトプロパティをマッピングするために使用される情報:関連するクエリのユーザー情報を注文にマップするには - > <Associationプロパティ= "user" javatype = "com.mybatis.entity.user"> <! - ID:関連するクエリユーザー列の一意の識別子:ユーザー情報を識別する列を指定します。 <結果列= "username" property = "username"/> <result column = "sex"/> <result column = "address" property = "address"/> </association> </resultmap> </span> </span>
2。ステートメント定義、コードは次のとおりです。
<span style = "font-family:comic sans ms; font-size:18px;"> <! - クエリの注文、アソシエイトクエリユーザー情報、resultmapを使用して実装して - > <"findordersuserresultmap" resultmap = "ordersuresultmap"> select t1。 t1.user_id = t2.id </select> </span>
3.次の方法をOrderCustommapper.javaインターフェイスに追加します。
<span style = "font-family:comic sans ms; font-size:18px;">/ ** Query Order Association Queryユーザー情報、reslutMapを使用して*/ public List <DordersUsErresultMap(); </span>
4. resultTypeおよびresultMapの実装のJunitテスト、コードは次のとおりです。
<span style = "font-family:comic sans ms; font-size:18px;"> package com.mybatis.test; java.io.inputStreamをインポートします。 java.util.listをインポートします。 Import org.apache.ibatis.io.resources; Import org.apache.ibatis.session.sqlsessionfactory; Import org.apache.ibatis.session.sqlsessionfactoryBuilder; org.junit.beforeをインポートします。 Import org.junit.test; com.mybatis.entity.ordersをインポートします。 com.mybatis.entity.orderscustomをインポートします。 com.mybatis.mapper.orderscustommapperをインポートします。 Public Class OrdersCustompertEST {private sqlsessionFactory sqlsessionFactory; //この方法は、@beforefore public void setup()を実行することです。 inputstream inputstream = resources.getResourceasStream(リソース); // sqlsessionfcatory sqlsessionfactory = new sqlsessionfactorybuilder()。build(inputstream); } //注文をクエリし、クエリユーザー情報を関連付け、resultTypeを使用してtest @test public void testfindordersuser(){sqlsession sqlsession = sqlsessionfactory.opensession(); //プロキシオブジェクトを作成しますOrderscustommapper oc = sqlsession.getMapper(Orderscustommapper.class); // mapperメソッドリスト<Orderscustom> list = oc.findordersuser(); System.out.println(list); sqlsession.close(); } //注文をクエリし、queryユーザー情報を関連付け、resultmap @test public void testfindordersuserresultmap(){sqlsession sqlsession = sqlsessionfactory.opensession(); //プロキシオブジェクトを作成しますOrderscustommapper oc = sqlsession.getMapper(Orderscustommapper.class); // mapperメソッドリスト<注文> list = oc.findordersuserresultmap(); System.out.println(list); sqlsession.close(); }} </span>5。resultTypeおよびresultMapは、1対1のクエリの概要を実装します
1対1のクエリを実装します:
A.ResultType:resultTypeを使用して実装するのは比較的簡単です。クエリ列名がPOJOに含まれていない場合、マッピングを完了するには、列名の対応する属性を追加する必要があります。
b。クエリ結果に特別な要件がない場合は、resultTypeを使用することをお勧めします。
C.ResultMap:結果マップを個別に定義する必要がありますが、これは少し面倒です。クエリ結果に特別な要件がある場合、ResultMapを使用すると、関連するクエリマッピングPOJOの属性が完了できます。
D.ResultMapは怠zyな読み込みを実装できます。LesultTypeは怠zyなロードを実装できません。
3。1対多クエリ
3.1要件:照会(関連するユーザー)と注文の詳細。
3.2リストを追加<OrderDetail> OrderDetails Orders.javaクラス(上記のエンティティが追加されました)。最後に、注文情報は注文にマッピングされ、注文に対応する注文の詳細は注文のOrderDetailsプロパティにマッピングされます。
3.3注文customper.xmlで以下を追加します
<span style = "font-family:comic sans ms; font-size:18px;"> <! - Query Order Association Queryユーザーと注文の詳細 - > <Select id = "findOrderSandorderdetailResultmap" resultmap = "OrdersandOrderDetailResultMap"> Select T1。 t3.items_id、t3.items_num、t3.orders_id注文t1、t_user t2、orderdetail t3 where t1.user_id = t2.idおよびt3.orders_id = t1.id </select> </span>
ResultMapの定義は、Orderscustommapper.xmlにも追加されます
<span style = "font-family:comic sans ms; font-size:18px;"> <! - resultmap for query for query for query for querymap for querymap for action for ard olly deterled-> <resultmap type = "com.mybatis.entity.orders" id = "ordersandordetailresultmap" extendss = "Ordersultmap">継承、注文情報とユーザー情報のマッピングを構成しないでください - > <! - 関連する注文詳細コレクションマッピングコレクションを使用する必要があります:アソシエーションプロパティにクエリされた複数のレコードをコレクションプロパティにマップしますofType:マッピングされたコレクションプロパティでPOJOのタイプを指定します - > <コレクションプロパティ= "oderdetails" oftype = "com.mybatis.entity.OrdetAil"> <! - ID:com.mybatifierの一意の識別プロパティのマップ - > <id column = "orderdetail_id" property = "id"/> <result column = "items_id" property = "itemsid"/> <result column = "items_num"プロパティ= "itemsnum"/> <result column = "result_id"プロパティ
3.4 OrderCustomemapper.javaインターフェイスクラスにメソッドを追加すると、コードは次のとおりです。
<span style = "font-family:comic sans ms; font-size:18px;">/ ** query orders(関連ユーザー)および注文の詳細*/ publicリスト<OrderDetail> findOrderSandOrderDetailResultMap(); </span>
3.5 Junitテストクラスにテスト方法を追加すると、コードは次のとおりです。
<span style = "font-family:comic sans ms; font-size:18px;"> //照会のクエリ(関連するユーザー)および注文@test public void void void void void void void void void void void void testfindorderdetailresultmap(){sqlsession sqlsession = sqlsessionfactory.opensession(); //プロキシオブジェクトを作成しますOrderscustommapper oc = sqlsession.getMapper(Orderscustommapper.class); // mapperメソッドリスト<orderdetail> list = oc.findordersandorderdetailResultmap(); System.out.println(list); sqlsession.close(); } </span>3.6要約
MyBatisは、ResultMapのコレクションを使用して、関連するクエリの複数のレコードをリストコレクションプロパティにマッピングします。 resultTypeを使用した実装:注文の詳細を注文の注文にマップします。これは自分で処理する必要があり、ダブルループトラバーサルを使用し、重複したレコードを削除し、注文の詳細をオーダーデテールに配置します。
4.多くのクエリ
4.1要件:ユーザーが購入したユーザーと製品情報をクエリします
4.2マッピングのアイデア
ユーザー情報をユーザーにマップするには、Order List属性リスト<Dorders>ユーザークラスの注文リストを追加して、注文リストをマップします。注文詳細リスト属性リスト<OrderDetail> OrderDetialsを注文に追加し、注文の詳細をOrderDetialsにマッピングします。注文の詳細に対応するアイテムをアイテムにマッピングするには、オーダーデテールにアイテム属性を追加します。
4.3 OrdersCustomper.xml次のコードを追加します。
<span style="font-family:Comic Sans MS;font-size:18px;"><!-- ResultMap for querying the product information purchased by the user --> <resultMap type="com.mybatis.entity.User" id="userAndItemsResultMap"> <!-- User information--> <id column="user_id" property="id"/> <result column="username"プロパティ= "username"/> <result column = "sex" property = "sex"/> <result column = "address" property = "dorders"/> <! - ユーザーは複数の注文に対応します。 <結果列= "number" property = "number"/> <result column = "createTime" property = "createTime"/> <result column = "note" note = "note"/> <result column = "note"/> <result column = "note" note = "note"/> <列= "OrderDetail_id" Property = "id"/> <result column = "items_id" property = "itemsid"/> <result column = "items_num" property = "itemsnum"/> <result column = "orders_id" property = "ordersid"/> <result column = "items_name" quitename "/> <result columname"/> <columname " javatype = "com.mybatis.entity.items"> <id column = "items_id" property = "id"/> <result column = "items_name" property = "itemsname"/> <result column = "items_name" property = "itemsname"/> <result column = "items_detail" "/> <"項目 "/> <"項目 " </collection> </collection> </resultmap> <! - ユーザーとユーザーが購入した製品情報を照会するには、resulamapを使用します。 T3.ITEMS_NUM、T3.ORDERS_ID、T4.ITEMSNAME ITERS_NAME、T4.DETAIL ITELS_DETAIL、T4.PRICE ITEMS_PRICE ORDERS T1、T_USER T2、ORDERDETAIL T3、ITEMS T4 WHERE T1.USER_ID = T2.IDおよびT1.ID = T1.IDおよびT1.IDおよびT3.ID_ID>
4.4次のメソッドをOrderCustomper.javaに追加します。
<span style = "font-family:comic sans ms; font-size:18px;"> / **ユーザーとユーザーが購入した製品情報をクエリ* / publicリスト<user> finduseranditemsResultmap(); </span>
4.5 Junitテストにテスト方法を追加すると、コードは次のとおりです。
<span style = "font-family:comic sans ms; font-size:18px;"> //ユーザーとユーザー@test public testfinduseranditemsResultmap(){sqlsession sqlsession = sqlsessionfactory.opensession(); //プロキシオブジェクトを作成しますOrderscustommapper oc = sqlsession.getMapper(Orderscustommapper.class); // mapperメソッドリスト<ユーザー>リスト= oc.finduseranditemsResultMap(); System.out.println(list); sqlsession.close(); } </span> 4.6結果マップの概要
resultType:
関数:SQL列名POJO属性名の一貫性に従って、クエリの結果をPOJOにマップします。
機会:ユーザーが製品の詳細を購入してページ上のすべての関連するクエリ情報を表示する場合など、詳細なレコードの一般的な表示には、resultTypeを使用して各レコードをPOJOにマッピングし、フロントエンドページのリスト(リストのPOJO)をトラバースできます。
結果マップ:
使用:アソシエーションとコレクション1対1および1対1〜多くの高度なマッピングを完了します(結果には特別なマッピング要件があります)。
協会:
関数:関連するクエリ情報をPojoオブジェクトにマップします。
機会:関連する情報のクエリを促進するために、関連する注文情報を使用して、次のようなユーザーオブジェクトのPOJO属性にマッピングできます。
resultTypeを使用することは、クエリ結果をpojoオブジェクトのpojo属性にマップすることはできません。結果セットクエリを通過するニーズに応じて、resultTypeまたはresultMapを使用するかどうかを選択します。
コレクション:
関数:関連するクエリ情報をリストコレクションにマップします。
機会:トラバーサル関連情報のクエリを促進するために、コレクションを使用して、関連情報をリストコレクションにマッピングできます。たとえば、ユーザー許可スコープモジュールとモジュールのメニューをクエリすると、コレクションを使用してモジュールリストをマップして、モジュールオブジェクトのメニューリスト属性をマップできます。これの目的は、クエリ結果セットのトラバーサルクエリを容易にすることです。
resultTypeを使用する場合、クエリ結果をリストコレクションにマップすることはできません。
上記は、編集者が紹介したMybatisの高度なマッピングです。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!