【MyBatis框架点滴】——MyBatis多对多查询

简介:   上篇文章说了MyBatis中的一对多的查询方法,这里总结一下MyBatis中多对多的查询。

  上篇文章说了MyBatis中的一对多的查询方法,这里总结一下MyBatis中多对多的查询。

  业务还用上篇文章中的订单业务来分析,表结构如下:


9.png


 一个用户可以购买多种商品,一种商品也可以由多个用户购买。这里以用户表为主查询表,查询用户信息及其该用户所购买的商品信息。


 由于用户表和商品表没有直接联系,所以只能通过它们之间的两个媒介——订单表和订单明细表来映射。



 对于实体的要求,在User中需要定义Orders的集合,在Orders中需要定义OrderDetail的集合,在OrderDetail中需要定义Item的实例:


 user→orders→orderdetail→item



 User.java


private int id;
  private String username;
  private int sex;
  private Date birthday;
  private String address;
  private List<Orders> orders;
  //getter、setter
}

  Orders.java

public class Orders {
  private Integer id;
  private Integer userId;
  private String number;
  private Date createtime;
  private String note;
  private List<OrderDetail> orderDetails;
  //getter、setter
}


  OrderDetail.java

public class OrderDetail {
  private Integer id;
  private Integer ordersId;
  private Integer itemsId;
  private Integer itemsNum;
  private Item item;
  //getter、setter
}


  Item.java

public class Item{
  private Integer id;
  private String name;
  private float price;
  private String detail;
  private String pic;
  private Date createTime;
  //getter、setter
}


 映射文件UserMapper.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.danny.mybatis.mapper.UserMapper" >
  <resultMap type="com.danny.mybatis.po.User" id="UserItemResultMap">
    <!-- 配置映射的用户信息 -->  
    <id column="user_id" property="id"/>
    <result column="username" property="username"/>
    <result column="sex" property="sex"/>
    <result column="address" property="address"/>
    <!-- 配置映射的订单信息 -->
    <collection property="orders" ofType="com.danny.mybatis.po.Orders">
      <id column="id" property="id"/>
      <result column="number" property="number"/>
      <result column="note" property="note"/>
      <result column="createtime" property="createtime"/>
      <!-- 配置映射的订单明细信息 -->
      <collection property="orderDetails" ofType="com.danny.mybatis.po.OrderDetail">
        <id column="orderdetail_id" property="id"/>
        <result column="items_id" property="itemsId"/>
        <result column="items_num" property="itemsNum"/>
        <result column="orders_id" property="ordersId"/>
        <!-- 配置映射的商品信息 -->
        <association property="item" javaType="com.danny.mybatis.po.Item">
          <id column="item_id" property="id"/>
          <result column="item_name" property="name"/>
          <result column="item_price" property="price"/>
          <result column="item_detail" property="detail"/>
        </association>
      </collection>
    </collection>
  </resultMap>
  <select id="findUserItemResultMap" resultMap="UserItemResultMap" >
      select
      orders.*,
      user.username,
      user.sex,
      user.address,
      orderdetail.id orderdetail_id,
      orderdetail.items_id,
      orderdetail.items_num,
      orderdetail.orders_id,
      item.id item_id,
      item.name item_name,
      item.detail item_detail,
      item.price item_price
      from orders,user,orderdetail,item
      where orders.user_id=user.id
    and orders.id=orderdetail.orders_id
    and orderdetail.items_id=item.id
    </select>
</mapper>


 如上,配置resultMap的方式跟前面一对一和一对多两篇文章中一样,用<collection></collection>和<association></association>分别对集合和实体进行关联映射,而且它们层层嵌套的方式就跟实体之间层层嵌套的方式一样:user中包含orders,orders中包含orderdetail,orderdetail中包含item。



 mapper接口


public interface UserMapper {
  List<User> findUserItemResultMap() throws Exception;
}



  测试

@Test
  public void findUserItemResultMap(){
    SqlSession sqlSession=sqlSessionFactory.openSession();
    UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
    try {
      List<User> list=userMapper.findUserItemResultMap();
      if (list!=null) {
        System.out.println(list.size());
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    System.out.println();
  }


  数据库中同样是上篇文章中的8条数据,断点调试查看list中的内容如下:


12.png


  到此,MyBatis的关联查询就算总结完成了,具体用那种关联查询,用resultType还是resultMap指定输出类型,需要根据具体业务来定。

相关文章
|
11天前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
42 8
|
12天前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
2月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
2月前
|
Java 数据库连接 mybatis
mybatis框架图
文章介绍了MyBatis框架的起源、发展和其作为持久层框架的功能,提供了MyBatis的框架图以帮助理解其结构和组件。
mybatis框架图
|
2月前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
18 0
|
2月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
179 0
|
2月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
2月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(7、使用注解开发)
这篇文章讲述了如何使用MyBatis框架的注解方式进行开发,包括在接口上使用注解定义SQL语句,并通过动态代理实现对数据库的增删改查操作,同时强调了接口需要在核心配置文件中注册绑定。
|
25天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
12天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用