事务管理
@Transactional(rollbackFor = {Exception.class})//事务管理的注解 - 默认出现RuntimeException才会回滚
@Override
public void save(Emp emp) throws Exception{//1.保存员工的基本信息emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());empMapper.insert(emp);//int i = 1/0;arithmetic exception属于运行时异常,可以被识别if (true){throw new Exception("出错啦~~~");}//2.保存员工的基本工作经历信息List<EmpExpr> exprList = emp.getExprList();if (!CollectionUtils.isEmpty(exprList)){//遍历集合,为empId赋值exprList.forEach(empExpr->{empExpr.setEmpId(emp.getId());});empExprMapper.insertBatch(exprList);}
}
事务的传播行为
事务嵌套
- 保证有异常还能继续执行:finally
- 保证不被回滚:REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)//需要在一个新的事务中运行,避免运行之后被回滚
@Override
public void insertLog(EmpLog empLog) {empLogMapper.insert(empLog);
}
@Transactional(rollbackFor = {Exception.class})//事务管理的注解 - 默认出现RuntimeException才会回滚@Overridepublic void save(Emp emp) throws Exception{try {//1.保存员工的基本信息emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());empMapper.insert(emp);int i = 1/0;//arithmetic exception属于运行时异常,可以被识别
// if (true){
// throw new Exception("出错啦~~~");
// }//2.保存员工的基本工作经历信息List<EmpExpr> exprList = emp.getExprList();if (!CollectionUtils.isEmpty(exprList)){//遍历集合,为empId赋值exprList.forEach(empExpr->{empExpr.setEmpId(emp.getId());});empExprMapper.insertBatch(exprList);}} finally {//放到finally中无论事务成功与否都会提交日志// 但是提交后被回滚了,所以不能成功保存日志,所以需要单独开启新事务,去empLogService对应的impl中添加transactional注解,并声明//记录操作日志:调用另外一个serviceEmpLog empLog = new EmpLog(null, LocalDateTime.now(), "新增员工:" + emp);empLogService.insertLog(empLog);}}
文件上传
debug运行之后可以查看file的存放地址
C:\Users\Lenovo\AppData\Local\Temp\tomcat.8080.89517753953083888\work\Tomcat\localhost\ROOT
如果没有保存文件,程序运行结束之后,或者debug跳过改断点将程序运行完之后,会将上面该临时文件夹中的数据清空删除!!!
文件上传
本地存储
springboot文件上传最大单个文件上传大小为1mb,超过会报错无法上传。
需要在application.yml中配置文件上传大小的配置,输入multipart就可以搜到
servlet:multipart:#最大单个文件大小max-file-size: 10MB#最大请求大小(包括所有文件和表单数据)max-request-size: 100MB
package com.itheima.controller;import com.itheima.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@Slf4j
@RestController
public class UploadController {@PostMapping("/upload")public Result upload(String name, Integer age, MultipartFile file) throws IOException {log.info("接收的参数:{},{},{}",name,age,file);//获取原始文件名String originalFilename = file.getOriginalFilename();//新的文件名String extension = originalFilename.substring(originalFilename.lastIndexOf("."));String newFileName = UUID.randomUUID().toString() + extension;//保存文件//file.transferTo(new File("F:/images/"+originalFilename));file.transferTo(new File("F:/images/"+newFileName));return Result.success();}
}
只需要在controller里面配置