Day46(16)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project02\tlias-web-management

事务管理

image-20251123195038813

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

事务的传播行为

事务嵌套

image-20251123195313376

  1. 保证有异常还能继续执行:finally
  2. 保证不被回滚:REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)//需要在一个新的事务中运行,避免运行之后被回滚
@Override
public void insertLog(EmpLog empLog) {
    empLogMapper.insert(empLog);
}
 @Transactional(rollbackFor = {Exception.class})//事务管理的注解 - 默认出现RuntimeException才会回滚
    @Override
    public 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注解,并声明
            //记录操作日志:调用另外一个service
            EmpLog empLog = new EmpLog(null, LocalDateTime.now(), "新增员工:" + emp);
            empLogService.insertLog(empLog);
        }


    }

image-20251123202929813

image-20251123202942376

image-20251123203438996

文件上传

image-20251123203515737

image-20251123203726246

image-20251123203924537

image-20251123205440113

debug运行之后可以查看file的存放地址

C:\Users\Lenovo\AppData\Local\Temp\tomcat.8080.89517753953083888\work\Tomcat\localhost\ROOT

image-20251123210733606

image-20251123210902962

如果没有保存文件,程序运行结束之后,或者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里面配置

image-20251123214450955

posted @ 2025-11-23 21:46  David大胃  阅读(1)  评论(0)    收藏  举报