mybatis关联查询,一对一,一对多

Posted yin.kh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis关联查询,一对一,一对多相关的知识,希望对你有一定的参考价值。

注:这篇文章的代码有部分删减,不能直接使用,不过关键代码都存在 

应用场景:

   想用mybatis做关联查询,并且把查询出的数据自动组装成对象可以使用关联查询。

1、一对一实现  

例如:一部小说,属于一个分类,查询小说的时候想同时查询出所属分类。

1)实体定义:

public class Book {
    private static final long serialVersionUID = 1L;
    
    /**
     *小说ID
     */
    private Integer bookId;
    /**
     *作者
     */
    private String author;
    /**
     *小说名称
     */
    private String bookName;
    /**
    /**
     *分类ID
     */
    private Integer catalogId;
    
    private CrawlCatalog catalog;
}
public class Catalog  {
    private static final long serialVersionUID = 1L;
    
    /**
     *分类ID
     */
    private Integer catalogId;
    /**
     *分类名字
     */
    private String name;
}

2) BookMapper实现

    <!--通用表字段列表-->
    <resultMap id="ResultMapWithCata" type="Book">
        <result column="BOOK_ID" property="bookId" jdbcType="INTEGER"/>
        <result column="AUTHOR" property="author" jdbcType="VARCHAR"/>
        <result column="BOOK_NAME" property="bookName" jdbcType="VARCHAR"/>
        <result column="CATALOG_ID" property="catalogId" jdbcType="INTEGER"/>
        <association property="catalog" javaType="Catalog">
            <id column="CATALOG_ID" property="catalogId" />
            <result column="CATALOGNAME" property="name" />
        </association>
    </resultMap>
    <!--通用表字段列表-->
  <!--
    方法名称: selectListByIds
    调用路径: BookEntityMapper.selectListByIds
    开发信息: 
    处理信息: 根据ID查询记录
    -->
    <select id="selectListByIds" parameterType="java.util.List" resultMap="ResultMapWithCata">
       SELECT   
               <include refid="columnListAlias"/>, c.NAME AS CATALOGNAME
       FROM   BOOK b, CATALOG c
       WHERE b.CATALOG_ID=c.CATALOG_ID AND (
        <foreach collection="list" item="item" index="index" separator=" OR " >  
            BOOK_ID=#{item}
           </foreach>
           )
    </select>

 

2、多对一实现

例如:一个用户在商城生成了一个订单,订单中包含很多商品,想在查询订单的同时把订单的明细查询出来

1)实体定义

public class Order {
    /** 主键订单Id */
    private Integer id;
    /** 下单用户id */
    private Integer userid;
    // 订单明细
    private List<OrderDetail> orderdetails;
}
public class OrderDetail {
    /** 主鍵,訂單明细表Id */
    private Integer id;
    /** 訂單Id */
    private Integer orderId;
    /** 商品id */
    private Integer itemsId;
    /** 商品购买数量 */
    private Integer itemsNum;
    // 明细对应的商品信息
    private Items items;
}

 

2)OrderMapper实现

<!-- 查询订单关联查询用户及订单明细 -->
<select id="findOrdersAndOrderDetailResultMap" resultMap="ordersAndOrderDetailResultMap">
    SELECT 
      t1.*,
      t3.id orderdetail_id,
      t3.item_id,
      t3.item_num,
      t3.order_id
    FROM
      order t1,
      orderdetail t3
    WHERE t3.orders_id=t1.id
</select>
<!-- 查询订单(关联用户)及订单明细的resultMap -->
<resultMap type="Orders" id="ordersAndOrderDetailResultMap">
  <id column="id" property="id"/>
  <result column="user_id" property="userId"/>
  <collection property="orderdetails" ofType="OrderDetail">
    <id column="orderdetail_id" property="id"/>
    <result column="item_id" property="itemId"/>
    <result column="item_num" property="itemNum"/>
    <result column="order_id" property="orderId"/>
  </collection>
</resultMap>

 

以上是关于mybatis关联查询,一对一,一对多的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis高级篇 - 关联查询(一对多)

SpringBoot与Mybatis整合(包含generate自动生成代码工具,数据库表一对一,一对多,关联关系中间表的查询)

MyBatis关联查询,一对多关联查询

MyBatis4——一对一对多关联查询

Mybatis的关联查询(一对一,一对多)

MyBatis高级篇 - 关联查询(一对一)