今天写接口的时候用pageHelper关联两张表一对多查询,发现用普通的mybaits里的方法虽然能查出数据,但是返回数据的个数和自己设置的却不一样;到网上查了一下,原来pagehelper不支持一对多查询,因此就要使用以下的方法。特此记录一下
表数据
- 采用最常见的例子 商品与商品信息
#商品表
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
- 比如说有21条数据,前台传的参数是
<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>
改进后的写法
- resultMap
- 注意在<collection>标签里加了一个column属性
column="{itemId=item_Id}"
- itemId:就是起的一个名字
- item_Id:必须要在父查询的select字段中
- 后面子查询会有一个
where item_id = #{itemId}
加这个column属性的目的就是为了在where这里使用
- 注意在<collection>标签里加了一个column属性
<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>
- 主查询
<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>
- 子嵌套查询
<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>
- mapper接口
List<Item> selectItemAndSku(Map<String, Object> map);
- 使用分页插件进行分页
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); //通用写法
网友评论