主页 > 其他  > 

JavaWeb后端基础(6)

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必须没事务,否则抛异常…

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

REQUIRED(默认值)

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(); //获取接收到的文件内容的输入流

标签:

JavaWeb后端基础(6)由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“JavaWeb后端基础(6)