日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

mybatis入门(六)----高级映射(一对一,一对多,多对多)

發(fā)布時(shí)間:2025/3/21 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis入门(六)----高级映射(一对一,一对多,多对多) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

閱讀目錄

  • 一:訂單商品數(shù)據(jù)模型
  • 二、一對(duì)一查詢
  • 三、一對(duì)多查詢
  • 四、多對(duì)多查詢
回到頂部

一:訂單商品數(shù)據(jù)模型

1.數(shù)據(jù)庫(kù)執(zhí)行腳本

  創(chuàng)建數(shù)據(jù)庫(kù)表代碼:

View Code

  測(cè)試數(shù)據(jù)代碼:

View Code

2.數(shù)據(jù)模型分析思路

(1).每張表記錄的數(shù)據(jù)內(nèi)容:分模塊對(duì)每張表記錄的內(nèi)容進(jìn)行熟悉,相當(dāng)?于你學(xué)習(xí)系統(tǒng)?需求(功能)的過程;

(2).每張表重要的字段設(shè)置:非空字段、外鍵字段;

(3).數(shù)據(jù)庫(kù)級(jí)別表與表之間的關(guān)系:外鍵關(guān)系;

(4).表與表之間的業(yè)務(wù)關(guān)系:在分析表與表之間的業(yè)務(wù)關(guān)系時(shí)一定要建立在某個(gè)業(yè)務(wù)意義基礎(chǔ)上去分析。

3.針對(duì)訂單商品模型的數(shù)據(jù)庫(kù)思路分析:

  用戶表:t_user-->記錄了購(gòu)買商品的用戶信息

  訂單表:orders-->記錄了用戶所創(chuàng)建的訂單(購(gòu)買商品的訂單)

  訂單明細(xì)表:orderdetail-->記錄了訂單的詳細(xì)信息即購(gòu)買商品的信息

  商品表:items-->記錄了商品信息

表與表之間的業(yè)務(wù)關(guān)系:

  在分析表與表之間的業(yè)務(wù)關(guān)系時(shí)需要建立?在某個(gè)業(yè)務(wù)意義基礎(chǔ)上去分析。

  先分析數(shù)據(jù)級(jí)別之間有關(guān)系的表之間的業(yè)務(wù)關(guān)系:

t_userorders

  t_user---->orders:一個(gè)用戶可以創(chuàng)建多個(gè)訂單,一對(duì)多

  orders--->t_user:一個(gè)訂單只由一個(gè)用戶創(chuàng)建,一對(duì)一

orders和orderdetail

  orders--->orderdetail:一個(gè)訂單可以包括多個(gè)訂單明細(xì),因?yàn)橐粋€(gè)訂單可以購(gòu)買多個(gè)商品,每個(gè)商品的購(gòu)買信息在orderdetail記錄,一對(duì)多關(guān)系

  orderdetail-->?orders:一個(gè)訂單明細(xì)只能包括在一個(gè)訂單中,一對(duì)一

orderdetail和itesm

  orderdetail--->itesms:一個(gè)訂單明細(xì)只對(duì)應(yīng)一個(gè)商品信息,一對(duì)一

  items-->?orderdetail:一個(gè)商品可以包括在多個(gè)訂單明細(xì)?,一對(duì)多

再分析數(shù)據(jù)庫(kù)級(jí)別沒有關(guān)系的表之間是否有業(yè)務(wù)關(guān)系:

orders和items

  ordersitems之間可以通過orderdetail表建立?關(guān)系。

4.分析之后畫出對(duì)應(yīng)的圖,方便直觀的了解業(yè)務(wù)關(guān)系

回到頂部

二、一對(duì)一查詢

2.1.需求:查詢訂單信息,關(guān)聯(lián)查詢用戶信息

2.2.resultType實(shí)現(xiàn)

2.2.1.sql語(yǔ)句   

   ?確定查詢的主表:訂單表,確定查詢的關(guān)聯(lián)表:用戶表。

1 SELECT t1.*, 2 t2.username, 3 t2.sex, 4 t2.address 5 FROM 6 orders t1, 7 t_user t2 8 WHERE t1.user_id=t2.id

2.2.2.創(chuàng)建entity實(shí)體

  用戶實(shí)體:User.java

