首页 > 编程 > Java > 正文

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

2019-11-26 12:34:38
字体:
来源:转载
供稿:网友

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;

查询结果如下:


映射要求:

不能出现重复的订单信息

3.编码实现

在orders.java中添加属性,List<OrdersDetail> 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<OrdersDetail> 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<Orders> findOrderAndOrderDetailResultMap(); /**  * 查询订单关联查询用户信息  *  * @return  */ List<OrdersCustom> findOrderUser() throws Exception; /**  * 使用resultMap映射  *  * @return  * @throws RuntimeException  */ List<Orders> findOrderUserResultMap() throws RuntimeException;}

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

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.djp.config.mapper.OrdersCustomMapper"> <!--订单查询关联用户和订单明细的信息的resultMap--> <resultMap id="orderAndOrderDetailResultMap" type="orders" extends="ordersUserResultMap">  <!--配置订单信息 使用继承下面的-->  <!--配置订单关联的用户信息 使用继承下面的-->   <!--配置订单关联的订单明细信息    一条订单关联查询出了多条明细,要使用collection进行映射    collection :对关联查询到多条记录映射到集合中    property:将关联查询到的多条记录映射到com.djp.pojo.Orders中的哪个属性    ofType:指定映射到list集合属性中的pojo的类型   -->  <collection property="ordersDetails" ofType="OrdersDetail">   <!--    id:订单明细的唯一标示    property:将订单明细的唯一标示映射到com.djp.pojo.OrdersDetail中的哪个属性   -->   <id column="orderdetail_id" property="id"/>   <result column="orderid" property="orderId"/>   <result column="itemsid" property="itemsId"/>  </collection> </resultMap> <!--查询订单明细关联查询用户信息和订单明细信息的statement--> <select id="findOrderAndOrderDetailResultMap" resultMap="orderAndOrderDetailResultMap"> 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 </select> <!--订单查询关联用户的resultMap  将整个查询结果映射到com.djp.pojo.Orders中 --> <resultMap id="ordersUserResultMap" type="com.djp.pojo.Orders">  <!--配置映射的订单信息   result:普通列   id:指定查询列中的唯一标示,订单信息中的唯一标示,如果有多个列组成多个唯一标示,配置多个id   column:订单信息的唯一标示   property:订单信息的唯一标示,列所映射到Orders中的哪个属性  -->  <id column="id" property="id"/>  <result column="note" property="note"/>  <result column="dateTime" property="dateTime"/>  <result column="number" property="number"/>  <result column="userId" property="userId"/>  <!--配置订单关联的用户信息   association:用于映射关联查询单个用户的信息   property:将要关联查询的用户信息映射到orders中的哪个属性   javaType:指定的类型,可以使用别名  -->  <association property="user" javaType="user">   <!--    id :关联查询用户的唯一标示    column:指定表示用户信息的列    property:对应user.java中的哪个属性   -->   <id column="id" property="id"/>   <result column="name" property="name"/>   <result column="pwd" property="pwd"/>   <result column="address" property="address"/>   <result column="brithday" property="brithday"/>  </association> </resultMap> <!-- 查询订单关联查询用户信息 使用resultMap--> <select id="findOrderUserResultMap" resultMap="ordersUserResultMap">select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id </select> <!--查询订单关联查询用户信息--> <select id="findOrderUser" resultType="OrdersCustom">select orders.*,t_user.address,t_user.name,t_user.brithday from orders, t_user where orders.userid=t_user.id </select></mapper>

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

5 写测试代码:

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

运行结果如下:

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

6 .总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表