【MyBatis框架】高级映射-一对多查询

前面学习了一对一的查询,现在我们在刚才的数据模型基础上进行一对多的查询。

一对多查询

1.需求
查询订单及订单明细的信息。

2.sql语句
确定主查询表:订单表
确定关联查询表:订单明细表
在一对一查询基础上添加订单明细表关联即可。
[sql]  view plain  copy
  1. SELECT   
  2.   orders.*,  
  3.   USER.username,  
  4.   USER.sex,  
  5.   USER.address,  
  6.   orderdetail.id orderdetail_id,  
  7.   orderdetail.items_id,  
  8.   orderdetail.items_num,  
  9.   orderdetail.orders_id  
  10. FROM  
  11.   orders,  
  12.   USER,  
  13.   orderdetail  
  14. WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id  

3.分析
使用resultType将上边的 查询结果映射到pojo中,订单信息的就是重复。

如图



要求:
对orders映射不能出现重复记录。

4.在orders中添加list订单明细属性

在orders.java类中添加List<orderDetail> orderDetails属性。
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。
[java]  view plain  copy
  1. package cn.edu.hpu.mybatis.PO;  
  2.   
  3. import java.util.Date;  
  4. import java.util.List;  
  5.   
  6.   
  7. public class Orders {  
  8.   
  9.   
  10.     private Integer id;  
  11.       
  12.     private Integer userId;  
  13.       
  14.     private String number;  
  15.       
  16.     private Date creattime;  
  17.       
  18.     private String note;  
  19.       
  20.     //用户信息  
  21.     private User user;  
  22.       
  23.     //订单明细  
  24.     private List<Orderdetail> orderdetils;  
  25.   
  26.   
  27.     //get和set方法省略  
  28. }  

其中Orderdetail为
[java]  view plain  copy
  1. package cn.edu.hpu.mybatis.PO;  
  2.   
  3.   
  4. public class Orderdetail {  
  5.       
  6.     private int id;  
  7.       
  8.     private int orders_id;  
  9.       
  10.     private int items_id;  
  11.       
  12.     private int items_num;  
  13.   
  14.   
  15.     //get和set方法省略  
  16. }  

映射成的orders记录数为两条(orders信息不重复)
每个orders中的orderDetails属性存储了该订单所对应的订单明细。

5.mapper.xml
[java]  view plain  copy
  1. <pre name="code" class="html"><!-- 查询订单关联查询用户信息以及订单明细,使用resultMap -->  
  2.       
  3.     <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">  
  4.         SELECT   
  5.           orders.*,  
  6.           USER.username,  
  7.           USER.sex,  
  8.           USER.address,  
  9.           orderdetail.id orderdetail_id,  
  10.           orderdetail.items_id,  
  11.           orderdetail.items_num,  
  12.           orderdetail.orders_id  
  13.         FROM  
  14.           orders,  
  15.           USER,  
  16.           orderdetail  
  17.         WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id  
  18.     </select>  
 
6.resultMap定义 
[html]  view plain  copy
  1. <!-- 订单及订单明细的resultMap  
  2.          使用extend继承,不用在此中配置订单信息和用户信息的映射 -->  
  3.     <resultMap type="cn.edu.hpu.mybatis.PO.Orders" id="OrdersAndOrderDetailResultMap"   
  4.                extends="OrdersUserResultMap">  
  5.           
  6.         <!-- 使用extend继承,不用在此中配置订单信息和用户信息的映射 -->  
  7.       
  8.         <!-- 订单明细信息  
  9.         一个订单关联查询出了多个明细,要使用  
  10.         collection进行映射  
  11.         collection:对关联查询到多条记录映射cn.edu.hpu.mybatis.PO.Orders哪个属性  
  12.         ofType:指定要映射到的集合属性中pojo的类型(就是一个List<Orderdetail>的尖括号中的类型)  
  13.         -->  
  14.         <collection property="orderdetils" ofType="cn.edu.hpu.mybatis.PO.Orderdetail">  
  15.             <!-- id:订单明细的唯一标识 -->  
  16.             <id column="orderdetail_id" property="id"/>  
  17.             <result column="items_id" property="items_id"/>  
  18.             <result column="items_num" property="items_num"/>  
  19.             <result column="orders_id" property="orders_id"/>  
  20.         </collection>  
  21.           
  22. </resultMap>  

7.mapper.java
[java]  view plain  copy
  1. package cn.edu.hpu.mybatis.mapper;  
  2.   
  3. import java.util.List;  
  4.   
  5. import cn.edu.hpu.mybatis.PO.Orders;  
  6. import cn.edu.hpu.mybatis.PO.OrdersCustom;  
  7.   
  8.   
  9. //订单mapper  
  10. public interface OrdersCustomMapper {  
  11.       
  12.     //...  
  13.   
  14.   
  15.     //查询订单(关联查询用户)及订单明细使用resultMap  
  16.     public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;  
  17. }  

8.测试:
[java]  view plain  copy
  1. @Test  
  2. public void testFindOrdersAndOrderDetailResultMap() throws Exception{  
  3.       
  4.     SqlSession sqlSession=sqlSessionFactory.openSession();  
  5.     //创建代理对象  
  6.     OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class);  
  7.       
  8.     //调用mapper的方法  
  9.     List<Orders> list=ordersMapperCustom.findOrdersAndOrderDetailResultMap();  
  10.       
  11.     for (int i = 0; i < list.size(); i++) {  
  12.         Orders  o=list.get(i);  
  13.         User u=o.getUser();  
  14.         System.out.println("\n下单用户:");  
  15.         System.out.println(u.getUsername()+"|"+u.getSex()+"|"+u.getAddress());  
  16.         System.out.println("订单明细:");  
  17.         List<Orderdetail> os=o.getOrderdetils();  
  18.         if(os!=null){  
  19.             for (int j = 0; j < os.size(); j++) {  
  20.                 Orderdetail od=os.get(j);  
  21.                 System.out.println("订单id:"+od.getOrders_id()+  
  22.                         "商品id:"+od.getItems_id()+"订单总数:"+od.getItems_num());  
  23.             }  
  24.         }  
  25.     }  
  26.     sqlSession.close();  
  27. }  

测试结果:

下单用户:
张三|男|河南焦作
订单明细:
订单id:1商品id:1订单总数:2


下单用户:
张三|男|河南焦作
订单明细:
订单id:2商品id:2订单总数:2


下单用户:
刘莉莉|女|山东威海
订单明细:
订单id:3商品id:3订单总数:1


日志输出:
[plain]  view plain  copy
  1. DEBUG [main] - Opening JDBC Connection  
  2. DEBUG [main] - Created connection 18135083.  
  3. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@114b82b]  
  4. DEBUG [main] - ==>  Preparing: SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id   
  5. DEBUG [main] - ==> Parameters:   
  6. DEBUG [main] - <==      Total: 3  
测试成功!


9.小结
mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。

使用resultType实现:

将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值