晚上自己回看更新和删除
删除昨晚自己探究过 如果只删除item 可以删除完item 但是itemDesc还在数据库
更新的id问题自己理清 取值赋值 get set
晚上实现 0901 16.28
新增的时候 观察数据库id
两个表
tb_item
tb_item_desc
id相同
晚上 复习0901 保存模块
@Override
@Transactional //注意事务控制 spring一般只能控制运行时异常,检查异常需要手动封装.
public void saveItem(Item item, ItemDesc itemDesc) {
//1.默认商品为上架状态
//item.setStatus(1).setCreated(new Date()).setUpdated(new Date());
item.setStatus(1);
itemMapper.insert(item); //先入库之后才有主键,将主键动态的返回.
//MP支持,用户的操作可以实现自动的主键回显功能.
//<!--<insert id="" keyProperty="id" keyColumn="id" useGeneratedKeys="true"></insert>-->
//2.完成商品详情入库操作 要求 item的ID的应该与itemDesc的Id值一致的!!!!
//知识点: id应该如何获取?
itemDesc.setItemId(item.getId());
itemDescMapper.insert(itemDesc);
重温
有点疑问:
1.数据齐了没
2.能不能正确的入库
mapper入库 传参的时候 只传递了itemDesc
属性名叫itemDesc
如下图 会把itemDesc传过去
可以看到 没有把id传过去(可以写好之后 去页面network里面判断)
业务要求
***把item里面的id拿出来 取值
数据库 pojo item的id和itemDesc的id的值应该是一致的
再把item的id存(赋值)进itemDesc的id*** 然后基本是可以了
考虑更深层次
item的id是主键自增
item入库之后 主键应该是空的 虽然数据库(item表)有了主键 但是并没有传回来
所以item里面主键应该是空的
如上图 item.getId肯定也为空 把一个空值当主键插进去 就会报错
新增代码理解 数据需要回显的缘故
如上图 需求 要查第二个商品详情表 但需要对应第一个商品表的主键id(会自增 因为是新增插入的)
上图和上行理解
知识点回顾
主键自增的回显 一般只会出现在insert标签当中
作用 两个表 第二表对应的数据 不需要第二次查询
<insert id="" keyProperty="id" keyColumn="id" useGeneratedKeys="true"></insert>
如上图 经过了MP的支持 MP支持,用户的操作可以实现自动的主键回显功能.等于上面第二个圈圈
断点深化理解
一开始id为空(null)
如下图 第一小步取值
下图为上图的补充 取值步骤
下图为上图的补充
第二小步
上图的补充 如下图
最后 经过MP框架帮助完成看不见的回显(第二圈圈 断点可分析) 完成了取值并赋值的操作
下图为上图补充
自我再显现 更新
完成商品的修改操作 item itemDesc
开始测试
成功实现
自我实现删除业务
完成商品的删除操作 item itemDesc
需求:删除不需要数据回显 直接根据同一id删除就可
测试
item
页面删除干净了
item表
item_desc表
完美实现 id为77尾号的没了
之前如果不加下面对应itemDescMapper可以获取的ids数组的话 对应的item_Desc表会有残余
时间管理 省事的套路
省略 共性直接添加到common里面
上传图片
京淘文件传输
京淘文件上传
文件上传入门案例
一般都是form表单的上传
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>实现文件上传</h1>
<!--enctype="开启多媒体标签" -->
<form action="http://localhost:8091/file" method="post"
enctype="multipart/form-data">
<input name="fileImage" type="file" />
<input type="submit" value="提交"/>
</form>
</body>
</html>
如上图 很麻烦
F:\JT-SOFT\image
提交后
package com.jt.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@RestController
public class FileController {
/**
* MultipartFile 接口作用 主要就是优化了文件上传 API集合
* 1. 文件上传位置??? D:\JT-SOFT\images
* 2. 判断一下文件目录是否存在
* 3. 利用API实现文件上传.
*/
@RequestMapping("/file")
public String file(MultipartFile fileImage){
String fileDir = "F:\\JT-SOFT\\image";
File file = new File(fileDir);
if(!file.exists()){ //文件不存在则创建文件
file.mkdirs(); //一次性创建多级目录
}
//文件信息 = 文件名+文件后缀
String fileName = fileImage.getOriginalFilename();
//将文件的整体封装为对象 文件路径/文件名称
File imageFile = new File(fileDir+"/"+fileName);
//实现文件上传,将文件字节数组传输到指定的位置.
try {
fileImage.transferTo(imageFile);
} catch (IOException e) {
e.printStackTrace();
}
return "文件上传成功!!!!";
}
}
{timestamp: "2020-09-02T02:21:06.281+00:00", status: 404, error: "Not Found",…}
error: "Not Found"
message: "No message available"
path: "/pic/upload"
status: 404
timestamp: "2020-09-02T02:21:06.281+00:00"
晚上 早上10.28
为什么要写 file.mkdirs() 创建多级目录
if(!file.exists()){ //文件不存在则创建文件
file.mkdirs(); //一次性创建多级目录
}
在d盘下创建aa/bb/cc/dd目录 这是多级目录 存储一个a.jpg格式的文件
如果不写多级目录代码file.mkdirs(); //一次性创建多级目录
就只能默认创建一级目录 即: D:images/aa 运行找不到文件就报错
所以 添加file.mkdirs(); //一次性创建多级目录
代码 就一直一次性都给我们创建 不仅限于一级目录这么少
transferTO接口作用
必须先准备好目录 之后再生成文件
和上面的到了一样
1.关键字有下图的 不让用 如果有特殊符号系统分不清
2.目录 如果只有aa 没有aabbcc会报错(找不到指定目录) IO流不会自己创建 需要自己创建 上面示例
所以要用到
file.mkdirs(); //一次性创建多级目录
总结分析
第一步 得有标签 不然的话 controller控制层接不到
第二步 得有post 不然发不过去
和下图controller的名字一一对应
对应上面的json建立vo对象
页面url分析
参数说明
作业
自我实现
点击开始上传 失败
脚手架建好
只有FileController 去建立对应的service层(接口和实现类)
Controller层
serive层
controller层写好 自动生成
完成 运行项目
看控制台
如上图 完美实现
经典错误页面只有json数据问题 没写完@RequestMapping()
@RequestMapping()
控制台也不报错
把json 数据打印出来了 就是去不了主页面
加了url地址就可以初步把所有实现了
自我实现 11.40前
定死了url后
如下图 无论上传什么图片
点击图片也会变成指定的地址 url都是网络地址 照理来说 物理地址也应该有上传后对应的图片(复制过去)
但是并没有
总结:文件上传初步已经实现 但是需要用网络地址的图片才行(因为已经校验好了的) 本地物理地址业务未完成完善
ps:
文件上传具体步骤:
* 1.如何校验用户上传的是图片? jpg|png
* 2.如何访问用户上传恶意程序 木马.exe.jpg 宽度*高度
* 3.应该采用分目录存储的方式 保存数据
* 4.上传的文件名称应该尽量避免重名 自定义文件名称… UUID.后缀…
1.如何校验用户上传的是图片? jpg|png
程序员的价值所在 不去考虑if所有得可能性 尽可能优化方法 因为常用的图片格式有四种 但是一共的话 还是有很多很多中的 无法全部if
但是又不能避免不去写
1.正则表达式
2.集合去重
如上图 是字符串类型的集合
点在哪 就从哪截 口诀 :含头不含尾 晚上 11.51前
知识点扩充
JavaScript lastIndexOf() 方法
JavaScript String 对象
定义和用法
lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。
语法
stringObject.lastIndexOf(searchvalue,fromindex)
参数 描述
searchvalue 必需。规定需检索的字符串值。
fromindex 可选的整数参数。规定在字符串中开始检索的位置。它的合法取值是 0 到 stringObject.length - 1。如省略该参数,则将从字符串的最后一个字符处开始检索。
返回值
如果在 stringObject 中的 fromindex 位置之前存在 searchvalue,则返回的是出现的最后一个 searchvalue 的位置。
bug问题分析
fileName 大小写问题 晚上有空验证 什么大写 会错??
2.如何访问用户上传恶意程序 木马.exe.jpg 宽度*高度
2.判断完类型上传的数据是否为恶意程序. 高度和宽度是否为null. 利用图片API
下午
* 3.应该采用分目录存储的方式 保存数据
要注意点的
4.上传的文件名称应该尽量避免重名 自定义文件名称… UUID.后缀…
实现 拼接的