前面学习了一对一的查询,现在我们在刚才的数据模型基础上进行一对多的查询。
一对多查询
1.需求
查询订单及订单明细的信息。
2.sql语句
确定主查询表:订单表
确定关联查询表:订单明细表
在一对一查询基础上添加订单明细表关联即可。
3.分析
使用resultType将上边的 查询结果映射到pojo中,订单信息的就是重复。
要求:
对orders映射不能出现重复记录。
4.在orders中添加list订单明细属性
在orders.java类中添加List<orderDetail> orderDetails属性。
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。
其中Orderdetail为
映射成的orders记录数为两条(orders信息不重复)
每个orders中的orderDetails属性存储了该订单所对应的订单明细。
5.mapper.xml
7.mapper.java
8.测试:
测试结果:
下单用户:
张三|男|河南焦作
订单明细:
订单id:1商品id:1订单总数:2
下单用户:
张三|男|河南焦作
订单明细:
订单id:2商品id:2订单总数:2
下单用户:
刘莉莉|女|山东威海
订单明细:
订单id:3商品id:3订单总数:1
日志输出:
9.小结
mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。
使用resultType实现:
一对多查询
1.需求
查询订单及订单明细的信息。
2.sql语句
确定主查询表:订单表
确定关联查询表:订单明细表
在一对一查询基础上添加订单明细表关联即可。
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
3.分析
使用resultType将上边的 查询结果映射到pojo中,订单信息的就是重复。
如图
要求:
对orders映射不能出现重复记录。
4.在orders中添加list订单明细属性
在orders.java类中添加List<orderDetail> orderDetails属性。
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。
package cn.edu.hpu.mybatis.PO; import java.util.Date; import java.util.List; public class Orders { private Integer id; private Integer userId; private String number; private Date creattime; private String note; //用户信息 private User user; //订单明细 private List<Orderdetail> orderdetils; //get和set方法省略 }
其中Orderdetail为
package cn.edu.hpu.mybatis.PO; public class Orderdetail { private int id; private int orders_id; private int items_id; private int items_num; //get和set方法省略 }
映射成的orders记录数为两条(orders信息不重复)
每个orders中的orderDetails属性存储了该订单所对应的订单明细。
5.mapper.xml
<pre name="code" class="html"><!-- 查询订单关联查询用户信息以及订单明细,使用resultMap --> <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap"> 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 </select>6.resultMap定义
<!-- 订单及订单明细的resultMap 使用extend继承,不用在此中配置订单信息和用户信息的映射 --> <resultMap type="cn.edu.hpu.mybatis.PO.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap"> <!-- 使用extend继承,不用在此中配置订单信息和用户信息的映射 --> <!-- 订单明细信息 一个订单关联查询出了多个明细,要使用 collection进行映射 collection:对关联查询到多条记录映射cn.edu.hpu.mybatis.PO.Orders哪个属性 ofType:指定要映射到的集合属性中pojo的类型(就是一个List<Orderdetail>的尖括号中的类型) --> <collection property="orderdetils" ofType="cn.edu.hpu.mybatis.PO.Orderdetail"> <!-- id:订单明细的唯一标识 --> <id column="orderdetail_id" property="id"/> <result column="items_id" property="items_id"/> <result column="items_num" property="items_num"/> <result column="orders_id" property="orders_id"/> </collection> </resultMap>
7.mapper.java
package cn.edu.hpu.mybatis.mapper; import java.util.List; import cn.edu.hpu.mybatis.PO.Orders; import cn.edu.hpu.mybatis.PO.OrdersCustom; //订单mapper public interface OrdersCustomMapper { //... //查询订单(关联查询用户)及订单明细使用resultMap public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception; }
8.测试:
@Test public void testFindOrdersAndOrderDetailResultMap() throws Exception{ SqlSession sqlSession=sqlSessionFactory.openSession(); //创建代理对象 OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class); //调用mapper的方法 List<Orders> list=ordersMapperCustom.findOrdersAndOrderDetailResultMap(); for (int i = 0; i < list.size(); i++) { Orders o=list.get(i); User u=o.getUser(); System.out.println("\n下单用户:"); System.out.println(u.getUsername()+"|"+u.getSex()+"|"+u.getAddress()); System.out.println("订单明细:"); List<Orderdetail> os=o.getOrderdetils(); if(os!=null){ for (int j = 0; j < os.size(); j++) { Orderdetail od=os.get(j); System.out.println("订单id:"+od.getOrders_id()+ "商品id:"+od.getItems_id()+"订单总数:"+od.getItems_num()); } } } sqlSession.close(); }
测试结果:
下单用户:
张三|男|河南焦作
订单明细:
订单id:1商品id:1订单总数:2
下单用户:
张三|男|河南焦作
订单明细:
订单id:2商品id:2订单总数:2
下单用户:
刘莉莉|女|山东威海
订单明细:
订单id:3商品id:3订单总数:1
日志输出:
DEBUG [main] - Opening JDBC Connection DEBUG [main] - Created connection 18135083. DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@114b82b] 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 DEBUG [main] - ==> Parameters: DEBUG [main] - <== Total: 3测试成功!
9.小结
mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。
使用resultType实现:
将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。
转载请注明出处:http://blog.csdn.net/acmman/article/details/46646033