关于springboot:京淘day06京淘项目curd

46次阅读

共计 6099 个字符,预计需要花费 16 分钟才能阅读完成。

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 需要阐明

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

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+ 异样告诉
//@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 申请, 之后动静获取商品分类名称之后在指定的地位展示.

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>

正文完
 0