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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/28291.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8. Pandas : Matplotlib 的使用方法

一 Matplotlib 介绍 Matplotlib 原本是为静态图表设计的&#xff0c;因而没有提供 Web 页面上的交互式体验。Plotly 是专为 Web 设计的。&#xff08;第9节&#xff09; 支持 2D 和部分 3D 绘图。涵盖折线图、散点图、热力图、3D 图等 20 余种图表。 二 导入库 import matplotl…

医疗AR眼镜:FPC如何赋能科技医疗的未来之眼?【新立电子】

随着科技的飞速发展&#xff0c;增强现实&#xff08;AR&#xff09;技术在医疗领域的应用逐渐成为焦点。医疗AR眼镜作为一种前沿的智能设备&#xff0c;正在为医疗行业带来深刻的变革。它不仅能够提升医生的工作效率&#xff0c;还能改善患者的就医体验&#xff0c;成为医疗科…

pyside6学习专栏(九):在PySide6中使用PySide6.QtCharts绘制6种不同的图表的示例代码

PySide6的QtCharts类支持绘制各种型状的图表&#xff0c;如面积区域图、饼状图、折线图、直方图、线条曲线图、离散点图等&#xff0c;下面的代码是采用示例数据绘制这6种图表的示例代码,并可实现动画显示效果&#xff0c;实际使用时参照代码中示例数据的格式将实际数据替换即可…

C/C++中函数指针和指针函数的原理和区别是什么,分别通过用例说明。

文章目录 函数指针和指针函数的区别函数指针指针函数区别 总结 函数指针和指针函数的区别 在C/C中&#xff0c;函数指针和指针函数是两个不同的概念&#xff0c;它们的用途和定义方式也有所不同。 函数指针 定义&#xff1a; 函数指针是一个指向函数的指针&#xff0c;它存储…

获取哔站评论

一、文章立论 哔哩哔哩&#xff08;B站&#xff09;是当前年轻人十分喜爱的视频分享平台&#xff0c;以其丰富多样的内容、互动性强的社区氛围以及独特的弹幕文化深受用户喜爱。在该平台上&#xff0c;用户不仅可以观看各种类型的视频&#xff0c;如动画、游戏、科技、生活、影…

MySQL-表

存储在表中的数据是一种类型的数据&#xff0c;不同类型的数据应放到不同的表中&#xff0c;否则会使以后的检索和访问很困难。数据库中的每个表都有一个名字&#xff0c;用来标识自己。此名字是唯一的&#xff0c; 这表示数据库中没有其他表具有相同的名字。表由一个或多个列组…

【UCB CS 61B SP24】Lecture 21: Data Structures 5: Priority Queues and Heaps 学习笔记

本文介绍了优先队列与堆&#xff0c;分析了最小堆的插入与删除过程&#xff0c;并用 Java 实现了一个通用类型的最小堆。 1. 优先队列 1.1 介绍 优先队列是一种抽象数据类型&#xff0c;其元素按照优先级顺序被处理。不同于普通队列的先进先出&#xff08;FIFO&#xff09;&…

DeepSeek-R2:AI大模型新纪元的破晓之光

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列十五DeepSeek大模型技术系列十五》DeepS…

UniApp+Vue3实现高性能无限滚动卡片组件:垂直滑动、触摸拖拽与动态导航的完美结合

引言 在移动应用开发中&#xff0c;流畅且吸引人的用户界面对于提升用户体验至关重要。本文将详细介绍如何使用UniApp和Vue3框架构建一个具有垂直方向无限滚动卡片、触摸拖拽支持、同步导航栏和平滑动画效果的高级UI组件。我们将通过代码分析每个功能的实现细节&#xff0c;帮助…

LeetCode 热题 100----1.两数之和

LeetCode 热题 100----1.两数之和 题目描述 我的解法 语言&#xff1a;js 思路就是&#xff1a;用双重循环去找哪两个数字相加等于target&#xff0c;目前的时间复杂度为O(n2)&#xff0c;之后右优化思路再更新。

华为云 | 快速搭建DeepSeek推理系统

