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

1.需求分析:


在开发中会遇到这样一个问题,查询订单信息,级联查询出用户信息和订单明细信息


2.sql语句实现


2.1确定主查询表:订单表
2.2确定关联查询表:用户表, 订单明细表
sql语句如下:

 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;

查询结果如下:

选区_001.png

映射要求:

不能出现重复的订单信息


3.编码实现

在orders.java中添加属性,List ordersDetails 。类比hibernate学习,代码如下:

public class Orders {
    private int id;
    private String note;
    private Date dateTime;
    private String number;
    private int userId;
    private User user;
    private List ordersDetails;//看这里
}

最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders的ordersDetails集合中,从上面查询结果图中可以看出最终的订单信息将为2条(orders信息不重复),每个订单orders中的属性存储了该订所对应的订单明细。

4.编写mapper.java和mapper.xml文件

代码如下:

package com.djp.config.mapper;


import com.djp.pojo.Orders;
import com.djp.pojo.OrdersCustom;

import java.util.List;

public interface OrdersCustomMapper {
    /**
     * 查询订单关联查询用户信息和订单明细信息
     *
     * @return
     */
    List findOrderAndOrderDetailResultMap();

    /**
     * 查询订单关联查询用户信息
     *
     * @return
     */
    List findOrderUser() throws Exception;

    /**
     * 使用resultMap映射
     *
     * @return
     * @throws RuntimeException
     */
    List findOrderUserResultMap() throws RuntimeException;
}

对于mapper.xml的解释加在了代码中 ,如下:





    
    
        
        
         
        
            
            
            
            
        
    
    
    
    
    
        
        
        
        
        
        
        
        
            
            
            
            
            
            
        
    
    
    
    
    

代码有点多,不怕得,下面的是之前的一对一的,注意继承至之前写好的resultMap。

5 写测试代码:

 /**
     * 查询订单关联查询用户信息和订单明细信息
     */
    @Test
    public void testFindOrderAndOrderDetailResultMap() {
        try {
            System.out.println("start.................");
            //通过得到的SqlSessionFactory打开回话sqlSession
            SqlSession sqlSession = SqlSessionFactory.openSession();
            //通过会话得到用户的代理
            OrdersCustomMapper ordersCustomMapper = sqlSession.getMapper(OrdersCustomMapper.class);
            List list = ordersCustomMapper.findOrderAndOrderDetailResultMap();
                for (Orders item : list) {
                System.out.println("订单+用户+订单明细:"+item);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


运行结果如下:


mybatis高级映射一对多查询实现_第1张图片
关联查询.png

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

6 .总结

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

你可能感兴趣的:(mybatis高级映射一对多查询实现)