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

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集合

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值