美文网首页
pagehelper插件一对多实现

pagehelper插件一对多实现

作者: 舟行几许 | 来源:发表于2019-11-30 19:05 被阅读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';
    

    需求

    • 一个商品包含多个商品信息
    • 查询出商品以及该商品所包含的所有商品信息,使用一个Dto作为返回对象

    mybatis原来的写法

    • 这种写法pageHelper是不支持的
    • 错误描述:
      • 比如说有21条数据,前台传的参数是{pageNumber: 1, pagerows: 10}
      • 用下面这种方法查询,控制台显示的都是正确的数据,但是传给前台后发现,只传了3条数据(或者其它数量)
      • pageCount等等都是对的,就是返回数据不对
      • 据说是因为pageHelper的去重机制//TODO
    <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); //通用写法
    

    相关文章

      网友评论

          本文标题:pagehelper插件一对多实现

          本文链接:https://www.haomeiwen.com/subject/skxawctx.html