1.需求分析:
在开发中会遇到这样一个问题,查询订单信息,级联查询出用户信息和订单明细信息
2.sql语句实现
2.1确定主查询表:订单表
2.2确定关联查询表:用户表, 订单明细表
sql语句如下:
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;
|
查询结果如下:
映射要求:
不能出现重复的订单信息
3.编码实现
在orders.java中添加属性,List<OrdersDetail> ordersDetails 。类比hibernate学习,代码如下:
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; //看这里
}
|
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders的ordersDetails集合中,从上面查询结果图中可以看出最终的订单信息将为2条(orders信息不重复),每个订单orders中的属性存储了该订所对应的订单明细。
4.编写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 {
/**
* 查询订单关联查询用户信息和订单明细信息
*
* @return
*/
List<Orders> findOrderAndOrderDetailResultMap();
/**
* 查询订单关联查询用户信息
*
* @return
*/
List<OrdersCustom> findOrderUser() throws Exception;
/**
* 使用resultMap映射
*
* @return
* @throws RuntimeException
*/
List<Orders> findOrderUserResultMap() throws RuntimeException;
}
|
对于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" >
<!--订单查询关联用户和订单明细的信息的resultMap-->
< resultMap id = "orderAndOrderDetailResultMap" type = "orders" extends = "ordersUserResultMap" >
<!--配置订单信息 使用继承下面的-->
<!--配置订单关联的用户信息 使用继承下面的-->
<!--配置订单关联的订单明细信息
一条订单关联查询出了多条明细,要使用collection进行映射
collection :对关联查询到多条记录映射到集合中
property:将关联查询到的多条记录映射到com.djp.pojo.Orders中的哪个属性
ofType:指定映射到list集合属性中的pojo的类型
-->
< collection property = "ordersDetails" ofType = "OrdersDetail" >
<!--
id:订单明细的唯一标示
property:将订单明细的唯一标示映射到com.djp.pojo.OrdersDetail中的哪个属性
-->
< id column = "orderdetail_id" property = "id" />
< result column = "orderid" property = "orderId" />
< result column = "itemsid" property = "itemsId" />
</ collection >
</ resultMap >
<!--查询订单明细关联查询用户信息和订单明细信息的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 >
<!--订单查询关联用户的resultMap
将整个查询结果映射到com.djp.pojo.Orders中
-->
< resultMap id = "ordersUserResultMap" type = "com.djp.pojo.Orders" >
<!--配置映射的订单信息
result:普通列
id:指定查询列中的唯一标示,订单信息中的唯一标示,如果有多个列组成多个唯一标示,配置多个id
column:订单信息的唯一标示
property:订单信息的唯一标示,列所映射到Orders中的哪个属性
-->
< 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" />
<!--配置订单关联的用户信息
association:用于映射关联查询单个用户的信息
property:将要关联查询的用户信息映射到orders中的哪个属性
javaType:指定的类型,可以使用别名
-->
< association property = "user" javaType = "user" >
<!--
id :关联查询用户的唯一标示
column:指定表示用户信息的列
property:对应user.java中的哪个属性
-->
< 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 >
<!-- 查询订单关联查询用户信息 使用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 >
<!--查询订单关联查询用户信息-->
< 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 >
|
代码有点多,不怕得,下面的是之前的一对一的,注意继承至之前写好的resultMap。
5 写测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/**
* 查询订单关联查询用户信息和订单明细信息
*/
@Test
public void testFindOrderAndOrderDetailResultMap() {
try {
System.out.println( "start................." );
//通过得到的SqlSessionFactory打开回话sqlSession
SqlSession sqlSession = SqlSessionFactory.openSession();
//通过会话得到用户的代理
OrdersCustomMapper ordersCustomMapper = sqlSession.getMapper(OrdersCustomMapper. class );
List<Orders> list = ordersCustomMapper.findOrderAndOrderDetailResultMap();
for (Orders item : list) {
System.out.println( "订单+用户+订单明细:" +item);
}
} catch (Exception e) {
e.printStackTrace();
}
}
|
运行结果如下:
从图中可看出我们需要的订单信息,关联查询出的用户信息,关联查询出的订单明细信息都出来了!
6 .总结
mybatis使用resultMap实现一对多查询用collection对关联查询出的多条记录映射到一个list集合中
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.jianshu.com/p/42dc7598eb70?utm_source=tuicool&utm_medium=referral#