应用场景:
- 图片(比如填报一个产品,这个产品有很多属性,里面有这种动态的增删改查操作,应该怎么操作),像这种的还有传视频还有图片什么的
- 思路:
-
后端:是再创建一个表,专门存这种动态的数据(数据库表这样,里面存一个产品的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);
return new ResultPage(bean);
- service
//添加供需产品表
NewProduct addNewProduct(NewProductAdd newProductAdd);
//查询供需产品表分页信息列表
PageInfo<NewProductListItem> listNewProduct(NewProductList param,Boolean isportal);
- impl
//添加供需产品表
@Override
@Transactional(rollbackFor = Exception.class, timeout = Constants.TIMEOUT)
public NewProduct addNewProduct(NewProductAdd param) {
NewProduct bean = new NewProduct();
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;
}
//查询供需产品表分页信息列表
@Override
public PageInfo<NewProductListItem> listNewProduct(NewProductList param, Boolean isportal) {
List<NewProductListItem> list = new ArrayList<>();
if (isportal) {
PageHelper.startPage(param.getPageIndex(), param.getPageSize());
list = newProductDao.listNewProductPortal(param);
}
return new PageInfo<NewProductListItem>(list);
}
- dao
//添加供需产品表
void addNewProduct(NewProduct newProduct);
//批量添加供需产品表(第二种方式批量添加)
void insertBatchNewProductAttribute(List<NewProductAttributeAdd> newProductAttributeAdds);
//查询供需产品表分页信息列表
List<NewProductListItem> listNewProductPortal(NewProductList param);
/** 修改的时候,需要先删除产品属性,会用到这个sql语句 */
@Delete("delete from new_product_attribute where product_id = #{id}")
void removeNewProductAttributeByProductId(@Param("id") String id);
- xml
<!-- 添加NewProduct -->
<insert id="addNewProduct">
insert into new_product(id,name)
values (#{id},#{name})
</insert>
<!-- 批量添加供需产品表,这是第二种方式批量添加 -->
<insert id="insertBatchNewProductAttribute">
insert into new_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 like concat('%',#{name},'%') and </if>
</trim>
</select>
修改代码案例:
- 修改代码与新增差不多,不同的地方是产品属性这边先要全部删除之前的,然后再根据前端传过来的属性集合重新添加到数据库中
总结:
- 前面的代码基本不差,要是用的话,需要根据自己的代码,再修改修改,这边只是提供个思路
- 如果前端产品属性没传,要让前端传空集合给后台,不然后台会报错
- 添加那里用了两种方式,一种是几条数据就几条插入sql。但是用第二种方式,就是只用了一条插入sql语句