1.商品CRUD操作

1.1 商品新增

1.1.1 页面剖析

1.1.2 用户参数

1.1.3 页面JS剖析

1.1.4 封装零碎VO对象

package com.jt.vo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.experimental.Accessors;@Data@Accessors(chain = true)@NoArgsConstructor@AllArgsConstructorpublic class SysResult {    private Integer status;  //200示意胜利   201示意失败    private String  msg;     //服务器给用户的提示信息    private Object  data;    //服务器返回给用户的数据    //封装工具API    public static SysResult fail(){        return new SysResult(201, "服务器调用异样", null);    }    public static SysResult success(){        return new SysResult(200, "业务执行胜利!", null);    }    public static SysResult success(Object data){        return new SysResult(200, "业务执行胜利!", data);    }    public static SysResult success(String msg,Object data){        return new SysResult(200, msg, data);    }}

1.1.5 编辑ItemController

/**     * 业务需要:实现商品新增操作     * url:    http://localhost:8091/item/save     * 参数: 整个表单进行提交  应用对象接管     * 返回值: 零碎返回值对象     */    @RequestMapping("/save")    public SysResult saveItem(Item item) {      itemService.saveItem(item);      return SysResult.success();   // 定义齐全局异样解决好能够省略   //    try {   //       itemService.saveItem(item);   //       return SysResult.success();   //    }catch (Exception e){   //       e.printStackTrace();   //       return SysResult.fail();   //    } }

1.1.6 编辑ItemService

//新增@Override@Transactional//开启事务管制public void saveItem(Item item) { //定义玩主动填充性能后能够省略 //Date data=new Date(); //item.setStatus(1).setCreated(data).setUpdated(data); item.setStatus(1);   itemMapper.insert(item);   //int a=1/0;}

2.2 参数主动填充性能

2.2.1 需要阐明

如果用户在入库/更新操作时,是否实现工夫的主动的填充性能.简化用户操作的步骤.

2.2.2 增加注解

2.2.3 配置主动赋值

package com.jt.config;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import org.apache.ibatis.reflection.MetaObject;import org.springframework.stereotype.Component;import java.util.Date;@Component      //将对象交给容器治理public class MyMetaObjectHandler implements MetaObjectHandler {    //实现入库和更新操作的主动赋值.    @Override    public void insertFill(MetaObject metaObject) {        Date date = new Date();        this.setInsertFieldValByName("created",date,metaObject);        this.setUpdateFieldValByName("updated",data,metaObject);    }    @Override    public void updateFill(MetaObject metaObject) {        this.setUpdateFieldValByName("updated",new Date(),metaObject);    }}

2.3 全局异样解决机制

2.3.1 全局异样解决机制阐明

1.如果将大量的异样解决写到代码中尽管能够保障程序稳固的运行.然而代码的构造十分的凌乱.
2.异样是程序运行状态的一种体现.如果没有一种对立的规定来治理异样,则程序一旦出错问题无奈定位.
3.异样应该在Controller层进行拦挡. mapper---->Service(工具API)----->Controller---->用户
4.应用AOP 中的异样告诉实现该性能.

2.3.2 引入jar包

  <!-- 引入aop反对 -->     <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-aop</artifactId>     </dependency>

2.3.3 定义全局异样解决

package com.jt.aop;import com.jt.vo.SysResult;import lombok.extern.log4j.Log4j;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;import sun.rmi.runtime.Log;import java.sql.SQLException;import java.util.logging.Logger;@RestControllerAdvice   //AOP+异样告诉//@Slf4jpublic class SystemException {    //当遇到某种类型的异样时才会执行    @ExceptionHandler({RuntimeException.class})    public Object exception(Exception e){        //log.info(e.getMessage());        e.printStackTrace();//输入异样信息        //如果出错,返回零碎级别的报错数据即可        return SysResult.fail();    }} 

2.4 实现商品分类名称的回显

2.4.1 业务剖析



阐明: 须要将3动静展示为具体名称, 实现思路 动静获取3的id值,之后发动Ajax申请,之后动静获取商品分类名称之后在指定的地位展示.

2.4.2 编辑页面JS

2.5 商品批改

2.5.1 查看页面JS

2.5.2 编辑ItemController

/**     * 实现商品编辑     * url地址: /item/update     * 申请参数: 整个form表单提交     * 返回值:    sysResult对象     */    @RequestMapping("/update")    public SysResult updateItem(Item item){        itemService.updateItem(item);        return SysResult.success();    }

2.5.3 编辑ItemService

@Override    public void updateItem(Item item) {        itemMapper.updateById(item);    }

2.6 商品删除操作

2.6.1 业务剖析

当用户选中数据之后,点击删除按钮时,应该执行删除操作.
1.利用MP形式实现数据删除.
2.利用手写Sql模式,手动删除数据.

2.6.2 页面剖析

1).申请门路

2).申请参数

