【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指定输出类型,需要根据具体业务来定。

相关文章
|
3月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
203 8
|
24天前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
持久层框架MyBatisPlus
33 1
持久层框架MyBatisPlus
|
1月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
17 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
2月前
|
SQL Java 数据库连接
mybatis如何仅仅查询某个表的几个字段
【10月更文挑战第19天】mybatis如何仅仅查询某个表的几个字段
49 1
|
3月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
2月前
|
缓存 Cloud Native 安全
探索阿里巴巴新型ORM框架:超越MybatisPlus?
【10月更文挑战第9天】在Java开发领域,Mybatis及其增强工具MybatisPlus长期占据着ORM(对象关系映射)技术的主导地位。然而,随着技术的发展,阿里巴巴集团推出了一种新型ORM框架,旨在提供更高效、更简洁的开发体验。本文将对这一新型ORM框架进行探索,分析其特性,并与MybatisPlus进行比较。
38 0
|
4月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
4月前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
41 0
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
122 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
60 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块