京淘day06-京淘項目curd

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
@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);
    }
}

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 需求說明

若是用戶在入庫/更新操做時,可否實現時間的自動的填充功能.簡化用戶操做的步驟.java

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 中的異常通知完成該功能.web

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+異常通知
//@Slf4j
public 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請求,以後動態獲取商品分類名稱以後在指定的位置展示.spring

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形式,手動刪除數據.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
在這裏插入圖片描述apache

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>
相關文章
相關標籤/搜索