3).页面JS剖析

2.6.3 编辑ItemController

/**     * 需要: 实现商品删除操作     * url: http://localhost:8091/item/delete     * 申请参数:  ids: 1474392029,1474392030     * 返回值:  SysResult对象     * 常识扩大:     *     问题: 页面中<input name="id"  value="100"/>     *     参数是如何接管的,底层实现是什么? servlet是否相熟     *     利用servlet中的request对象/response对象进行参数传递.     *  注意事项:办法中的参数名称,必须与页面中的name属性名称统一!!!     */    @RequestMapping("/delete")    public SysResult deleteItems(Long[] ids){        itemService.deleteItems(ids);        return SysResult.success();    } 

2.6.4 编辑ItemService

@Override    public void deleteItems(Long[] ids) {        //形式1:利用MP形式实现        List<Long> longIds = Arrays.asList(ids);        itemMapper.deleteBatchIds(longIds);    } 

2.7 手写sql实现删除

2.7.1 编辑ItemService

//sql: delete from tb_item where id in (100,101...)    @Override    public void deleteItems(Long[] ids) {        //形式2:手写Sql实现数据删除.        itemMapper.deleteItems(ids);    } 

2.7.2 编辑ItemMapper

public interface ItemMapper extends BaseMapper<Item>{    @Select("select * from tb_item order by updated desc limit #{startIndex},#{rows}")    //将多值封装成单值  Map汇合   key=xxx value 0,   key=yyy  value=20    List<Item> findItemByPage(int startIndex,int rows);    //删除    void deleteItems(Long[] ids);}

2.7.3 编辑映射文件

`<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.jt.mapper.ItemMapper">    <!--        1.实现商品删除        知识点:  Mybatis参数传递问题(版本有关系)        起因:    Mybatis底层实现时通过下标的形式取值                然而下标默认值都是0 mybatis只能传递一个参数(单值传递)        需要:    须要多值传递.  核心思想 将多值转化为单值.        罕用办法:   1.应用对象封装  2.能够封装为数组/list   3.Map汇合        取值形式:   1.#{对象的属性} 2. 特殊字符 array/list  3.#{key}        高版本阐明: 如果参数的个数多余1个时,则默认采纳Map的形式进行封装.        低版本阐明:如果key有多个,则须要手动封装    -->    <delete id="deleteItems">        delete from tb_item where id in (        <foreach collection="array" separator="," item="id" >            #{id}        </foreach>        )    </delete></mapper>

2.8 实现商品上架/下架操作

2.8.1 页面剖析

阐明:将状态码利用RestFul的格调实现动静传参.
下架操作: http://localhost:8091/item/updateStatus/2 status=2
上架操作: http://localhost:8091/item/1 status=1

2.8.2 编辑ItemController

/**     * 实现商品上架/下架操作     * url:/item/updateStatus/2     * 参数: 1/2代表商品的状态, ids=100,101,102,103     * 返回值: SysResult对象     * SpringMVC框架: 参数接管阐明 如果参数两头以逗号的模式宰割     * 则能够主动的转化为数组类型     */    @RequestMapping("/updateStatus/{status}")    public SysResult updateStatus(@PathVariable Integer status,Long... ids){        itemService.updateStatus(ids,status);        return SysResult.success();    }

2.8.3 编辑ItemService

@Override    public void updateStatus(Long[] ids, Integer status) {        //1.以MP的形式操作数据库  只批改状态码/updated工夫        /*Item item = new Item();        item.setStatus(status);        QueryWrapper<Item> queryWrapper = new QueryWrapper<>();        queryWrapper.in("id", ids);        itemMapper.update(item,queryWrapper);*/        //2.手写SQL;        itemMapper.updateStatus(ids,status);    }

2.8.4 编辑ItemMapper

//高低架void updateStatus(@Param("ids") Long[] ids,@Param("status") Integer status);

编辑Mapper映射文件

<!--高低架--><update id="updateStatus">   update tb_item set status=#{status},updated=now()   where id in (   <foreach collection="ids" item="id" separator=",">      #{id}   </foreach>   )</update>