MyBatisの基本についてあまり明確ではない人については、この記事を参照してください:MyBatisはじめに学習チュートリアル(i)-MyBatisクイック紹介。
Mybatisに会います
MyBatisはApacheのオープンソースプロジェクトです。 2010年、このプロジェクトはApache Software FoundationからGoogleコードに移動し、MyBatisと改名されました。 2013年11月にGithubに移住しました。
Ibatisという用語は、「インターネット」と「Abatis」の組み合わせに由来し、JavaベースのPersistence Layer Frameworkです。 Ibatisは、SQLマップやデータアクセスオブジェクト(DAO)を含む永続レイヤーフレームワークを提供します
MyBatisの写真アルバム
導入
以前に簡単なデータベースクエリと管理クエリについて言及しました。開発要件には、1対1の、1対1から多くの需要開発があります。たとえば、ショッピングカートを開発する場合、注文とユーザーは1対1であり、ユーザーと注文は1対多で、ユーザーと製品は多目的です。これらは、冬眠の発達にも一般的です。それらは、冬眠のデータマッピングを通じて実装され、MyBatisでは、構成ファイルのデータマッピングを通じて実装されます。
1対1のクエリ
注文情報をクエリし、注文を作成するためのユーザー情報を補正する場合、これは典型的な1対1のクエリです。 1対1のクエリを実装するには、ResultTypeとresultMapの使用方法が2つあります。 resultTypeには追加のpojoの定義が必要であり、クエリフィールドは新しく定義されたpojoに1つずつ対応します。 ResultMapは、構成ファイルを介して2つのPOJO間に1対1の相関を実装する必要があります。これら2つの方法を以下に個別に実装しましょう。
resultType:
1. Pojoを作成し、新しいPojoにマッピングする必要がある新しい属性を追加します。
Public Class OrderCustomは注文を拡張します{//ユーザー情報プライベート文字列ユーザー名を追加します。プライベートストリングセックス;プライベート文字列アドレス。 public string getUsername(){return username; } public void setUsername(string username){this.username = username; } public string getSex(){return sex; } public void setSex(string sex){this.sex = sex; } public string getAddress(){return Address; } public void setAddress(stringアドレス){this.address = address; }}2。ファイルのマッピング:
<選択id = "findOrderUSER" resultType = "com.luchao.mybatis.first.po.ordercustom"> select Orders。
3。マッパーインターフェイスの実装:
//クエリ注文とユーザー情報パブリックリスト<OrderCustom> findOrderUSER()スロー例外。
4。テストコード:
public void findOrderSuser()スロー例外{// sqlsessionオブジェクトsqlsession sqlsession = sqlsessionfactory.opensession(); // OrderMapperオブジェクトを作成すると、MyBatisはMapper Proxy OrderMapper OrderMapper = sqlSession.getMapper(OrderMapper.Class)を自動的に生成します。 // OrderMapperメソッドを呼び出して注文およびユーザー情報リスト<OrderCustom> OrderCustoms = OrderMapper.FindOrderUser(); system.out.println(ordercustoms.size()); }ResultMapの実装:
resultmapは、クエリ結果の注文情報を注文オブジェクトにマップし、順序クラスにユーザー属性を追加し、関連するクエリユーザー情報を注文オブジェクトのユーザー属性にマップします。
1. POJOを作成し、ユーザー属性を注文クラスに追加します。
パブリッククラス注文{private Integer ID;プライベート整数userid;プライベート文字列番号。プライベートデートCreateTime;プライベート文字列ノート; //ユーザー情報プライベートユーザーユーザー。 //注文エントリプライベートリスト<OrderDetail> OrderDetails; public Integer getId(){return id; } public void setid(integer id){this.id = id; } public Integer getUserid(){return userid; } public void setuserid(integer userid){this.userid = userid; } public string getNumber(){return number; } public void setnumber(string number){this.number = number == null? null:number.trim(); } public date getCreatetime(){return createTime; } public void setCreatetime(date createTime){this.createtime = createTime; } public string getNote(){return note; } public void setnote(string note){this.note = note == null? null:note.trim(); } public user getUser(){return user; } public void setuser(user user){this.user = user; } public list <OrderDetail> getOrderDetails(){return orderdetails; } public void setOrderDetails(list <OrderDetail> OrderDetails){this.OrderDetails = OrderDetails; }}2。ファイルのマッピング:
<! - 順序照会query関連ユーザーの結果マップ、クエリ結果全体を注文にマッピングします - > <resultmap type = "com.luchao.mybatis.first.po.orders" id = "OrderSerresultmap"列= "createtime" property = "createTime" /> <result column = "note" property = "note" /> <! - マッピングの関連するユーザー情報を構成 - > <! - 関連する単一オブジェクトプロパティの情報をマッピングするために使用されます。 javatype = "com.luchao.mybatis.first.po.user"> <! - ID:関連するクエリユーザー列の一意のID:ユーザー情報を一意に識別する列を指定します。プロパティ= "sex"/> <result column = "address" property = "address"/> </association> </resultmap> <select id = "findorderusermap" resultmap = "orderserresultmap"> select orders。*、user.username、user.sex、user。
関連:関連するクエリの単一オブジェクト、プロパティの情報をマッピングするために使用されます。
3。マッパーインターフェイス
// resultmap public listを介した照会とユーザー情報query findOrderUSERMAP()スロー例外。
4。テストコード:
public void findordersusermap()スロー例外{// sqlsessionオブジェクトsqlsession sqlsession = sqlsessionfactory.opensession(); // OrderMapperオブジェクトを作成すると、MyBatisはMapper Proxy OrderMapper OrderMapper = sqlSession.getMapper(OrderMapper.Class)を自動的に生成します。 // OrderMapperメソッドを呼び出して、注文とユーザー情報リスト<Dorders>注文= OrderMapper.FindOrderUserMap(); system.out.println(orders.size()); }resultTypeとresultMapは、1対1のクエリの概要を実装します。
resultType:resultTypeを使用して実装するのは比較的簡単です。クエリ列名がPOJOに含まれていない場合、マッピングを完了するには、列名の対応する属性を追加する必要があります。クエリ結果に特別な要件がない場合は、resultTypeを使用することをお勧めします。
結果マップ:結果マップは個別に定義する必要がありますが、これは少し面倒です。クエリ結果に特別な要件がある場合、ResultMapを使用すると、関連するクエリマッピングPOJOの属性が完了できます。 resultMapは怠zyなロードを実装できますが、resultTypeは怠zyなロードを実装できません。
1対多くのクエリ
注文と注文の詳細を照会する必要がある場合、これは1対多クエリの要件です。
1。Pojoは、上記のResultMapの注文のPojoと同じです。注文の詳細を注文の属性として設定します。
2。ファイルのマッピング:
< oftype = "com.luchao.mybatis.first.po.orderdetail"> <result column = "orderdetail_id" property = "id" /> <result column = "items_id" property = "itemsid" /> <result column = "items_num" quitenum " /> <result colump =" odspertid " id = "findOrderandOrderDetailMap" resultMap = "OrdersOrderDetailResultMap"> Select Orders。 OrderDetail.Orders_id = Orders.id </select>
注文と注文の詳細の結果マップは、拡張機能を使用して継承され、注文情報とユーザー情報のマッピングを構成する必要はありません。
コレクション:Associationクエリ、プロパティ:複数のレコードを注文プロパティにマップするために、複数のレコードをコレクションオブジェクトにマッピングします。
OFTYPE:List Collection属性のPOJOにマップするタイプを指定します。 OFTYPEと1対1の間にはまだ違いがあることに注意してください。
3。マッパーインターフェイス:
// resultmapを通じて注文、注文の詳細、ユーザー情報の問い合わせ
public list <Olders> findOrderandOrderDetailMap()スロー例外。
4。テストコード:
public void find OrderandOrderDetailMap()スロー例外{// // OrderMapperオブジェクトを作成すると、MyBatisはMapper Proxy OrderMapper OrderMapper = sqlSession.getMapper(OrderMapper.Class)を自動的に生成します。 // OrderMapperメソッドを呼び出して、注文とユーザー情報リスト<Dorders>注文= OrderMapper.FindOrderDorderDetailMap(); system.out.println(orders.get()。getOrderDetails()。size()); system.out.println(orders.size()); }1対多くの要約:
MyBatisは、ResultMapのコレクションを使用して、関連するクエリの複数のレコードをリストコレクションプロパティにマッピングします。
resultTypeを使用した実装:
注文の詳細のマッピング注文の注文では、自分で処理し、ダブルループを使用してレコードを横断し、重複した記録を削除し、注文の詳細を注文に配置する必要があります。これはもっと面倒です。
多くの人から
ユーザーとユーザーの購入製品情報を照会すると、これは多くのものであり、MyBatisの多目的マッピングを使用できます。
ユーザー情報をユーザーにマップします。 Order List属性リスト<DorderSlist> OrdersListユーザークラスで、ユーザーが作成した注文を注文リストにマップし、注文属性リスト<OrderDetail>注文の注文の詳細を注文の詳細にマッピングし、注文属性を追加し、注文の詳細に対応するアイテムをマッピングします。
1。ポジョ
Public Class OrderDetail {Private Integer ID; Private Integer Orderid;プライベート整数項目。プライベート整数itemsnum; //製品情報プライベートアイテムアイテム。 public Integer getId(){return id; } public void setid(integer id){this.id = id; } public Integer getOrderSid(){return ordersid; } public void setordersid(integer orderid){this.ordersid = ordersid; } public Integer getItemsid(){return itemsid; } public void setItemsid(integer itemsid){this.itemsid = itemsid; } public Integer getItemsnum(){return itemsnum; } public void setitemsnum(integer itemsnum){this.itemsnum = itemsnum; } public items getItems(){return items; } public void setItems(itemsアイテム){this.items = items; } @Override public String toString(){return "orderdetail [id =" + id + "、orderid =" + orderid + "、itemsId =" + itemid + "、itemsnum =" + itemsnum + "]"; }}2。ファイルのマッピング:
<! - ユーザーをクエリして購入した製品 - > <resultmap type = "com.luchao.mybatis.first.po.user" id = "ordersitemsresultmap"> <! - ユーザー情報 - > <id column = "user_id" property = "id" /> <result column = "result colummame" /> <" /> <" />プロパティ= "アドレス" /> <! - 注文情報ユーザーは複数の注文に対応し、コレクションマッピングを使用します - > <collectionプロパティ= "Orderslist" oftype = "com.luchao.mybatis.first.po.orders"> <id column = "id" id "property =" id " /> <result columm column="createtime" property="createtime" /> <result column="note" property="note" /> <!-- Order Details One order includes multiple details--> <collection property="orderdetails" ofType="com.luchao.mybatis.first.po.Orderdetail"> <id column="id" property="id" /> <result column="items_id" property="itemsId" /> <result列= "items_num" Property = "itemsnum" /> <result column = "orders_id" property = "orderid" /> <! - 1つの注文の詳細は1つの製品に対応します - > <Associationプロパティ= "items" javatype = "javatype =" com.luchao.mybatis.first.po.items " /> <column = "items_detail"プロパティ= "詳細"/> <result column = "items_price" property "/> </association> </collection> </collection> </resultmap> <select id =" findOrderanditemmap " OrderDetail.Items_id、OrderDetail.Items_num、OrderDetail.orders_id、Items.id items_id、items.name items_name、items.details items.price items_price注文、ユーザー、注文、項目、項目。 items.id </select>
多くの人から多くの人が基本的に1対1と1対1の組み合わせであることがわかります。すべての複雑な問題は、基本的に単純な問題の組み合わせです。それらを注意深く分析する限り、あなたは原則を理解することができます。
3。マッパーインターフェイス:
// resultMap Public List <user> findOrderAnditemmap()を介して照会、注文の詳細、ユーザー情報を照会します。
4。テストコード:
public void findOrderAnditemmap()スロー例外{// sqlsessionオブジェクトsqlsession sqlsession = sqlsessionfactory.opensession(); // OrderMapperオブジェクトを作成すると、MyBatisはMapper Proxy OrderMapper OrderMapper = sqlSession.getMapper(OrderMapper.Class)を自動的に生成します。 // OrderMapperメソッドを呼び出して注文およびユーザー情報リスト<ユーザー>ユーザー= roderMapper.findorderanditemmap(); system.out.println(users.get()。getOrderSlist()。get().getOrderDetails()。get()。getId()); // system.out.println(orders.size()); }多くのクエリの概要:
上記の要件では、resultTypeを使用してクエリレコードを拡張されたpojoにマッピングします。これは、詳細リストの機能を実装するのは非常に簡単ですが、これにより遅延荷重を実現できません。 ResultMapを使用して、ユーザーが購入したアイテムの詳細なリストをオブジェクトにマッピングします。これにより、怠zyなロードが可能になります。 ResultMapの使用は、複数のリストを含むリストに特別な要件をマッピングするなど、クエリ結果マッピングに特別な要件を持つ関数のためのものです。
結果マップの概要
1。resultType:
効果:
クエリの結果をマップして、SQL列名pojo属性名の一貫性に従ってpojoにマップします。
機会:
ユーザーが製品の詳細を購入してページに関連するすべてのクエリ情報を表示する場合など、詳細なレコードを一般的に表示するには、ResultTypeを使用して各レコードをPOJOにマップし、フロントエンドページのリスト(リストのPOJO)をトラバースできます。
2。LesultMap:
アソシエーションとコレクションを使用して、1対1で1対1の高度なマッピングを完了します(結果には特別なマッピング要件があります)。
協会:
効果:
関連するクエリ情報をPojoオブジェクトにマップします。
機会:
関連する情報のクエリを容易にするために、関連する注文情報を使用して、次のようなユーザーオブジェクトのPOJO属性にマッピングできます。
resultTypeを使用することは、クエリ結果をpojoオブジェクトのpojo属性にマップすることはできません。結果セットクエリを通過するニーズに応じて、resultTypeまたはresultMapを使用するかどうかを選択します。
コレクション:
効果:
関連するクエリ情報をリストコレクションにマップします。
機会:
トラバーサル関連情報のクエリを容易にするために、コレクションを使用して、関連情報をリストコレクションにマッピングできます。たとえば、ユーザー許可スコープモジュールとモジュールのメニューをクエリすると、コレクションを使用してモジュールリストをマップして、モジュールオブジェクトのメニューリスト属性をマップできます。これの目的は、クエリ結果セットのトラバーサルクエリを容易にすることです。
resultTypeを使用する場合、クエリ結果をリストコレクションにマップすることはできません。
上記のコンテンツは、編集者が紹介したMyBatis Advanced Mapping Learningチュートリアルです。それがあなたに役立つことを願っています。もっと知りたい場合は、wulin.comのWebサイトに注意してください!