欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > JavaWeb后端基础(6)

JavaWeb后端基础(6)

2025/8/21 9:38:11 来源:https://blog.csdn.net/weixin_60470460/article/details/145987199  浏览:    关键词:JavaWeb后端基础(6)

主键返回

例子:

/**
* 新增员工数据
*/
@Options(useGeneratedKeys = true, keyProperty = "id")
@Insert("insert into emp(username, name, gender, phone, job, salary, image, entry_date, dept_id, create_time, update_time) " +"values (#{username},#{name},#{gender},#{phone},#{job},#{salary},#{image},#{entryDate},#{deptId},#{createTime},#{updateTime})")
void insert(Emp emp);

我们在保存工作经历信息的时候,需要记录是哪位员工的工作经历。 所以,保存完员工信息之后,是需要获取到员工的ID的,那这里就需要通过Mybatis中提供的主键返回功能来获取。

事务管理

事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。

Transactional注解

用Transactional注解,@Transactional,就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。

位置:业务层的方法上、类上、接口上

  • 方法上:当前方法交给spring进行事务管理

  • 类上:当前类中所有的方法都交由spring进行事务管理

  • 接口上:接口下所有的实现类当中所有的方法都交给spring 进行事务管理

举例:

@Transactional
@Override
public void save(Emp emp) {//1.补全基础属性emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());//2.保存员工基本信息empMapper.insert(emp);int i = 1/0;//3. 保存员工的工作经历信息 - 批量Integer empId = emp.getId();List<EmpExpr> exprList = emp.getExprList();if(!CollectionUtils.isEmpty(exprList)){exprList.forEach(empExpr -> empExpr.setEmpId(empId));empExprMapper.insertBatch(exprList);}
}

 @Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功能可能会包含多个数据访问的操作。在业务层来控制事务,我们就可以将多个数据访问操作控制在一个事务范围内。

可以在application.yml配置文件中开启事务管理日志,这样就可以在控制看到和事务相关的日志信息了

#spring事务管理日志
logging: level: org.springframework.jdbc.support.JdbcTransactionManager: debug

@Transactional注解当中的两个常见的属性:

  • 异常回滚的属性:rollbackFor

  • 事务传播行为:propagation

 rollbackFor

默认情况下,只有出现RuntimeException(运行时异常)才会回滚事务假如我们想让所有的异常都回滚,需要来配置@Transactional注解当中的rollbackFor属性,通过rollbackFor这个属性可以指定出现何种异常类型回滚事务。

@Transactional(rollbackFor = Exception.class)
  • 在Spring的事务管理中,默认只有运行时异常 RuntimeException才会回滚。

  • 如果还需要回滚指定类型的异常,可以通过rollbackFor属性来指定。

 propagation

这个属性是用来配置事务的传播行为的,就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制

例如:两个事务方法,一个A方法,一个B方法。在这两个方法上都添加了@Transactional注解,就代表这两个方法都具有事务,而在A方法当中又去调用了B方法。

所谓事务的传播行为,指的就是在A方法运行的时候,首先会开启一个事务,在A方法当中又调用了B方法, B方法自身也具有事务,那么B方法在运行的时候,到底是加入到A方法的事务当中来,还是B方法在运行的时候新建一个事务?这个就涉及到了事务的传播行为。

我们要想控制事务的传播行为,在@Transactional注解的后面指定一个属性propagation,通过 propagation 属性来指定传播行为。接下来我们就来介绍一下常见的事务传播行为。

属性值含义
REQUIRED【默认值】需要事务,有则加入,无则创建新事务
REQUIRES_NEW需要新事务,无论有无,总是创建新事务
SUPPORTS支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY必须有事务,否则抛异常
NEVER必须没事务,否则抛异常

对于这些事务传播行为,我们只需要关注以下两个就可以了:

  1. REQUIRED(默认值)

  2. REQUIRES_NEW

 文件上传

上传文件的原始form表单,要求表单必须具备以下三点(上传文件页面三要素):

  • 表单必须有file域,用于选择要上传的文件

  • 表单提交方式必须为POST:通常上传的文件会比较大,所以需要使用 POST 提交方式

  • 表单的编码类型enctype必须要设置为:multipart/form-data:普通默认的编码格式是不适合传输大型的二进制数据的,所以在文件上传时,表单的编码格式必须设置为multipart/form-data

Spring中提供了一个API:MultipartFile,使用这个API就可以来接收到上传的文件 

举例:

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.util.UUID;@Slf4j
@RestController
public class UploadController {private static final String UPLOAD_DIR = "D:/images/";/*** 上传文件 - 参数名file*/@PostMapping("/upload")public Result upload(MultipartFile file) throws Exception {log.info("上传文件:{}, {}, {}", username, age, file);if (!file.isEmpty()) {// 生成唯一文件名String originalFilename = file.getOriginalFilename();String extName = originalFilename.substring(originalFilename.lastIndexOf("."));String uniqueFileName = UUID.randomUUID().toString().replace("-", "") + extName;// 拼接完整的文件路径File targetFile = new File(UPLOAD_DIR + uniqueFileName);// 如果目标目录不存在,则创建它if (!targetFile.getParentFile().exists()) {targetFile.getParentFile().mkdirs();}// 保存文件file.transferTo(targetFile);}return Result.success();}
}

MultipartFile 常见方法:

  • String getOriginalFilename(); //获取原始文件名

  • void transferTo(File dest); //将接收的文件转存到磁盘文件中

  • long getSize(); //获取文件的大小,单位:字节

  • byte[] getBytes(); //获取文件内容的字节数组

  • InputStream getInputStream(); //获取接收到的文件内容的输入流

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词