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

相关文章
SQL XML Java
296 0
|
7月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
640 12
|
8月前
|
SQL XML Java
MyBatis框架如何处理字符串相等的判断条件。
总的来说,MyBatis框架提供了灵活而强大的机制来处理SQL语句中的字符串相等判断条件。无论是简单的等值判断,还是复杂的条件逻辑,MyBatis都能通过其标签和属性来实现,使得动态SQL的编写既安全又高效。
688 0
|
9月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
788 13
|
10月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
589 1
|
Oracle 关系型数据库 Java
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
867 29
|
10月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1578 1
Spring boot 使用mybatis generator 自动生成代码插件
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
1038 0