package com.jt.vo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @Data @Accessors(chain = true) @NoArgsConstructor @AllArgsConstructor public 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); } }
/** * 业务需求:完成商品新增操做 * 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(); // } }
//新增 @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; }
若是用户在入库/更新操做时,可否实现时间的自动的填充功能.简化用户操做的步骤.java
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); } }
1.若是将大量的异常处理写到代码中虽然能够保证程序稳定的运行.可是代码的结构很是的混乱.
2.异常是程序运行状态的一种体现.若是没有一种统一的规则来管理异常,则程序一旦出错问题没法定位.
3.异常应该在Controller层进行拦截. mapper---->Service(工具API)----->Controller---->用户
4.使用AOP 中的异常通知完成该功能.web
<!-- 引入aop支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
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+异常通知 //@Slf4j public class SystemException { //当遇到某种类型的异常时才会执行 @ExceptionHandler({RuntimeException.class}) public Object exception(Exception e){ //log.info(e.getMessage()); e.printStackTrace();//输出异常信息 //若是出错,返回系统级别的报错数据便可 return SysResult.fail(); } }
说明: 须要将3动态展示为具体名称, 实现思路 动态获取3的id值,以后发起Ajax请求,以后动态获取商品分类名称以后在指定的位置展示.spring
/** * 实现商品编辑 * url地址: /item/update * 请求参数: 整个form表单提交 * 返回值: sysResult对象 */ @RequestMapping("/update") public SysResult updateItem(Item item){ itemService.updateItem(item); return SysResult.success(); }
@Override public void updateItem(Item item) { itemMapper.updateById(item); }
当用户选中数据以后,点击删除按钮时,应该执行删除操做.
1.利用MP方式实现数据删除.
2.利用手写Sql形式,手动删除数据.sql
1).请求路径
2).请求参数
3).页面JS分析数据库
/** * 需求: 实现商品删除操做 * 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(); }
@Override public void deleteItems(Long[] ids) { //方式1:利用MP方式实现 List<Long> longIds = Arrays.asList(ids); itemMapper.deleteBatchIds(longIds); }
//sql: delete from tb_item where id in (100,101...) @Override public void deleteItems(Long[] ids) { //方式2:手写Sql完成数据删除. itemMapper.deleteItems(ids); }
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); }
`<?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>
说明:将状态码利用RestFul的风格实现动态传参.
下架操做: http://localhost:8091/item/updateStatus/2 status=2
上架操做: http://localhost:8091/item/1 status=1apache
/** * 实现商品上架/下架操做 * 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(); }
@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); }
//上下架 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>