商品的增删改查
Posted zqm-sau
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了商品的增删改查相关的知识,希望对你有一定的参考价值。
一、 进入主界面,首先要进行商品的查询
上一次在登录成功之后进入ListServlet查询所有商品并进行分页,查询的信息主要包括商品的各类信息,以及分页信息,一级和二级菜单的展示,这里仅以上旬所有商品信息为例,
首先判断request中的method,然后调用getAll()方法:
private void getAll() throws ServletException, IOException //考虑分页查询 Pager pager = new Pager(); //看书否传入了分页参数的页码 String pageIndex = request.getParameter("pageIndex"); if(!StringUtils.isEmpty(pageIndex)) int pSize = Integer.valueOf(pageIndex); pager.setPageIndex(pSize); //二级类型 String secondType = request.getParameter("secondType"); request.setAttribute("secondType", secondType); //搜索框中的商品标题 String title = request.getParameter("title"); request.setAttribute("title", title); //接收一级类型编号查询 String typeCode = request.getParameter("typeCode"); //根据一级类型查询对应的二级类型 if(!StringUtils.isEmpty(typeCode)) List<ArticleType> secondTypes = shopService.loadSecondTypes(typeCode); request.setAttribute("typeCode", typeCode); request.setAttribute("secondTypes", secondTypes); //1.查询所有的一级类型数据 List<ArticleType> firstArticleTypes = shopService.loadArticleTypes(); //2.查询所有的商品信息 List<Article> articles = shopService.searchArticles(typeCode, secondType, title, pager); request.setAttribute("articleTypes", shopService.getArticleTypes()); request.setAttribute("firstArticleTypes", firstArticleTypes); request.setAttribute("pager", pager); request.setAttribute("articles", articles); request.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(request, response);
首先进行分页信息类的设置:
public class Pager //1.当前页码 private int pageIndex = 1; //2.一页需要展示多少条数据 private int pageSize = 3; //3.当前条件下总的数据量 private int totalCount; //4.总共可以分多少页 private int totalPages; public int getPageIndex() //取页码的时候做一些判断 pageIndex = pageIndex < 1 ?1:pageIndex; //判断页码是否越界了 pageIndex = pageIndex >= this.getTotalPages()? this.getTotalPages():pageIndex; return pageIndex; public void setPageIndex(int pageIndex) this.pageIndex = pageIndex; public int getPageSize() return pageSize; public void setPageSize(int pageSize) this.pageSize = pageSize; public int getTotalCount() return totalCount; public void setTotalCount(int totalCount) this.totalCount = totalCount; public int getTotalPages() //总页数 //根据总数量和每页最多展示多少条来确定 //卧槽,这里简直精髓啊,之前得做多少判断啊 return (this.getTotalCount()-1)/this.getPageSize() + 1; public int getFirstParam() return (this.getPageIndex()-1)*this.getPageSize();
在getAll()方法中判断是否有页码的传递,如果没有,默认显示第一页,然后查询所有商品的信息
shopService.searchArticles(typeCode, secondType, title, pager)
这里有四个参数,第一个参数为商品的一级类型,第二个参数为商品的二级类型,第三个参数为商品的标题,第四个参数为商品的分页信息
public List<Article> searchArticles(String typeCode, String secondType, String title, Pager pager) //界面需要当前总共有多少条数据 //查询当前条件下有多少条数据 int count = articleMapper.count(typeCode, secondType, title); pager.setTotalCount(count); return articleMapper.searchArticles(typeCode, secondType, title, pager);
然后在业务层的实现类调用searchArticles方法:
因为我们在Spring中为持久化类做了扫描:
所以别名的设置就简单了,在数据访问层这里设置相关参数,然后在映射文件中书写SQL语句:
<select id="searchArticles" resultType="Article"> select * from ec_article <include refid="pageWhere"/> limit #pager.firstParam, #pager.pageSize </select>
查询到所有的商品信息并返回,然后跳转到主界面进行展示:
二、 添加商品
private void addArticle() throws ServletException, IOException, ParseException //接收图片 String imageUrl = receiveImage(); //添加商品的相关信息 Article article = encapsulationArticle(request, imageUrl, "addArticle"); shopService.saveArticle(article); // shopService.updateArticle(article); request.setAttribute("tip","添加商品成功"); getAll();
首先接收商品的图片,这里要注意一下,前端form要加上 enctype="multipart/form-data" 用来传递文件,后台的servlet也要加上 @MultipartConfig 用于接收,否则会造成request中参数无法获取,然后调用 encapsulationArticle()方法为Article设置属性信息:
private Article encapsulationArticle(HttpServletRequest request,
String picUrl, String operationType) throws ParseException
Article article = new Article();
ArticleType type = new ArticleType();
type.setCode(request.getParameter("code"));
article.setArticleType(type);
article.setTitle(request.getParameter("titleStr"));
article.setSupplier(request.getParameter("supplier"));
article.setLocality(request.getParameter("locality"));
article.setPrice(Double.parseDouble(request.getParameter("price")));
article.setStorage(Integer.parseInt(request.getParameter("storage")));
article.setDescription(request.getParameter("description"));
article.setImage(picUrl);
if(operationType.equals("addArticle"))
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
article.setPutawayDate(sdf.parse(request.getParameter("putawayDate")));
else if(operationType.equals("updateArticle"))
article.setId(Integer.valueOf(request.getParameter("id")));
return article;
然后执行 shopService.saveArticle(article);方法,在 ArticleMapper.xml书写SQL语句:
<insert id="save" parameterType="Article"> insert into ec_article(title, supplier, price, locality, putaway_date, storage, image, description, type_code, create_date) values(#title, #supplier, #price, #locality, #putawayDate, #storage, #image, #description, #articleType.code, #createDate) </insert>
三、 修改商品信息
private void updateArticle() throws ParseException //接收界面提交的参数 String picUrl = request.getParameter("picUrl"); //物品旧封面 String newUrl = receiveImage(); picUrl = newUrl != null? newUrl:picUrl; Article article = encapsulationArticle(request,picUrl,"updateArticle"); shopService.updateArticle(article); request.setAttribute("tip","修改商品成功"); showUpdate();
首先判断用户是否上传了新的图片信息,如果没有就使用之前的图片,接收图片:
private String receiveImage() try //接收用户可能上传的封面 //如果用户上传了,这里是不会出现编译异常的 //如果没有上传,这里出现异常 Part part = request.getPart("image"); //保存到项目的路径中去 String sysPath = request.getSession().getServletContext().getRealPath("/resources/images/article"); //定义一个新的图片名称 String fileName = UUID.randomUUID().toString(); //提取图片的类型 //上传文件的内容性质 String contentDispostion = part.getHeader("content-disposition"); //获取上传文件的后缀名 String suffix = contentDispostion.substring(contentDispostion.lastIndexOf("."), contentDispostion.length() - 1); fileName+=suffix; //把图片保存到路径中去 part.write(sysPath+"/"+fileName); return fileName; catch (IOException e) e.printStackTrace(); return null; catch (ServletException e) e.printStackTrace(); return null;
上面的代码在新增商品的时候一定会用到,但是我忘记解释了,就放在这吧,然后下一步也是设置Article的一些属性信息,然后调用 shopService.updateArticle(article); 方法在
<!-- 修改物品 --> <update id="update" parameterType="Article"> update ec_article <trim prefix="SET" suffixOverrides=","> <if test="title != null">title = #title,</if> <if test="supplier != null">supplier = #supplier,</if> <if test="price != null">price = #price,</if> <if test="locality != null">locality = #locality,</if> <if test="storage != null">storage = #storage,</if> <if test="image != null">image = #image,</if> <if test="description != null">description = #description,</if> <if test="articleType.code != null">type_code = #articleType.code,</if> </trim> <where> id = #id</where> </update>
在这里我们是要进行关联映射的,为什么要进行关联映射呢。。。。因为是俩表的关联啊,一个表存储商品信息,另一个表存储商品类型。。新增的时候也用到了,忘说了:
<!-- 配置结果集映射 --> <resultMap id="articleResultMap" type="Article"> <result column="putaway_Date" property="putawayDate"/> <result column="create_Date" property="createDate"/> <!-- 查询出的商品 映射关联 N-1 --> <association property="articleType" javaType="ArticleType" column="TYPE_CODE" select="com.fitsoft.shop.repository.ArticleTypeMapper.getTypeByCode"/> </resultMap>
四、删除商品
单击删除按钮,调用ListServlet中的deleteById()方法:
private void deleteById() try String id = request.getParameter("id"); shopService.deleteById(id); request.setAttribute("tip", "删除成功"); catch (Exception e) request.setAttribute("tip", "删除失败"); e.printStackTrace(); finally try request.getRequestDispatcher("/list?method=getAll").forward(request, response); catch (ServletException e) e.printStackTrace(); catch (IOException e) e.printStackTrace();
直接看ArticleMapper的数据库语句:
语句比较短,直接用注解解决,像这种只带一个参数的数据库语句,id就不是特别关键了,只有一个,不会起冲突,把上一个语句改成:
@Delete("delete from ec_article where id = #xxxx") void deleteById(String id);
也是可以的。项目地址:点我跳转
镇妖图:
以上是关于商品的增删改查的主要内容,如果未能解决你的问题,请参考以下文章