应用场景:
- 图片(比如填报一个产品,这个产品有很多属性,里面有这种动态的增删改查操作,应该怎么操作),像这种的还有传视频还有图片什么的
- 思路:
后端:是再创建一个表,专门存这种动态的数据(数据库表这样,里面存一个产品的id,进行关联产品所有的属性)
前端:用户在前端进行填写申报的时候,前端进行动态的传集合数据。如果为空,传空集合
postman 测试新增:
增查代码案例:
- 实体类
//NewProductAdd 产品实体类,一对多的情况@ApiModelProperty(value="ID", example="")private String id;@ApiModelProperty(value="名称", example="")private String name;@ApiModelProperty(value="产品属性", example="")private List<NewProductAttributeAdd> newProductAttributeAdds;//-----------------------------------------------------------//NewProductAttributeAdd 产品属性关联表的实体类@ApiModelProperty(value="ID", example="")private String id;@ApiModelProperty(value="供需id", example="")private String productId;@ApiModelProperty(value="属性名", example="")private String name;@ApiModelProperty(value="属性值", example="")private String value;
- controller
/**
* 添加供需产品表
*
* @param param 供需产品表添加参数
* return 供需产品表操作结果信息返回
*/@ApiOperation(value="添加供需产品表", notes="添加供需产品表", httpMethod="POST")@PostMapping(value="/newProduct/add")public Result addNewProduct(@Validated@RequestBody@ApiParam(value="添加供需产品表参数") NewProductAdd param){
newProductService.addNewProduct(param);return Result.SUCCESS;}/**
* 查询供需产品表分页信息列表
*
* @param param 供需产品表列表参数
* return 供需产品表列表信息返回
*/@ApiOperation(value="查询供需产品表", notes="查询供需产品表", httpMethod="POST")@PostMapping(value="/newProduct/list")public ResultPage<NewProductListItem> listNewProduct(@Validated@RequestBody@ApiParam(value="查询供需产品表列表参数") NewProductList param){
PageInfo<NewProductListItem> bean= newProductService.listNewProduct(param,true);returnnewResultPage(bean);
- service
//添加供需产品表
NewProductaddNewProduct(NewProductAdd newProductAdd);//查询供需产品表分页信息列表
PageInfo<NewProductListItem>listNewProduct(NewProductList param,Boolean isportal);
- impl
//添加供需产品表@Override@Transactional(rollbackFor= Exception.class, timeout= Constants.TIMEOUT)public NewProductaddNewProduct(NewProductAdd param){
NewProduct bean=newNewProduct();
BeanUtils.copyProperties(param, bean);
bean.setId(StringUtil.uuid());this.newProductDao.addNewProduct(bean);//如果修改的话,先删除产品属性,然后再添加//newProductAttributeDao.removeNewProductAttributeByProductId(param.getId());// 保存产品属性,这里是单独的一张表,就是遍历将每条属性添加这张表里
List<NewProductAttributeAdd> newProductAttributeAdds= param.getNewProductAttributeAdds();if(!CollectionUtils.isEmpty(newProductAttributeAdds)){for(NewProductAttributeAdd newProductAttributeAdd: newProductAttributeAdds){
newProductAttributeAdd.setProductId(bean.getId());
newProductAttributeService.addNewProductAttribute(newProductAttributeAdd);}}// 保存产品属性,第二种方式插入表中,插入多条数据只需要一个sql/*List<NewProductAttributeAdd> newProductAttributeAdds = param.getNewProductAttributeAdds();
if (!CollectionUtils.isEmpty(newProductAttributeAdds)) {
for (NewProductAttributeAdd newProductAttributeAdd : newProductAttributeAdds) {
newProductAttributeAdd.setProductId(bean.getId());
newProductAttributeAdd.setId(StringUtil.uuid());
}
newProductAttributeDao.insertBatchNewProductAttribute(param.getNewProductAttributeAdds());
}*/return bean;}//查询供需产品表分页信息列表@Overridepublic PageInfo<NewProductListItem>listNewProduct(NewProductList param, Boolean isportal){
List<NewProductListItem> list=newArrayList<>();if(isportal){
PageHelper.startPage(param.getPageIndex(), param.getPageSize());
list= newProductDao.listNewProductPortal(param);}returnnewPageInfo<NewProductListItem>(list);}
- dao
//添加供需产品表voidaddNewProduct(NewProduct newProduct);//批量添加供需产品表(第二种方式批量添加)voidinsertBatchNewProductAttribute(List<NewProductAttributeAdd> newProductAttributeAdds);//查询供需产品表分页信息列表
List<NewProductListItem>listNewProductPortal(NewProductList param);/** 修改的时候,需要先删除产品属性,会用到这个sql语句 */@Delete("delete from new_product_attribute where product_id = #{id}")voidremoveNewProductAttributeByProductId(@Param("id") String id);
- xml
<!-- 添加NewProduct--><insert id="addNewProduct">
insert intonew_product(id,name)
values(#{id},#{name})</insert><!-- 批量添加供需产品表,这是第二种方式批量添加--><insert id="insertBatchNewProductAttribute">
insert intonew_product_attribute(id, product_id, name, value) values<foreach collection="list" item="item" separator="," open="" close="">(#{item.id},#{item.productId},#{item.name},#{item.value})</foreach></insert><!-- 查询供需产品表分页信息列表--><resultMap id="NewProductListItemPortal" type="com.yeyoo.mall.beans.NewProduct.NewProductListItem"extends="NewProductMap"><collection column="id" property="newProductAttributes" javaType="java.util.List" select="com.yeyoo.mall.dao.NewProductAttributeDao.findNewProductAttributeByProductId"/></resultMap><select id="listNewProductPortal" resultMap="NewProductListItemPortal">
select* from new_product<trim prefix="where" suffixOverrides="and"><if test="name != null and name != ''">a.name likeconcat('%',#{name},'%') and</if></trim></select>
修改代码案例:
- 修改代码与新增差不多,不同的地方是产品属性这边先要全部删除之前的,然后再根据前端传过来的属性集合重新添加到数据库中
总结:
- 前面的代码基本不差,要是用的话,需要根据自己的代码,再修改修改,这边只是提供个思路
- 如果前端产品属性没传,要让前端传空集合给后台,不然后台会报错
- 添加那里用了两种方式,一种是几条数据就几条插入sql。但是用第二种方式,就是只用了一条插入sql语句