package com.mybatis.entity; import java.util.Date; import java.util.List; /** * @ClassName: User * @Description: TODO(用戶實(shí)體) * @author 阿赫瓦里 */ public class User { private Integer id; // 姓名 private String username; // 性別 private String sex; // 地址 private String address; // 生日 private Date birthday; // 用戶創(chuàng)建的訂單列表 private List<Orders> ordersList; // getter and setter ...... }

訂單實(shí)體:orders.java

package com.mybatis.entity; import java.util.Date; import java.util.List; /** * @ClassName: Orders * @Description: TODO(訂單實(shí)體) * @author 阿赫瓦里 */ public class Orders { /** 主鍵訂單Id */ private Integer id; /** 下單用戶id */ private Integer userid; /** 訂單號(hào) */ private String number; /** 創(chuàng)建訂單時(shí)間 */ private Date createTime; /** 備注 */ private String note; // 用戶信息 private User user; // 訂單明細(xì) private List<OrderDetail> orderdetails; // getter and setter ...... }

商品實(shí)體:Items.java

package com.mybatis.entity; import java.util.Date; /** * @ClassName: Items * @Description: TODO(商品實(shí)體類) * @author 阿赫瓦里 */ public class Items { /** 商品表主鍵Id */ private Integer id; /** 商品名稱 */ private String itemsName; /** 商品定價(jià) */ private float price; /** 商品描述 */ private String detail; /** 商品圖片 */ private String picture; /** 生產(chǎn)日期 */ private Date createTime; // getter and setter ...... }

訂單明細(xì)實(shí)體:OrderDetail.java

package com.mybatis.entity; /*** @ClassName: OrderDetail* @Description: TODO(訂單明細(xì)實(shí)體)* @author 阿赫瓦里 */ public class OrderDetail { /** 主鍵,訂單明細(xì)表Id */ private Integer id; /** 訂單Id */ private Integer ordersId; /** 商品id */ private Integer itemsId; /** 商品購(gòu)買數(shù)量 */ private Integer itemsNum; // 明細(xì)對(duì)應(yīng)的商品信息 private Items items; // getter and setter ...... }

?創(chuàng)建一個(gè)包裝類,將查詢到的信息可以全部映射到此類:OrdersCustom.java

/*** @ClassName: OrdersCustom* @Description: TODO(訂單的擴(kuò)展類,通過此類映射訂單和用戶的查詢結(jié)果,讓此類繼承字段較多的實(shí)體類)* @author: 阿赫瓦里*/ public class OrdersCustom extends Orders { // 添加用戶的屬性 private String username; private String sex; private String address; // getter and setter...... }

2.2.3.創(chuàng)建OrdersCustomMapper.java

package com.mybatis.Mapper; import java.util.List; import com.mybatis.entity.OrdersCustom; /** * @ClassName: OrdersMapperCustom * @Description: TODO(OrdersMapperCustom的mapper) * @author 阿赫瓦里 */ public interface OrdersCustomMapper { /** 查詢訂單,關(guān)聯(lián)查詢用戶信息 */ public List<OrdersCustom> findOrdersUser(); }

2.2.4.創(chuàng)建OrdersCustomMapper.xml和上面對(duì)應(yīng)的接口名稱一致,以便通過mapper接口加載配置文件

<?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"> <!-- namespace命名空間,作用就是對(duì)sql進(jìn)行分類化的管理,理解為sql隔離 注意:使用mapper代理開發(fā)時(shí),namespace有特殊作用,namespace等于mapper接口地址 --> <mapper namespace="com.mybatis.mapper.OrdersCustomMapper"> <!-- 查詢訂單,關(guān)聯(lián)查詢用戶信息 --> <select id="findOrdersUser" resultType="com.mybatis.entity.OrdersCustom"> SELECT t1.*, t2.username, t2.sex, t2.address FROM orders t1, t_user t2 WHERE t1.user_id=t2.id </select> </mapper>

2.3.resultMap實(shí)現(xiàn)

2.3.1. sql語(yǔ)句同上

2.3.2.?resultMap映射思路:

    使用resultMap將查詢結(jié)果中的訂單信息映射到Orders對(duì)象中,在orders類中添加User屬性,將關(guān)聯(lián)查詢出來的用戶信息映射到orders對(duì)象中的user屬性中(上面orders實(shí)體中已經(jīng)添加)。

2.3.3 ordersCustomMapper.xml

   1. 定義resultMap

1 <!-- 定義查詢訂單關(guān)聯(lián)用戶的 resultMap,將整個(gè)的查詢結(jié)果映射到com.mybatis.entity.Orders中 --> 2 <resultMap type="com.mybatis.entity.Orders" id="OrdersUserResultMap"> 3 <!-- 配置映射的訂單信息 --> 4 5 <!-- id:查詢列中的唯一標(biāo)識(shí),訂單信息中的唯一標(biāo)識(shí),如果多列組成唯一標(biāo)識(shí)(如:一般數(shù)據(jù)庫(kù)設(shè)計(jì)中的字典表 使用聯(lián)合主鍵),就需要配置多個(gè)id 6 column:訂單信息的唯一標(biāo)識(shí) 列 7 property:訂單信息的唯一標(biāo)識(shí)列所映射到orders中的那個(gè)屬性(假如:數(shù)據(jù)庫(kù)中orders表中的主鍵為orders_id,而實(shí)體屬性名稱為ordersId, 8 則這個(gè)配置應(yīng)為<id column="orders_id" property="ordersId"/>,類似hibernate實(shí)體映射文件配置)。 9 --> 10 <id column="id" property="id"/> 11 <result column="user_id" property="userid"/> 12 <result column="number" property="number"/> 13 <result column="createtime" property="createTime"/> 14 <result column="note" property="note"/> 15 16 <!-- 配置映射的關(guān)聯(lián)用戶信息 --> 17 18 <!--association:用于映射關(guān)聯(lián)查詢單個(gè)對(duì)象的信息 19 property:要將關(guān)聯(lián)查詢的用戶信息映射到Orders中那個(gè)屬性 20 --> 21 <association property="user" javaType="com.mybatis.entity.User"> 22 <!-- id:關(guān)聯(lián)查詢用戶的唯一標(biāo)識(shí) 23 column:指定唯一標(biāo)識(shí)用戶信息的列 24 property:映射到user的那個(gè)屬性 25 --> 26 <id column="user_id" property="id"/> 27 <result column="username" property="username"/> 28 <result column="sex" property="sex"/> 29 <result column="address" property="address"/> 30 </association> 31 32 </resultMap>

   2. statement定義

1 <!-- 查詢訂單,關(guān)聯(lián)查詢用戶信息,使用resultMap實(shí)現(xiàn) --> 2 <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap"> 3 SELECT t1.*, 4 t2.username, 5 t2.sex, 6 t2.address 7 FROM 8 orders t1, 9 t_user t2 10 WHERE t1.user_id=t2.id 11 </select>

?3.OrderCustomMapper.java接口中添加下面的方法

/** 查詢訂單關(guān)聯(lián)查詢用戶信息,使用reslutMap實(shí)現(xiàn)*/ public List<Orders>findOrdersUserResultMap();

4.對(duì)是resultType和resultMap實(shí)現(xiàn)的Junit測(cè)試

View Code

5.resultTyperesultMap實(shí)現(xiàn)一對(duì)一查詢小結(jié)

 實(shí)現(xiàn)一對(duì)一查詢:

  a.resultType:使用resultType實(shí)現(xiàn)較為簡(jiǎn)單,如果pojo中沒有包括查詢出來的列名,需要增加列名對(duì)應(yīng)的屬性,即可完成映射。

  b.如果沒有查詢結(jié)果的特殊要求建議使用resultType

  c.resultMap:需要單獨(dú)定義resultMap,實(shí)現(xiàn)有點(diǎn)麻煩,如果對(duì)查詢結(jié)果有特殊的要求,使用resultMap可以完成將關(guān)聯(lián)查詢映射pojo的屬性中。

  d.resultMap可以實(shí)現(xiàn)延遲加載,resultType無(wú)法實(shí)現(xiàn)延遲加載。

回到頂部

三、一對(duì)多查詢

?3.1. 需求:查詢訂單(關(guān)聯(lián)用戶)及訂單明細(xì)

?3.2.?在orders.java類中添加List<orderDetail>?orderDetails屬性(上面實(shí)體已添加)

    最終會(huì)將訂單信息映射到orders中,訂單所對(duì)應(yīng)的訂單明細(xì)映射到orders中的orderDetails屬性中.

3.3.在ordersCustomMapper.xml中添加如下代碼

<!-- 查詢訂單關(guān)聯(lián)查詢用戶及訂單明細(xì) --><select id="findOrdersAndOrderDetailResultMap" resultMap="ordersAndOrderDetailResultMap"> SELECT t1.*, t2.username, t2.sex, t2.address, t3.id orderdetail_id, t3.items_id, t3.items_num, t3.orders_id FROM orders t1, t_user t2, orderdetail t3 WHERE t1.user_id = t2.id AND t3.orders_id=t1.id </select>

resultMap的定義同樣添加到ordersCustomMapper.xml

<!-- 查詢訂單(關(guān)聯(lián)用戶)及訂單明細(xì)的resultMap --><resultMap type="com.mybatis.entity.Orders" id="ordersAndOrderDetailResultMap" extends="OrdersUserResultMap"> <!-- 訂單信息 --> <!-- 關(guān)聯(lián)用戶信息 --> <!-- 使用extends繼承,不用在中配置訂單信息和用戶信息的映射--> <!-- 關(guān)聯(lián)訂單明細(xì)信息 一個(gè)訂單關(guān)聯(lián)查詢出了多條訂單明細(xì),要使用collection映射 collection:對(duì)關(guān)聯(lián)查詢到的多條記錄映射到集合中 property:將關(guān)聯(lián)查詢到的多條記錄映射到orders類的那個(gè)屬性 ofType:指定映射的集合屬性中pojo的類型 --> <collection property="orderdetails" ofType="com.mybatis.entity.OrderDetail"> <!-- id:唯一標(biāo)識(shí) property:要將訂單明細(xì)的唯一標(biāo)識(shí)映射到com.mybatis.entity.OrderDetail的那個(gè)屬性 --> <id column="orderdetail_id" property="id"/> <result column="items_id" property="itemsId"/> <result column="items_num" property="itemsNum"/> <result column="orders_id" property="ordersId"/> </collection> </resultMap>

3.4. 在OrderCustomMapper.java接口類中添加一個(gè)方法

/**查詢訂單(關(guān)聯(lián)用戶)以及訂單明細(xì)*/public List<OrderDetail>findOrdersAndOrderDetailResultMap();

3.5.在Junit測(cè)試類中添加測(cè)試方法

// 查詢訂單(關(guān)聯(lián)用戶)以及訂單明細(xì)的測(cè)試 @Testpublic void TestFindOrdersAndOrderDetailResultMap() { SqlSession sqlSession = sqlSessionFactory.openSession(); // 創(chuàng)建代理對(duì)象 OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class); // 調(diào)用mapper的方法 List<OrderDetail> list = oc.findOrdersAndOrderDetailResultMap(); System.out.println(list); sqlSession.close(); }

3.6. 小結(jié) 

 mybatis使用resultMapcollection對(duì)關(guān)聯(lián)查詢的多條記錄映射到一個(gè)list集合屬性中。

 使用resultType實(shí)現(xiàn):將訂單明細(xì)映射到orders中的orderdetails中,需要自己處理,使用雙重循環(huán)遍歷,去掉重復(fù)記錄,將訂單明細(xì)放在orderdetails中。

回到頂部

四、多對(duì)多查詢

?4.1.需求:查詢用戶以及用戶購(gòu)買的商品信息

4.2.映射思路

  將用戶信息映射到user中。

  在user類中添加訂單列表屬性List<Orders>?orderslist,將用戶創(chuàng)建的訂單映射到orderslist;

  在Orders中添加訂單明細(xì)列表屬性List<OrderDetail>orderdetials,將訂單的明細(xì)映射到orderdetials;

  在OrderDetail中添加Items屬性,將訂單明細(xì)所對(duì)應(yīng)的商品映射到Item;

4.3.OrdersCustomMapper.xml添加如下代碼

<!-- 查詢用戶即購(gòu)買的商品信息的ResultMap --><resultMap type="com.mybatis.entity.User" id="userAndItemsResultMap"> <!-- 用戶信息 --> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> <!-- 訂單信息 一個(gè)用戶對(duì)應(yīng)多個(gè)訂單,使用collection映射 --> <collection property="ordersList" ofType="com.mybatis.entity.Orders"> <id column="id" property="id"/> <result column="user_id" property="userid"/> <result column="number" property="number"/> <result column="createtime" property="createTime"/> <result column="note" property="note"/> <!-- 訂單明細(xì) 一個(gè)訂單包括 多個(gè)明細(xì) --> <collection property="orderdetails" ofType="com.mybatis.entity.OrderDetail"> <id column="orderdetail_id" property="id"/> <result column="items_id" property="itemsId"/> <result column="items_num" property="itemsNum"/> <result column="orders_id" property="ordersId"/> <!-- 商品信息 一個(gè)訂單明細(xì)對(duì)應(yīng)一個(gè)商品 --> <association property="items" javaType="com.mybatis.entity.Items"> <id column="items_id" property="id"/> <result column="items_name" property="itemsName"/> <result column="items_detail" property="detail"/> <result column="items_price" property="price"/> </association> </collection> </collection> </resultMap> <!-- 查詢用戶及用戶購(gòu)買的商品信息,使用resulaMap--> <select id="findUserAndItemsResultMap" resultMap="userAndItemsResultMap"> SELECT t1.*, t2.username, t2.sex, t2.address, t3.id orderdetail_id, t3.items_id, t3.items_num, t3.orders_id, t4.itemsname items_name, t4.detail items_detail, t4.price items_price FROM orders t1, t_user t2, orderdetail t3, items t4 WHERE t1.user_id = t2.id AND t3.orders_id=t1.id AND t3.items_id = t4.id </select>

4.4.?在OrderCustomMapper.java添加如下方法

/** 查詢用戶及用戶所購(gòu)買的商品信息 */public List<User> findUserAndItemsResultMap();

4.5.在Junit測(cè)試類中添加測(cè)試方法 

// 查詢用戶及用戶購(gòu)買的商品的信息 @Testpublic void TestFindUserAndItemsResultMap() { SqlSession sqlSession = sqlSessionFactory.openSession(); // 創(chuàng)建代理對(duì)象 OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class); // 調(diào)用mapper的方法 List<User> list = oc.findUserAndItemsResultMap(); System.out.println(list); sqlSession.close(); }

4.6.resultMap總結(jié)

resultType

  作用:將查詢結(jié)果按照sql列名pojo屬性名一致性映射到pojo中。

  場(chǎng)合

    常見一些明細(xì)記錄的展示,比如用戶購(gòu)買商品明細(xì),將關(guān)聯(lián)查詢信息全部展示在頁(yè)面時(shí),此時(shí)可直接使用resultType將每一條記錄映射到pojo中,在前端頁(yè)面遍歷listlist中是pojo)即可。

resultMap

  使用associationcollection完成一對(duì)一和一對(duì)多高級(jí)映射(對(duì)結(jié)果有特殊的映射要求)。

association

  作用:將關(guān)聯(lián)查詢信息映射到一個(gè)pojo對(duì)象中。

  場(chǎng)合

    為了方便查詢關(guān)聯(lián)信息可以使用association將關(guān)聯(lián)訂單信息映射為用戶對(duì)象的pojo屬性中,比如:查詢訂單及關(guān)聯(lián)用戶信息。

    使用resultType無(wú)法將查詢結(jié)果映射到pojo對(duì)象的pojo屬性中,根據(jù)對(duì)結(jié)果集查詢遍歷的需要選擇使用resultType還是resultMap

collection

  作用:將關(guān)聯(lián)查詢信息映射到一個(gè)list集合中。

  場(chǎng)合

    為了方便查詢遍歷關(guān)聯(lián)信息可以使用collection將關(guān)聯(lián)信息映射到list集合中,比如:查詢用戶權(quán)限范圍模塊及模塊下的菜單,可使用collection將模塊映射到模塊list中,將菜單列表映射到模塊對(duì)象的菜單list屬性中,這樣的作的目的也是方便對(duì)查詢結(jié)果集進(jìn)行遍歷查詢。

  如果使用resultType無(wú)法將查詢結(jié)果映射到list集合中。

轉(zhuǎn)載于:https://www.cnblogs.com/yanyan0520/p/8758445.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的mybatis入门(六)----高级映射(一对一,一对多,多对多)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。