rar在线解压网站,自己做微信优惠券需要网站,php中英文网站模板,抖音代运营合同范本Tlias智能学习系统#xff08;员工管理#xff09;
新增员工#xff1a;
三层架构职责#xff1a;
Controller#xff1a;1.接收请求参数#xff08;员工信息#xff09;#xff1b;2.调用service方法#xff1b;3.响应结果。
具体实现#xff1a;
/***新增员工…Tlias智能学习系统员工管理
新增员工
三层架构职责
Controller1.接收请求参数员工信息2.调用service方法3.响应结果。
具体实现
/***新增员工*/
PostMapping
public Result save(RequestBody Emp emp){log.info(新增员工{},emp);empService.save(emp);return Result.success();
}
Service1.保存员工基本信息2.批量保存员工的工作经历信息。
具体实现
Overridepublic void save(Emp emp) {//1.保存员工的基本信息emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());empMapper.insert(emp);
//2.保存员工的工作经历信息ListEmpExpr exprList emp.getExprList();if(!CollectionUtils.isEmpty(exprList)){//遍历集合为empId赋值exprList.forEach(empExpr - {empExpr.setEmpId(emp.getId());});empExprMapper.insertBatch(exprList);//Batch批量保存}}
Mapper
-- 新增员工
-- 保存员工基本信息 emp
insert into emp(username, name, gender, phone, job, salary, image, entry_date, dept_id, create_time, update_time)values (linpingzhi,林平之,1,13309091234,1,600,1.jpg,2020-01-01,1,2024-10-01 00:00:00,2024-10-01 00:00:00);
-- 保存员工工作经历信息 emp_expr
insert into emp_expr(emp_id, begin, end, company, job)values (37,2020-01-01,2021-01-01,百度,java开发),(37,2021-01-01,2022-01-01,字节,java开发);
具体实现
EmpMapper /*** 新增员工基本信息* param emp*/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);
EmpExprMapper
/*** 批量插入员工工作经历信息*/
void insertBatch(ListEmpExpr exprList);
批量插入员工的工作经历用到配置文件动态SQL
EmpExprMapper.xml
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.itheima.mapper.EmpExprMapper
!-- 批量保存员工工作经历--insert idinsertBatchinsert into emp_expr(emp_id, begin, end, company, job) valuesforeach collectionexprList itemexpr separator,(#{expr.empId},#{expr.begin},#{expr.end},#{expr.company},#{expr.job})/foreach/insert
/mapper
动态SQLforeach属性说明
1.collection集合名称
2.item集合遍历出来的元素/项
3.separator每一次遍历使用的分隔符
4.open遍历开始前拼接的片段
5.close遍历结束后拼接的片段
事务管理
问保存员工的基本信息成功了而保存工作经历失败了是否OK
答不可以因为这是属于一个业务操作如果保存员工信息成功了保存工作经历信息失败了就会造成数据库数据的不完整、不一致。
介绍操作
概念事务是一组操作的集合它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求即这些操作要么同时成功要么同时失败。
注意默认MySQL的事务是自动提交的也就是说当执行一条DML语句MySQL会立即隐式的提交事务。
操作事务控制主要三步操作开启事务、提交事务/回滚事务。
-- 开启事务
start transaction; / begin;
-- 1. 保存员工基本信息
insert into emp values (39, Tom, 123456, 汤姆, 1, 13300001111, 1, 4000, 1.jpg, 2023-11-01, 1, now(), now());
-- 2. 保存员工的工作经历信息
insert into emp_expr(emp_id, begin, end, company, job) values (39,2019-01-01, 2020-01-01, 百度, 开发), (39,2020-01-10, 2022-02-01, 阿里, 架构);
-- 提交事务(全部成功)
commit;
-- 回滚事务(有一个失败)
rollback;
Spring事务管理
注解Transactional
作用将当前方法交给spring进行事务管理方法执行前开启事务成功执行完毕提交事务出现异常回滚事务
位置业务service层的方法上、类上、接口上推荐使用在方法上
Transactional //事务管理 - 默认出现运行时异常RunTimeException才会回滚
Override
public void save(Emp emp) {//1.保存员工的基本信息emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());empMapper.insert(emp);
//2.保存员工的工作经历信息ListEmpExpr exprList emp.getExprList();if(!CollectionUtils.isEmpty(exprList)){//遍历集合为empId赋值exprList.forEach(empExpr - {empExpr.setEmpId(emp.getId());});empExprMapper.insertBatch(exprList);//Batch批量保存}
}
事务进阶
1.rollbackFor属性用于控制出现何种异常类型回滚事务。
Transactional(rollbackFor {Exception.class}) //事务管理 所有异常都回滚
2.事务传播行为propagation指的是当一个事务方法被另一个事务方法调用时这个事务方法应该如何进行事务控制。
Transactional(propagation Propagation.REQUIRED) 案例新增员工信息记录日志propagation
需求在新增员工信息时无论是成功还是失败都要记录操作日志。
步骤1.准备日志表emp_log、实体类Emplog、Mapper接口EmpLogMapper2.在新增员工时记录日志
Transactional(rollbackFor {Exception.class}) //事务管理 - 默认出现运行时异常RunTimeException才会回滚
Override
public void save(Emp emp) {try{//1.保存员工的基本信息emp.setCreateTime(LocalDateTime.now());emp.setUpdateTime(LocalDateTime.now());empMapper.insert(emp);
//2.保存员工的工作经历信息ListEmpExpr exprList emp.getExprList();if(!CollectionUtils.isEmpty(exprList)){//遍历集合为empId赋值exprList.forEach(empExpr - {empExpr.setEmpId(emp.getId());});empExprMapper.insertBatch(exprList);//Batch批量保存}
}finally {//记录操作日志EmpLog empLog new EmpLog(null,LocalDateTime.now(),新增员工emp);empLogService.insertLog(empLog);
}
}
Service
public class EmpLogServiceImpl implements EmpLogService {
Autowiredprivate EmpLogMapper empLogMapper;Transactional(propagation Propagation.REQUIRES_NEW)Overridepublic void insertLog(EmpLog empLog) {empLogMapper.insert(empLog);}
}
四大特性ACID
原子性Atomicity事务是不可分割的最小单元要么全部成功要么全部失败
一致性Consistency事务完成时必须使所有的数据都保持一致状态
隔离性Isolation数据库系统提供的隔离机制保证事务在不受外部并发操作影响的独立环境下运行
持久性Durability事务一旦提交或回滚他对数据库中的数据的改变就是永久的
文件上传
简介
文件上传是指将本地的图片、视频、音频等文件上传到服务器供其他用户浏览或者下载的过程。
文件上传在项目中应用非常广泛我们经常发微博、发微信朋友圈都用到了文件上传功能。 本地存储
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(D:\\xxzl\\java\\file\\originalFileName));return Result.success();}
}
注意上传文件大小受限去设置yml文件
spring:servlet:multipart:#最大单个文件大小max-file-size: 10MB#最大请求大小包括所有文件和表单数据max-request-size: 100MB
阿里云OSS
阿里云阿里云是阿里巴巴集团旗下全球领先的云计算公司也是全球最大的云服务提供商。
阿里云OSS阿里云对象存储OSSObject Storage Service是一款海量、安全、低成本、高可靠的云储存服务。使用OSS您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。
第三方服务-通用思路准备工作-参照官方SDK编写入门程序-集成使用
(SDK:Software Development Kit的缩写软件开发工具包包括辅助软件开发的依赖jar包示例代码等都可以叫SDK)
阿里云OSS—使用步骤
准备工作注册阿里云实名认证-充值-开通对象存储服务OSS-创建bucket-获取并配置AccessKey密钥
(Bucket存储空间是用户用于存储对象Object就是文件的容器所有的对象都必须隶属于某个存储空间)
入门程序
package com.itheima;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.nio.file.Files;
public class Demo {
public static void main(String[] args) throws Exception {// Endpoint以华东1杭州为例其它Region请按实际情况填写。String endpoint https://oss-cn-beijing.aliyuncs.com;// 从环境变量中获取访问凭证。运行本代码示例之前请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填写Bucket名称例如examplebucket。String bucketName java-ai;// 填写Object完整路径例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。String objectName 001.jpg;// 填写Bucket所在地域。以华东1杭州为例Region填写为cn-hangzhou。String region cn-beijing;
// 创建OSSClient实例。ClientBuilderConfiguration clientBuilderConfiguration new ClientBuilderConfiguration();clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);OSS ossClient OSSClientBuilder.create().endpoint(endpoint).credentialsProvider(credentialsProvider).clientConfiguration(clientBuilderConfiguration).region(region).build();
try {File file new File(C:\\Users\\deng\\Pictures\\1.jpg);byte[] content Files.readAllBytes(file.toPath());
ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content));} catch (OSSException oe) {System.out.println(Caught an OSSException, which means your request made it to OSS, but was rejected with an error response for some reason.);System.out.println(Error Message: oe.getErrorMessage());System.out.println(Error Code: oe.getErrorCode());System.out.println(Request ID: oe.getRequestId());System.out.println(Host ID: oe.getHostId());} catch (ClientException ce) {System.out.println(Caught an ClientException, which means the client encountered a serious internal problem while trying to communicate with OSS, such as not being able to access the network.);System.out.println(Error Message: ce.getMessage());} finally {if (ossClient ! null) {ossClient.shutdown();}}}
}
阿里云OSS-案例集成 1.引入阿里云OSS文件上传工具类由官方的示例代码改造而来
package com.itheima.utils;
import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
Component
public class AliyunOSSOperator {
private String endpoint https://oss-cn-beijing.aliyuncs.com;private String bucketName java-ai-0770;private String region cn-beijing;
public String upload(byte[] content, String originalFilename) throws Exception {// 从环境变量中获取访问凭证。运行本代码示例之前请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Object完整路径例如202406/1.png。Object完整路径中不能包含Bucket名称。//获取当前系统日期的字符串,格式为 yyyy/MMString dir LocalDate.now().format(DateTimeFormatter.ofPattern(yyyy/MM));//生成一个新的不重复的文件名String newFileName UUID.randomUUID() originalFilename.substring(originalFilename.lastIndexOf(.));String objectName dir / newFileName;
// 创建OSSClient实例。ClientBuilderConfiguration clientBuilderConfiguration new ClientBuilderConfiguration();clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);OSS ossClient OSSClientBuilder.create().endpoint(endpoint).credentialsProvider(credentialsProvider).clientConfiguration(clientBuilderConfiguration).region(region).build();
try {ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(content));} finally {ossClient.shutdown();}
return endpoint.split(//)[0] // bucketName . endpoint.split(//)[1] / objectName;}
}
2.上传文件接口开发
Autowired
private AliyunOSSOperator aliyunOSSOperator;
PostMapping(/upload)
public Result upload(MultipartFile file) throws Exception {log.info(文件上传{},file.getOriginalFilename());//将文件交给OSS存储管理String url aliyunOSSOperator.upload(file.getBytes(), file.getOriginalFilename());log.info(文件上传OSSurl{},url);return Result.success(url);
}
参数配置化
指将一些需要灵活变化得参数配置在配置文件中然后通过Value注解来注入外部配置得属性。
#阿里云OSS
aliyun:oss:endpoint: https://oss-cn-beijing.aliyuncs.combucketName: java-ai-0770region: cn-beijing
Value(${aliyun.oss.endpoint})
private String endpoint ;
Value(${aliyun.oss.bucketName})
private String bucketName ;
Value(${aliyun.oss.region})
private String region ;
使用Value注解注入配置文件得配置项如果配置项多注入繁琐不便于维护管理和复用。使用ConfigurationProperties
Data
Component
ConfigurationProperties(prefix aliyun.oss)
public class AliyunOSSProperties {private String endpoint;private String bucketName;private String region;
}
Autowired
private AliyunOSSProperties aliyunOSSProperties;String endpoint aliyunOSSProperties.getEndpoint();String bucketName aliyunOSSProperties.getBucketName();String region aliyunOSSProperties.getRegion();