当前位置: 移动技术网 > IT编程>开发语言>Java > mybatis高级映射一对多查询实现代码

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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集合中

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网