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>