pagehelper插件一对多实现

2019-11-30  本文已影响0人  舟行几许

今天写接口的时候用pageHelper关联两张表一对多查询,发现用普通的mybaits里的方法虽然能查出数据,但是返回数据的个数和自己设置的却不一样;到网上查了一下,原来pagehelper不支持一对多查询,因此就要使用以下的方法。特此记录一下

参考:https://www.cnblogs.com/levywang/p/mybatis_one2many.html

表数据

#商品表
CREATE TABLE `item` (
  `item_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '商品编号',
  `img_url` varchar(500) NOT NULL DEFAULT '' COMMENT '图片地址',
  `title` varchar(1000) NOT NULL COMMENT '标题',
  `price` varchar(500) NOT NULL COMMENT '价格',
  `item_type` varchar(30) NOT NULL COMMENT '类别',
  `quantity` bigint(20) NOT NULL COMMENT '数量',
  PRIMARY KEY (`item_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='商品';
#商品信息表
CREATE TABLE `item_sku` (
  `sku_id` bigint(20) NOT NULL AUTO_INCREMENT  COMMENT '规格ID',
  `item_id` varchar(30) NOT NULL COMMENT '商品ID',
  `sku_price` varchar(100) NOT NULL DEFAULT '' COMMENT 'SKU价格',
  `sku_unique_code` varchar(100) NOT NULL COMMENT '规格唯一标识',
  `quantity` bigint(20) NOT NULL COMMENT '数量',
  PRIMARY KEY (`sku_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='商品SKU';

需求

mybatis原来的写法

<resultMap id="item" type="com.demo.dal.entity.pojo.Item">
        <result column="item_id" jdbcType="VARCHAR" property="itemId"/>
        <result column="img_url" jdbcType="VARCHAR" property="imgUrl"/>
        <result column="title" jdbcType="VARCHAR" property="title"/>
        <result column="price" jdbcType="VARCHAR" property="price"/>
        <result column="item_type" jdbcType="VARCHAR" property="itemType"/>
        <result column="quantity" jdbcType="BIGINT" property="quantity"/>

        <collection property="itemSkus" ofType="com.demo.dal.entity.pojo.ItemSku"
                    javaType="java.util.List" select="getSkuByItemId">
            <result column="sku_id" jdbcType="VARCHAR" property="skuId"/>
            <result column="sku_price" jdbcType="VARCHAR" property="skuPrice"/>
            <result column="sku_unique_code" jdbcType="VARCHAR" property="skuUniqueCode"/>
            <result column="quantity" jdbcType="BIGINT" property="quantity"/>
        </collection>
</resultMap>

<select id="selectItemAndSku" resultMap="item" parameterType="map">
        SELECT
        s1.item_id,
        s1.title,
        s1.img_url,
        s1.item_type,
        s1.price,
        s1.quantity,
        FROM item s1 left inner join item_sku s2
            on s1.item_id = s2.item_id
        order by item_id desc
</select>

改进后的写法

  1. resultMap
    • 注意在<collection>标签里加了一个column属性column="{itemId=item_Id}"
      • itemId:就是起的一个名字
      • item_Id:必须要在父查询的select字段中
      • 后面子查询会有一个where item_id = #{itemId}加这个column属性的目的就是为了在where这里使用
<resultMap id="item" type="com.demo.dal.entity.pojo.Item">
        <result column="item_id" jdbcType="VARCHAR" property="itemId"/>
        <result column="img_url" jdbcType="VARCHAR" property="imgUrl"/>
        <result column="title" jdbcType="VARCHAR" property="title"/>
        <result column="price" jdbcType="VARCHAR" property="price"/>
        <result column="item_type" jdbcType="VARCHAR" property="itemType"/>
        <result column="quantity" jdbcType="BIGINT" property="quantity"/>

        <collection property="itemSkus" ofType="com.demo.dal.entity.pojo.ItemSku"
                    javaType="java.util.List" select="getSkuByItemId"
                    column="{itemId=item_Id}"><!--{itemId=item_Id,quantity=quantity} 要查询的列 必须在父查询的select字段中-->   <!--property字段对应的itemSkus必须在结果集中List的字段名 如:private List<ItemSku> itemSkus;-->
            <result column="sku_id" jdbcType="VARCHAR" property="skuId"/>
            <result column="sku_price" jdbcType="VARCHAR" property="skuPrice"/>
            <result column="sku_unique_code" jdbcType="VARCHAR" property="skuUniqueCode"/>
            <result column="quantity" jdbcType="BIGINT" property="quantity"/>
        </collection>
</resultMap>
  1. 主查询
<select id="selectItemAndSku" resultMap="item" parameterType="map">
        SELECT
        s1.item_id,
        s1.title,
        s1.img_url,
        s1.item_type,
        s1.price,
        s1.quantity,
        FROM
        item s1
        <where>
            <if test="title != null and title != ''">
                AND s1.title LIKE '%${title}%'
            </if>
            <if test="itemId != null and itemId != ''">
                AND s1.item_id = '${itemId}'
            </if>
        </where>
        order by item_id desc
</select>
  1. 子嵌套查询
<select id="getSkuByItemId" parameterType="map"
            resultType="map">
    select s2.sku_id,
            s2.sku_price,
            s2.sku_unique_code,
            s2.quantity,
    from item_sku s2
    where
    s2.item_id = #{itemId}
    ORDER BY s2.sku_id
</select>
  1. mapper接口
List<Item> selectItemAndSku(Map<String, Object> map);
  1. 使用分页插件进行分页
PageInfo<Item> pageInfo =
          PageHelper.startPage(page, pageSize)
              .doSelectPageInfo(
                  () ->
                      itemDao.selectItemAndSku(map);//JDK 8.0以上的语法
                     
  //List<Item> list = PageHelper.startPage(page, pageSize);
  //itemDao.selectItemAndSku(map);
  //PageInfo<Item> pageInfo = new PageInfo<>(list); //通用写法
上一篇下一篇

猜你喜欢

热点阅读