DeepSeek&#xff08;深度求索&#xff09;作为一款国产AI大模型&#xff0c;凭借其高性能、低成本和多模态融合能力&#xff0c;在人工智能领域崛起&#xff0c;并在多个行业中展现出广泛的应用潜力。 如上所示&#xff0c;在华为云解决方案实践中&#xff0c;华为云提供的快速…

本地部署阿里万象2.1文生视频模型(Wan2.1-T2V)完全指南

在生成式AI技术爆发式发展的今天,阿里云开源的万象2.1(Wan2.1)视频生成模型,为创作者提供了从文字/图像到高清视频的一站式解决方案。本文针对消费级显卡用户,以RTX 4060 Ti 16G为例,详解本地部署全流程与性能调优方案,涵盖环境配置、多模型选择策略、显存优化技巧及实战…

FPGA标准库-Open Logic

在现代技术发展的浪潮中&#xff0c;开源项目已经成为了推动技术创新和发展的核心力量。无论是人工智能、区块链、云计算&#xff0c;还是传统的嵌入式开发、操作系统&#xff0c;开源项目都在其中扮演着至关重要的角色。它们不仅促进了技术的快速迭代&#xff0c;也为全球开发…

React antd的datePicker自定义,封装成组件

一、antd的datePicker自定义 需求&#xff1a;用户需要为日期选择器的每个日期单元格添加一个Tooltip&#xff0c;当鼠标悬停时显示日期、可兑换流量余额和本公会可兑流量。这些数据需要从接口获取。我需要结合之前的代码&#xff0c;确保Tooltip正确显示&#xff0c;并且数据…

【算法题解答·一】二分法

【算法题解答一】二分法 接上文 【算法方法总结一】二分法的一些技巧和注意事项 二分法相关题目如下&#xff1a; 34.在排序数组中查找元素第一和最后一个位置 使用 左闭右闭&#xff0c;[left,right]关键在于 nums[mid] target 的部分找 第一个 target 的过程中&#xff0…

Non-Homophilic Graph Pre-Training and Prompt Learning

Non-Homophilic Graph Pre-Training and Prompt Learning KDD25 ​#paper/⭐#​ 目的&#xff1a;对异配图进行prompt ‍ ​​ 方法 邻居节点的综合嵌入 s v 1 ∣ V ( S v ) ∣ ∑ u ∈ V ( S v ) h u ⋅ s i m ( h u , h v ) , \mathbf{s}_{v}\frac{1}{|V(S_{v})|}\su…

BUU44 [BJDCTF2020]ZJCTF,不过如此1 [php://filter][正则表达式get输入数据][捕获组反向引用][php中单双引号]

题目&#xff1a; 我仿佛见到了一位故人。。。也难怪&#xff0c;题目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后&#xff1a; ......不太行&#xff0c;好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶&#xff1f;那 f…

掌握 findIndex、push 和 splice:打造微信小程序的灵活图片上传功能✨

文章目录 ✨ 掌握 findIndex、push 和 splice&#xff1a;打造微信小程序的灵活图片上传功能 &#x1f31f;示例场景&#xff1a;小程序图片上传&#x1f33c; 认识 findIndex定义语法在代码中的应用示例当前行为 &#x1f680; 认识 push定义语法在代码中的应用示例特点 ✂️ …

山西青年杂志山西青年杂志社山西青年编辑部2025年第3期目录

青年争鸣 教师发展中心行动转向的价值意蕴分析框架研究与启示 于宝证;李军红;郑钰莹;何易雯; 产教融合视角下职业本科工商管理专业人才培养模式探析 杜芯铭; 青年教育研究 教育数字化背景下高职院校的课堂教学研究 张晨; 统筹职业教育、高等教育、继续教育协同…

神经网络:AI的网络神经

神经网络&#xff08;Neural Networks&#xff09;是深度学习的基础&#xff0c;是一种模仿生物神经系统结构和功能的计算模型。它由大量相互连接的节点&#xff08;称为神经元&#xff09;组成&#xff0c;能够通过学习数据中的模式来完成各种任务&#xff0c;如图像分类、语音…