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>
发表回复