文章目录

  • 概述
  • Dao层
    • ProductCategoryDao接口
    • ProductCategoryDao SQL映射文件
    • 单元测试
  • Service层
    • ProductCategoryExecution DTO类的开发
    • ProductCategoryStateEnum 增加几个标识
    • 封装特定异常类
    • ProductCategoryService接口
    • ProductCategoryServiceImpl实现类
    • 单元测试
  • Controller层
    • ProductCategoryController增加addProductCategory方法
    • 单元测试
  • View层
    • productcategorymanage.js
  • 前后端联调
  • Github地址

概述

上一篇博文 实战SSM_O2O商铺_25【商品类别】商品类别列表展示从Dao到View层的开发 ,我们完成了 商品类别 列表展示的开发,接下来,我们继续来完成 【批量添加商品类别】的功能吧。


Dao层

ProductCategoryDao接口

/*** * * @Title: batchInsertProductCategory* * @Description: 批量增加roductCategory* * @param productCategoryList* * @return: int*/int batchInsertProductCategory(List<ProductCategory> productCategoryList);

ProductCategoryDao SQL映射文件

<insert id="batchInsertProductCategory" parameterType="java.util.List">INSERT INTOtb_product_category(product_category_name,product_category_desc,priority,create_time,last_edit_time,shop_id)VALUES <foreach collection="list" item="productCategory" index="index" separator=",">(#{productCategory.productCategoryName},#{productCategory.productCategoryDesc},#{productCategory.priority},#{productCategory.createTime},#{productCategory.lastEditTime},#{productCategory.shopId})</foreach></insert>

单元测试

@Testpublic void testBatchInsertProductCategory() {ProductCategory productCategory1 = new ProductCategory();productCategory1.setProductCategoryName("ProductCategoryTest1");productCategory1.setProductCategoryDesc("ProductCategoryTest1-desc");productCategory1.setPriority(300);productCategory1.setCreateTime(new Date());productCategory1.setLastEditTime(new Date());productCategory1.setShopId(5L);ProductCategory productCategory2 = new ProductCategory();productCategory2.setProductCategoryName("ProductCategoryTest2");productCategory2.setProductCategoryDesc("ProductCategoryTest2-desc");productCategory2.setPriority(600);productCategory2.setCreateTime(new Date());productCategory2.setLastEditTime(new Date());productCategory2.setShopId(5L);List<ProductCategory> productCategoryList = new ArrayList<ProductCategory>();productCategoryList.add(productCategory1);productCategoryList.add(productCategory2);int effectNum = productCategoryDao.batchInsertProductCategory(productCategoryList);Assert.assertEquals(2, effectNum);}

单元测试OK。


Service层

ProductCategoryExecution DTO类的开发

我们需要增加操作的状态及数量等信息,因此单独的Domain类已经无法满足需求了,因此我们使用DTO来扩展实体类的功能

package com.artisan.o2o.dto;import java.util.List;import com.artisan.o2o.entity.ProductCategory;
import com.artisan.o2o.enums.ProductCategoryStateEnum;/*** * * @ClassName: ProductCategoryExecution* * @Description: 封装操作ProductCategory的返回结果,包括操作状态和ProductCategory信息* * @author: Mr.Yang* * @date: 2018年6月21日 上午12:17:07*/
public class ProductCategoryExecution {private int state;private String stateInfo;// 因为是批量操作,所以使用Listprivate List<ProductCategory> productCategoryList;private int count;/*** * * @Title:ProductCategoryExecution* * @Description:空的构造函数*/public ProductCategoryExecution() {super();}/*** * * @Title:ProductCategoryExecution* * @Description:操作成功的时候使用的构造函数,返回操作状态和ProductCategory集合* * @param productCategoryStateEnum* @param productCategoryList* @param count*/public ProductCategoryExecution(ProductCategoryStateEnum productCategoryStateEnum, List<ProductCategory> productCategoryList, int count) {this.state = productCategoryStateEnum.getState();this.stateInfo = productCategoryStateEnum.getStateInfo();this.productCategoryList = productCategoryList;this.count = count;}/*** * * @Title:ProductCategoryExecution* * @Description:操作失败的时候返回的信息,仅包含状态和状态描述即可* * @param productCategoryStateEnum*/public ProductCategoryExecution(ProductCategoryStateEnum productCategoryStateEnum) {this.state = productCategoryStateEnum.getState();this.stateInfo = productCategoryStateEnum.getStateInfo();}public int getState() {return state;}public void setState(int state) {this.state = state;}public String getStateInfo() {return stateInfo;}public void setStateInfo(String stateInfo) {this.stateInfo = stateInfo;}public List<ProductCategory> getProductCategoryList() {return productCategoryList;}public void setProductCategoryList(List<ProductCategory> productCategoryList) {this.productCategoryList = productCategoryList;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}}

ProductCategoryStateEnum 增加几个标识

SUCCESS(1, "操作成功"), INNER_ERROR(-1001, "操作失败"), NULL_SHOP(-1002, "Shop信息为空"), EMPETY_LIST(-1003, "请输入商品目录信息");

封装特定异常类

批量添加,这里我们使用事务控制

package com.artisan.o2o.exception;/*** * * @ClassName: ProductCategoryOperationException* * @Description: 继承RuntimeException,便于异常时候的回滚。 保持所有的操作在一个事务中。* *               这样在标注了@Transactional事务的方法中,出现了异常,才会回滚数据。* *               默认情况下,如果在事务中抛出了未检查异常(继承自 RuntimeException 的异常)或者 Error,则 Spring*               将回滚事务;除此之外,Spring 不会回滚事务。* * * @author: Mr.Yang* * @date: 2018年6月21日 上午12:22:44*/
public class ProductCategoryOperationException extends RuntimeException {private static final long serialVersionUID = 6500682256313143297L;public ProductCategoryOperationException(String message) {super(message);}}

ProductCategoryService接口

/*** * * @Title: addProductCategory* * @Description: 批量插入ProductCategory* * @param productCategoryList* @throws ProductCategoryOperationException* * @return: ProductCategoryExecution*/ProductCategoryExecution addProductCategory(List<ProductCategory> productCategoryList) throws ProductCategoryOperationException;

ProductCategoryServiceImpl实现类

/*** 使用@Transactional控制事务*/@Override@Transactionalpublic ProductCategoryExecution addProductCategory(List<ProductCategory> productCategoryList) throws ProductCategoryOperationException {// 非空判断if (productCategoryList != null && productCategoryList.size() > 0) {try {// 批量增加ProductCategoryint effectNum = productCategoryDao.batchInsertProductCategory(productCategoryList);if (effectNum > 0) {return new ProductCategoryExecution(ProductCategoryStateEnum.SUCCESS, productCategoryList, effectNum);} else {return new ProductCategoryExecution(ProductCategoryStateEnum.INNER_ERROR);}} catch (Exception e) {e.printStackTrace();throw new ProductCategoryOperationException("batchAddProductCategory Error:" + e.getMessage());}} else {return new ProductCategoryExecution(ProductCategoryStateEnum.EMPETY_LIST);}}

单元测试

@Testpublic void testAddProductCategory() {ProductCategory productCategory1 = new ProductCategory();productCategory1.setProductCategoryName("ProductCategoryTest3");productCategory1.setProductCategoryDesc("ProductCategoryTest3-desc");productCategory1.setPriority(300);productCategory1.setCreateTime(new Date());productCategory1.setLastEditTime(new Date());productCategory1.setShopId(5L);ProductCategory productCategory2 = new ProductCategory();productCategory2.setProductCategoryName("ProductCategoryTest4");productCategory2.setProductCategoryDesc("ProductCategoryTest4-desc");productCategory2.setPriority(600);productCategory2.setCreateTime(new Date());productCategory2.setLastEditTime(new Date());productCategory2.setShopId(5L);List<ProductCategory> productCategoryList = new ArrayList<ProductCategory>();productCategoryList.add(productCategory1);productCategoryList.add(productCategory2);ProductCategoryExecution productCategoryExecution = productCategoryService.addProductCategory(productCategoryList);Assert.assertEquals(1, productCategoryExecution.getState());Assert.assertEquals(2, productCategoryExecution.getProductCategoryList().size());}

单元测试通过。


Controller层

ProductCategoryController增加addProductCategory方法

/*** * * @Title: addProductCategory* * @Description: 添加商铺目录 ,使用@RequestBody接收前端传递过来的productCategoryList* * @param productCategoryList* @param request* * @return: Map<String,Object>*/@RequestMapping(value = "/addproductcategory", method = RequestMethod.POST)@ResponseBodypublic Map<String, Object> addProductCategory(@RequestBody List<ProductCategory> productCategoryList, HttpServletRequest request) {Map<String, Object> modelMap = new HashMap<String, Object>();if (productCategoryList != null && productCategoryList.size() > 0) {// 从session中获取shop的信息Shop currentShop = (Shop) request.getSession().getAttribute("currentShop");if (currentShop != null && currentShop.getShopId() != null) {// 为ProductCategory设置shopIdfor (ProductCategory productCategory : productCategoryList) {productCategory.setShopId(currentShop.getShopId());}try {// 批量插入ProductCategoryExecution pce = productCategoryService.addProductCategory(productCategoryList);if (pce.getState() == ProductCategoryStateEnum.SUCCESS.getState()) {modelMap.put("success", true);// 同时也将新增成功的数量返回给前台modelMap.put("effectNum", pce.getCount());} else {modelMap.put("success", false);modelMap.put("errMsg", pce.getStateInfo());}} catch (ProductCategoryOperationException e) {e.printStackTrace();modelMap.put("success", false);modelMap.put("errMsg", e.getMessage());return modelMap;}} else {modelMap.put("success", false);modelMap.put("errMsg", ProductCategoryStateEnum.NULL_SHOP.getStateInfo());}} else {modelMap.put("success", false);modelMap.put("errMsg", "至少输入一个店铺目录信息");}return modelMap;}

单元测试

待前端页面完成,一并测试


View层

productcategorymanage.js

$(function () {// 后台从session中获取shop的信息,这里就不传shopId了//var shopId = getQueryString("shopId");//var productCategoryURL = '/o2o/shopadmin/getproductcategorybyshopId?shopId=' + shopId;var getProductCategoryURL = '/o2o/shopadmin/getproductcategorybyshopId';var addProductCategoryURL = '/o2o/shopadmin/addproductcategory';// 调用getProductCategoryList,加载数据getProductCategoryList();function getProductCategoryList() {$.getJSON(getProductCategoryURL,function(data) {if (data.success) {var dataList = data.data;$('.product-categroy-wrap').html('');var tempHtml = '';dataList.map(function(item, index) {tempHtml += ''+ '<div class="row row-product-category now">'+ '<div class="col-33 product-category-name">'+ item.productCategoryName+ '</div>'+ '<div class="col-33">'+ item.priority+ '</div>'+ '<div class="col-33"><a href="#" class="button delete" data-id="'+ item.productCategoryId+ '">删除</a></div>'+ '</div>';});$('.product-categroy-wrap').append(tempHtml);}});}//  新增按钮的点击事件$('#new').click(function(){// 新增数据 以 temp 为标识,便于和库表中的数据区分开来var tempHtml = '<div class="row row-product-category temp">'+ '<div class="col-33"><input class="category-input category" type="text" placeholder="分类名"></div>'+ '<div class="col-33"><input class="category-input priority" type="number" placeholder="优先级"></div>'+ '<div class="col-33"><a href="#" class="button delete">删除</a></div>'+ '</div>';$('.product-categroy-wrap').append(tempHtml);});$('#submit').click(function() {// 通过temp 获取新增的行var tempArr = $('.temp');// 定义数组接收新增的数据var productCategoryList = [];tempArr.map(function(index, item) {var tempObj = {};tempObj.productCategoryName = $(item).find('.category').val();tempObj.priority = $(item).find('.priority').val();if (tempObj.productCategoryName && tempObj.priority) {productCategoryList.push(tempObj);}});$.ajax({url : addProductCategoryURL,type : 'POST',// 后端通过 @HttpRequestBody直接接收data : JSON.stringify(productCategoryList),contentType : 'application/json',success : function(data) {if (data.success) {$.toast('新增【' + data.effectNum + '】条成功!');// 重新加载数据getProductCategoryList();} else {$.toast(data.errMsg);}}});});});

前后端联调

前端页面debug, 后端也可以加入断点,以debug的方式开启tomcat,逐步调测

效果如下:

库表数据:


Github地址

代码地址: https://github.com/yangshangwei/o2o

实战SSM_O2O商铺_26【商品类别】批量新增商品类别从Dao到View层的开发相关推荐

  1. 实战SSM_O2O商铺_41【前端展示】店铺列表页面Dao+Service+Controller层的实现

    文章目录 概述 Dao层 接口 映射文件 单元测试 Service层 接口方法 单元测试 Controller层 增加 ShopListController 单元测试 Github地址 概述 在完成了 ...

  2. 实战SSM_O2O商铺_27【商品类别】删除商品类别从Dao到View层的开发

    文章目录 概述 Dao层 ProductCategoryDao接口增加接口方法 ProductCategoryDao SQL映射文件 闭环的单元测试 Servie层 接口 接口实现 单元测试 Cont ...

  3. 实战SSM_O2O商铺_25【商品类别】商品类别列表展示从Dao到View层的开发

    文章目录 概述 Dao层 ProductCategoryDao接口 ProductCategoryDao Mapper配置文件 单元测试 Service层 ProductCategoryService ...

  4. 实战SSM_O2O商铺_42【前端展示】店铺列表页面View层的实现

    文章目录 概述 代码结构 shoplist.html shoplist.js shoplist.css common.js添加解析日期的公共方法 FrontEndController添加路由 联调测试 ...

  5. 实战SSM_O2O商铺_38【商品类别】解除商品与商品类别的关联

    文章目录 概述 Dao层 ProductDao.java ProductDao.xml 单元测试 Service层完善 ProductCategoryServiceImpl#deleteProduct ...

  6. 实战SSM_O2O商铺_28【商品】商品添加之Dao层的实现

    文章目录 概述 重温实体类 Prouct ProductImg ProductDao接口 Mapper配置文件 ProductImgDao接口 Mapper配置文件 单元测试 #ProductDaoT ...

  7. 实战SSM_O2O商铺_32【商品】商品编辑之Dao层的实现

    文章目录 概述 Dao层接口 ProductDao#selectProductById ProductDao#updateProduct ProductImgDao#deleteProductImgB ...

  8. 实战SSM_O2O商铺_31【商品】商品添加之View层的实现

    文章目录 概述 productoperation.html productoperation.js 联调 检查结果 库表数据: 磁盘上的图片 Github地址 概述 在完成了 实战SSM_O2O商铺_ ...

  9. 实战SSM_O2O商铺_07【商铺注册】DAO层-新增与更新商铺

    文章目录 概述 增加商铺 ShopDao新增insertShop接口 ShopDao.xml中新增insertShop语句 单元测试 更新商铺 ShopDao中新增updateShop接口 ShopD ...

最新文章

  1. 两张照片重叠处半透明_手机可以“抛起来”拍照,给你的照片换个角度
  2. 工厂模式、策略者模式、责任链模式综合应用
  3. Android10.0 日志系统分析(三)-logd、logcat读写日志源码分析-[Android取经之路]
  4. C语言检测大气成分,自动化结构健康监测
  5. C语言二维数组元素的多种表示方法小结
  6. Spring Boot Server容器配置
  7. 【等价转换】—— 整数的变换
  8. threadpool —— 基于 pthread 实现的简单线程池(code)
  9. 残缺、时间一起的爱情
  10. 使用VC做一个简单的UI界面对话框
  11. TPC-DS生成数据
  12. 双随机软件java_随机抽检|双随机一公开 1.0 正式版下载_太平洋下载中心
  13. ppt转html5原理,如何实现PPT转成H5?
  14. python培训班-python培训班哪家好
  15. 如何用Python写一个上课点名系统
  16. 基于HC-05蓝牙模块的STM32无线控制智能系统硬件开发
  17. Ubuntu下的MySQL数据库
  18. 摩尔纹的原理与产生条件
  19. ASCII 碼: 转义字符,正则表达式,特殊字符,模式匹配
  20. h5+css3基础面试题

热门文章

  1. 《基于张量网络的机器学习入门》学习笔记5
  2. pandas 指定某一列的数据类型
  3. emoji隐藏表情_除了TouchBar可以快捷输入Emoji表情 这个快捷键也能做到
  4. python解矩阵方程_用Python代写的Numpy求解线性方程组
  5. 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)
  6. Leetcode 145. 二叉树的后序遍历 (每日一题 20210930)
  7. 258. Add Digits
  8. mongodb 企业版_MongoDB 凉了?
  9. Hadoop的mapper输出中key和value之间的分隔符
  10. Python编程基础:第五十一节 将函数赋值给变量Assign Functions to Variables