转自:https://www.cnblogs.com/HigginCui/p/5850059.html
【需求】
查询订单以及订单明细的信息。
确定主查询表:订单表orders
确定关联查询表:订单明细表 orderdetail
在一对一查询的基础上添加订单明细表关联即可。
【分析】
使用resultMap将上面的查询结果映射到pojo中,订单信息有重复。
要求:对orders映射不能出现重复记录
在orders.java类中添加List
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。如下所示:
映射成的orders记录为两条(orders信息不能重复)
每个orders中的orderDetails属性存储了该订单所对应的订单明细。
【工程截图】
【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的collection对关联查询的多条记录映射映射到一个list集合属性中(private List
使用resultType也可以实现:
将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。