1.需求分析:
在開(kāi)發(fā)中會(huì)遇到這樣一個(gè)問(wèn)題,查詢訂單信息,級(jí)聯(lián)查詢出用戶信息和訂單明細(xì)信息
2.sql語(yǔ)句實(shí)現(xiàn)
2.1確定主查詢表:訂單表
2.2確定關(guān)聯(lián)查詢表:用戶表, 訂單明細(xì)表
sql語(yǔ)句如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
select orders.*, t_user.address, t_user. name , t_user.brithday, orderdetail.id orderdetail_id, orderdetail.orderid, orderdetail.itemsid from orders, t_user, orderdetail where orders.userid=t_user.id AND orderdetail.orderid=orders.id; |
查詢結(jié)果如下:
映射要求:
不能出現(xiàn)重復(fù)的訂單信息
3.編碼實(shí)現(xiàn)
在orders.java中添加屬性,List<OrdersDetail> ordersDetails 。類(lèi)比hibernate學(xué)習(xí),代碼如下:
1
2
3
4
5
6
7
8
9
|
public class Orders { private int id; private String note; private Date dateTime; private String number; private int userId; private User user; private List<OrdersDetail> ordersDetails; //看這里 } |
最終會(huì)將訂單信息映射到orders中,訂單所對(duì)應(yīng)的訂單明細(xì)映射到orders的ordersDetails集合中,從上面查詢結(jié)果圖中可以看出最終的訂單信息將為2條(orders信息不重復(fù)),每個(gè)訂單orders中的屬性存儲(chǔ)了該訂所對(duì)應(yīng)的訂單明細(xì)。
4.編寫(xiě)mapper.java和mapper.xml文件
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
package com.djp.config.mapper; import com.djp.pojo.Orders; import com.djp.pojo.OrdersCustom; import java.util.List; public interface OrdersCustomMapper { /** * 查詢訂單關(guān)聯(lián)查詢用戶信息和訂單明細(xì)信息 * * @return */ List<Orders> findOrderAndOrderDetailResultMap(); /** * 查詢訂單關(guān)聯(lián)查詢用戶信息 * * @return */ List<OrdersCustom> findOrderUser() throws Exception; /** * 使用resultMap映射 * * @return * @throws RuntimeException */ List<Orders> findOrderUserResultMap() throws RuntimeException; } |
對(duì)于mapper.xml的解釋加在了代碼中 ,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
<? 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"> < mapper namespace = "com.djp.config.mapper.OrdersCustomMapper" > <!--訂單查詢關(guān)聯(lián)用戶和訂單明細(xì)的信息的resultMap--> < resultMap id = "orderAndOrderDetailResultMap" type = "orders" extends = "ordersUserResultMap" > <!--配置訂單信息 使用繼承下面的--> <!--配置訂單關(guān)聯(lián)的用戶信息 使用繼承下面的--> <!--配置訂單關(guān)聯(lián)的訂單明細(xì)信息 一條訂單關(guān)聯(lián)查詢出了多條明細(xì),要使用collection進(jìn)行映射 collection :對(duì)關(guān)聯(lián)查詢到多條記錄映射到集合中 property:將關(guān)聯(lián)查詢到的多條記錄映射到com.djp.pojo.Orders中的哪個(gè)屬性 ofType:指定映射到list集合屬性中的pojo的類(lèi)型 --> < collection property = "ordersDetails" ofType = "OrdersDetail" > <!-- id:訂單明細(xì)的唯一標(biāo)示 property:將訂單明細(xì)的唯一標(biāo)示映射到com.djp.pojo.OrdersDetail中的哪個(gè)屬性 --> < id column = "orderdetail_id" property = "id" /> < result column = "orderid" property = "orderId" /> < result column = "itemsid" property = "itemsId" /> </ collection > </ resultMap > <!--查詢訂單明細(xì)關(guān)聯(lián)查詢用戶信息和訂單明細(xì)信息的statement--> < select id = "findOrderAndOrderDetailResultMap" resultMap = "orderAndOrderDetailResultMap" > select orders.*, t_user.address, t_user.name, t_user.brithday, orderdetail.id orderdetail_id, orderdetail.orderid, orderdetail.itemsid from orders, t_user, orderdetail where orders.userid=t_user.id AND orderdetail.orderid=orders.id </ select > <!--訂單查詢關(guān)聯(lián)用戶的resultMap 將整個(gè)查詢結(jié)果映射到com.djp.pojo.Orders中 --> < resultMap id = "ordersUserResultMap" type = "com.djp.pojo.Orders" > <!--配置映射的訂單信息 result:普通列 id:指定查詢列中的唯一標(biāo)示,訂單信息中的唯一標(biāo)示,如果有多個(gè)列組成多個(gè)唯一標(biāo)示,配置多個(gè)id column:訂單信息的唯一標(biāo)示 property:訂單信息的唯一標(biāo)示,列所映射到Orders中的哪個(gè)屬性 --> < id column = "id" property = "id" /> < result column = "note" property = "note" /> < result column = "dateTime" property = "dateTime" /> < result column = "number" property = "number" /> < result column = "userId" property = "userId" /> <!--配置訂單關(guān)聯(lián)的用戶信息 association:用于映射關(guān)聯(lián)查詢單個(gè)用戶的信息 property:將要關(guān)聯(lián)查詢的用戶信息映射到orders中的哪個(gè)屬性 javaType:指定的類(lèi)型,可以使用別名 --> < association property = "user" javaType = "user" > <!-- id :關(guān)聯(lián)查詢用戶的唯一標(biāo)示 column:指定表示用戶信息的列 property:對(duì)應(yīng)user.java中的哪個(gè)屬性 --> < id column = "id" property = "id" /> < result column = "name" property = "name" /> < result column = "pwd" property = "pwd" /> < result column = "address" property = "address" /> < result column = "brithday" property = "brithday" /> </ association > </ resultMap > <!-- 查詢訂單關(guān)聯(lián)查詢用戶信息 使用resultMap--> < select id = "findOrderUserResultMap" resultMap = "ordersUserResultMap" > select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id </ select > <!--查詢訂單關(guān)聯(lián)查詢用戶信息--> < select id = "findOrderUser" resultType = "OrdersCustom" > select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id </ select > </ mapper > |
代碼有點(diǎn)多,不怕得,下面的是之前的一對(duì)一的,注意繼承至之前寫(xiě)好的resultMap。
5 寫(xiě)測(cè)試代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 查詢訂單關(guān)聯(lián)查詢用戶信息和訂單明細(xì)信息 */ @Test public void testFindOrderAndOrderDetailResultMap() { try { System.out.println( "start................." ); //通過(guò)得到的SqlSessionFactory打開(kāi)回話sqlSession SqlSession sqlSession = SqlSessionFactory.openSession(); //通過(guò)會(huì)話得到用戶的代理 OrdersCustomMapper ordersCustomMapper = sqlSession.getMapper(OrdersCustomMapper. class ); List<Orders> list = ordersCustomMapper.findOrderAndOrderDetailResultMap(); for (Orders item : list) { System.out.println( "訂單+用戶+訂單明細(xì):" +item); } } catch (Exception e) { e.printStackTrace(); } } |
運(yùn)行結(jié)果如下:
從圖中可看出我們需要的訂單信息,關(guān)聯(lián)查詢出的用戶信息,關(guān)聯(lián)查詢出的訂單明細(xì)信息都出來(lái)了!
6 .總結(jié)
mybatis使用resultMap實(shí)現(xiàn)一對(duì)多查詢用collection對(duì)關(guān)聯(lián)查詢出的多條記錄映射到一個(gè)list集合中
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.jianshu.com/p/42dc7598eb70?utm_source=tuicool&utm_medium=referral#