MyBatis一对多查询(使用resultMap)

转自:https://www.cnblogs.com/HigginCui/p/5850059.html

【需求】

查询订单以及订单明细的信息。

MyBatis一对多查询(使用resultMap)_第1张图片

确定主查询表:订单表orders

确定关联查询表:订单明细表 orderdetail

在一对一查询的基础上添加订单明细表关联即可。

【分析】

使用resultMap将上面的查询结果映射到pojo中,订单信息有重复。

MyBatis一对多查询(使用resultMap)_第2张图片

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

在orders.java类中添加List orderDetails属性。

最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。如下所示:

MyBatis一对多查询(使用resultMap)_第3张图片

映射成的orders记录为两条(orders信息不能重复)

每个orders中的orderDetails属性存储了该订单所对应的订单明细。

 

 【工程截图】

MyBatis一对多查询(使用resultMap)_第4张图片

【User.java】

package cn.higgin.mybatis.po;

import java.util.Date;

public class User {
    //属性名和数据库表的字段对应
    private int id;
    private String username;
    private String sex;
    private Date birthday;
    private String address;
    //set/get方法忽略.....
}

【Orderdetail.java】

package cn.higgin.mybatis.po;

public class Orderdetail {
    private Integer id;

    private Integer ordersId;

    private Integer itemsId;

    private Integer itemsNum;
    //get/set方法忽略......
}

【Orders.java】

package cn.higgin.mybatis.po;
import java.util.Date;
import java.util.List;

public class Orders {
    
    private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note;
    //引入用户信息
    private User user;
    //引入订单明细(和上面的用户信息不同,一个是一对一,一个是一对多)
    private List orderdetails; //注意是orderdetails,一个有's',一个有's'
    //忽略set/get方法......
}

【OrdersMapperCustom.java】

package cn.higgin.mybatis.mapper;

import java.util.List;

import cn.higgin.mybatis.po.Orders;

public interface OrdersMapperCustom {
    
    //查询订单(关联用户)及订单明细
    public List findOrdersAndOrderDetailResultMap() throws Exception;
}

【OrdersMapperCustomer.xml】





    
    
     
         
         
          
          
          
          
          
          
          
          
           
               
                
                
                
                
           
     
    
    
    
    
        
        
        
        
        
         
             
             
             
             
             
         
    
    
    
     
    

 

【OrdersMapperCustomTest.java】

package cn.higgin.mybatis.mapper;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import cn.higgin.mybatis.po.Orders;

public class OrdersMapperCustomTest {
    private SqlSessionFactory sqlSessionFactory;

    // 此方法是在执行testFindUserById之前执行
    @Before
    public void setUp() throws Exception {
        // 创建sqlSessionFactory

        // mybatis配置文件
        String resource = "SqlMapConfig.xml";
        // 得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);

        // 创建会话工厂,传入mybatis的配置文件信息
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void testFindOrdersUser() throws Exception {
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //创建代理对象
        OrdersMapperCustom ordersMapperCustom=sqlSession.getMapper(OrdersMapperCustom.class);
        
        //调用mapper的方法
        List list=ordersMapperCustom.findOrdersAndOrderDetailResultMap();
        
        System.out.println(list.size());
        
        sqlSession.close();
    }
}

【debug运行结果】

可见只有两条记录:

MyBatis一对多查询(使用resultMap)_第5张图片

再查看一下具体内容:

MyBatis一对多查询(使用resultMap)_第6张图片

注意:重复的数据被合并,不重复的数据在集合中,下图作对比:

MyBatis一对多查询(使用resultMap)_第7张图片

【小结】

mybatis使用resultMap的collection对关联查询的多条记录映射映射到一个list集合属性中(private List orderdetails;)。

使用resultType也可以实现:

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

你可能感兴趣的:(mybatis)