使用mybatis的resultMap進行復雜查詢

數據庫表以下:java

 

拿到表的第一時間要學會分析陌生表的數據模型:sql

一、學習單表記錄了什麼東西(去學習理解需求)數據庫

二、學習單表重要字段的意義(優先學習不能爲空的字段)mybatis

三、學習表與表之間的關係(一對1、一對多、多對多)經過表的外鍵分析表之間的關係app

注意:分析表與表之間的關係時是要創建在具體 的業務意義基礎之上學習

 

用戶表user:記錄了購買商品的用戶ui

訂單表orders:記錄了用戶所建立的訂單信息spa

訂單明細表orderdetail:記錄了用戶建立訂單的詳細信息debug

商品信息表items:記錄了商家提供的商品信息代理

 

分析表與表之間的關係:

 

用戶user和訂單orders:

user---->orders:一個用戶能夠建立多個訂單   一對多

orders-->user:一個訂單隻能由一個用戶建立  一對一

訂單orders和訂單明細orderdetail:

orders-->orderdetail:一個訂單能夠包括多個訂單明細  一對多

orderdetail-->orders:一個訂單明細只屬於一個訂單  一對一

訂單明細orderdetail和商品信息items:

orderdetail-->items:一個訂單明細對應一個商品信息 一對一

items--> orderdetail:一個商品對應多個訂單明細  一對多

 

需求:查詢全部用戶信息,關聯查詢訂單及訂單明細信息及商品信息

分析sql語句如何寫:

主查詢表:用戶信息

關聯查詢:訂單、訂單明細,商品信息

SELECT 
  orders.*,
  user.username,
  user.sex ,
  orderdetail.id orderdetail_id,
  orderdetail.items_num,
  orderdetail.items_id,
  items.name items_name,
  items.detail items_detail
FROM
  orders,
  USER,
  orderdetail,
  items
WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id AND items.id = orderdetail.items_id

運行------>

主查詢的表單出現重複數據,使用mybatis以下:

pojo定義:

User.java

Orders.java

Orderdetail.java

Items.java

mapper.xml(注意sql語句查詢時是否使用別名,有的話必定要同步)

 1 <!-- 一對多查詢,查詢用戶及訂單明細和商品信息 -->
 2 <resultMap id="userOrdersAndItemsResultMap" type="user">
 3     <!-- 用戶信息映射 -->
 4     <id column="id" property="id"/>
 5     <result column="username" property="username"/>
 6     <result column="sex" property="sex"/>
 7     <!-- 訂單信息映射 -->
 8     <!-- 下邊完成關聯信息的映射
 9         collection:用於對關聯信息映射到集合
10         property:要將關聯信息映射到User的哪一個屬性中
11         ofType:關聯信息映射到User的屬性的類型,能夠使用別名,不過全稱方便確認
12          -->
13     <collection property="orderlist" ofType="com.emuii.mybatis.pojo.Orders">
14         <!-- id:訂單關聯用戶查詢的惟一標識  -->
15         <id column="id" property="id"/>
16         <result column="user_id" property="userId"/>
17         <result column="number" property="number"/>
18         <result column="createtime" property="createtime"/>
19         <result column="note" property="note"/>
20         <!-- 訂單詳細信息映射 -->
21         <collection property="orderdetails" ofType="com.emuii.mybatis.pojo.Orderdetail">
22             <!-- id:關聯信息訂單明細的惟一標識
23                 property:Orderdetail的屬性名
24                   -->
25             <id column="orderdetail_id" property="id"/>
26             <result column="items_num" property="itemsNum"/>
27             <result column="items_id" property="itemsId"/>
28             <association property="items" javaType="com.emuii.mybatis.pojo.Items">
29                 <id column="id" property="id"/>
30                 <result column="items_name" property="name"/>
31                 <result column="items_detail" property="detail"/>
32             </association>
33         </collection>
34     </collection>
35 </resultMap>
36 
37 <!-- 一對多查詢使用reusltMap完成
38 查詢用戶及訂單和訂單明細,關聯商品,的信息
39 -->
40 <select id="findUserOrdersAndItems" resultMap="userOrdersAndItemsResultMap">
41     SELECT
42       orders.*,
43       user.username,
44       user.sex ,
45       orderdetail.id orderdetail_id,
46       orderdetail.items_num,
47       orderdetail.items_id,
48       items.name items_name,
49       items.detail items_detail
50     FROM
51       orders,
52       USER,
53       orderdetail,
54       items
55     WHERE orders.user_id = user.id  AND orders.id = orderdetail.orders_id AND items.id = orderdetail.items_id
56 </select>

mapper.java(代理接口)

Test:

 1 public class OrdersMapperTest {
 2 
 3     // 會話工廠
 4     private SqlSessionFactory sqlSessionFactory;
 5     // 建立工廠
 6     @Before
 7     public void init() throws IOException {
 8 
 9         // 配置文件(SqlMapConfig.xml)
10         String resource = "SqlMapConfig.xml";
11 
12         // 加載配置文件到輸入流
13         InputStream inputStream = Resources.getResourceAsStream(resource);
14 
15         // 建立會話工廠
16         sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
17     }
18 
19     @Test
20     public void testFindUserOrdersAndItems() throws Exception {
21 
22         // 獲取statement
23         SqlSession sqlSession = sqlSessionFactory.openSession();
24 
25         // 建立mapper代理接口(Dao接口)
26         OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
27         // 調用方法
28         List<User> list = ordersMapper.findUserOrdersAndItems();
29 
30         sqlSession.close();
31         System.out.println(list);
32     }
33 }

debug模式查看:

 出現兩行數據,可是總共有四條數據~

相關文章
相關標籤/搜索