mybatis高级映射一对多查询实现代码

2025-05-29 0 83

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;

查询结果如下:

mybatis高级映射一对多查询实现代码

映射要求:

不能出现重复的订单信息

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();

}

}

运行结果如下:

mybatis高级映射一对多查询实现代码

从图中可看出我们需要的订单信息,关联查询出的用户信息,关联查询出的订单明细信息都出来了!

6 .总结

mybatis使用resultMap实现一对多查询用collection对关联查询出的多条记录映射到一个list集合中

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://www.jianshu.com/p/42dc7598eb70?utm_source=tuicool&utm_medium=referral#

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 mybatis高级映射一对多查询实现代码 https://www.kuaiidc.com/117298.html

相关文章

发表评论
暂无评论