在xml中,要根据id批量查询,需要使用foreach循环collection,foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。
在mybatisPlus中,简便的做法:可以将queryWrapper作为参数传递到Mapper中
第一步:构建QueryWrapper对象,实质上通过in已经构建出了查询符合id的条件语句
QueryWrapper<OmsCartItem> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(OmsCartItem::getMemberId,currentMember.getId())
.in(OmsCartItem::getId,paramDTO.getItemIds());
// 根据购物车id查询所有购物车信息
List<CartItemStockDTO> cartItemStockByIds = cartItemMapper.getCartItemStockByIds(queryWrapper);
第二步:在自定义xml查询 结合mp的Wrapper 来使用:把wrapper作为参数传递,注意添加注解@Param(Constants.WRAPPER) Wrapper
/**
* 在自定义xml查询 结合mp的Wrapper 来使用
* @param ew
* @return
*/
List<CartItemStockDTO> getCartItemStockByIds(@Param(Constants.WRAPPER) Wrapper ew);
第三步:通过${ew.customSqlSegment}可以获取mybatisPlus的条件构造器wrapper生成的条件语句,不需要动态拼接条件来筛选
<!--根据多个购物车id批量查询 , 在xml中使用QueryWrapper, 使用customSqlSegment就可以获取mp帮我们生产条件sql语句-->
<select id="getCartItemStockByIds" resultMap="CarItemStockMap">
SELECT
*,(SELECT stock-lock_stock FROM pms_sku_stock s WHERE s.id=c.product_sku_id) as stock
FROM oms_cart_item c
${ew.customSqlSegment}
</select>