Tlias智能学习辅助系统笔记-员工管理-新增员工(4)

Tlias智能学习辅助系统笔记-员工管理-新增员工(4) 视频链接讲义资料链接目录一、新增员工(1).添加员工基本信息(2).批量添加工作经历信息二、事务管理1).基础介绍(2).事务进阶补充三、文件上传(图片上传)(1).文件上传-介绍(2).文件上传-本地储存(3).文件上传-阿里云OSS1.上传步骤2.优化编程随想一、新增员工(1).添加员工基本信息思路分析代码实现相关知识点动态SQLforeach循环遍历、Options主键返回1.如何实现动态的参数请求没有或者有一个两个所以我们的SQL语句不能写死要能够循环遍历看有几个值要执行SQL语句我们就需要用到foreach标签它可以用来循环遍历集合、数组动态的执行SQL语句那它怎么用呢先写语法foreach collection 需要遍历的集合 item 元素/对象 separator , 里面就添加需要循环遍历的SQL语句即可2.这里我们要学会Options注解有什么用怎么用何时用当我们有两张表需要绑定在一起比如一个员工有多段员工工作经历需要其中一张表的主键id赋值给另一张表时我们需要在有id那张表的查询语句方法上添加一个Options注解就可以返回主键语法是Options(useGenerateKeys true, keyProperty id),声明使用数据库生成主键并赋给另一张表的属性id,以此来绑定两张表的关系精简有什么用主键返回怎么用需要主键返回的查询语句上添加注解何时用绑定关系(2).批量添加工作经历信息重要代码/** * 新增员工基本信息和员工工作经历信息 */ Override public void save(Emp emp) { //1.补全基础属性 emp.setCreateTime(LocalDateTime.now()); emp.setUpdateTime(LocalDateTime.now()); //2.保存员工基本信息 empMapper.insert(emp); //3.保存员工经历信息 ListEmpExpr exprList emp.getExprList(); if(!CollectionUtils.isEmpty(exprList)) { exprList.forEach(empExpr -{ empExpr.setEmpId(emp.getId()); }); empExprMapper.insertBatch(exprList); } }//复杂SQL语句xml文件配置 ?xml version1.0 encodingUTF-8 ? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.itheima.mapper.EmpExprMapper select idinsertBatch insert into emp_expr(emp_id, begin, end, company, job) foreach collectionexprList itemexpr separator, values(#{expr.empId},#{expr.begin},#{expr.end},#{expr.company},#{expr.job}) /foreach /select /mapper二、事务管理1).基础介绍1.什么是事务事务就是操作的集合就像完成一件事情有很多步骤只有所有步骤都成功这件事才算成功事务也是要么全部成功要么全部失败全部成功了才会向数据库提交操作请求2.事务有什么用保证数据库数据的一致性和完整性3.怎么操作事务怎么用SQL数据库中三个步骤开启事务start transaction提交事务commit 全部成功回滚rollback有一项失败java程序中只需要在对应的方法、实现类、接口上添加一个Transactional注解作用是自动开启事务管理完成业务操作后判断是提交还是回滚。建议添加在方法上且对数据库数据多次增删改查的方法上图片补充(2).事务进阶补充1.rollbackFor声明哪些异常需要回滚Transactional(rollbackFor {Exception.class}) 是声明所有异常都回滚2.propagation 事务传播行为用来解决当一个事务方法被另一个事务方法调用的时候这个事务是加入它所在的事务还是新建一个事务独立开来互不影响。语法是Transactional (propagation Propagation.REQUIRES)事务四大特性三、文件上传(图片上传)学习目标我们要掌握什么是文件上传文件上传的操作步骤有哪些前端是怎么操作的后端(服务器端)是怎么操作的上传到后端后怎么储存在本地怎么储存到服务器阿里云(1).文件上传-介绍文件上传前端三要素上传方式post,编码类型multipart/form-data,必须有一个表单项是file后端创建一个upLoadController来接受前端上传的文件(2).文件上传-本地储存文件保存到本地储存步骤我们先用file.transferTo()方法将文件转存到磁盘文件中需要新new一个磁盘对象用来封装文件参数要写储存路径而储存路径等于磁盘路径文件名但是我们不知道上传的文件名要用file.getOriginalFilename()方法获取原始文件名可是由于客户上传的文件名有可能会一样导致文件被覆盖所以我们需要新编一个新的文件名就用java提供的一个工具UUID,通过UUID.randomUUID()方法来获取一个独一无二的字符串拼接我们的拓展名又用subString()和lastIndexOf()方法来截取我们需要的拓展名还有就是如果我们上传的文件过大大于默认的1MB就需要在application.xml文件中配置我们的最大单个文件大小max-file-size和最大请求文件大小max-request-size直接写multipart会自动显示。关键代码(3).文件上传-阿里云OSS1.上传步骤我们首先要准备上传需要端的工具类里面要修改成我们自己的域名地址endpoint,储存容器backetName,地区region然后就可以编写Controller层接受上传的文件并保存到阿里云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-web-ai-project-tlias; 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/MM String 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; } }Controller层代码如下RequestMapping(/upload) public Result upload(MultipartFile file) throws Exception{ String url aliyunOSSOperator.upload(file.getBytes(), file.getOriginalFilename()); log.info(上传的文件: {},file.getOriginalFilename()); log.info(url: {},url); return Result.success(url); }2.优化优化方案一如果我们不优化会出现什么问题呢比如我们后期需要上线了是不是要新建一个bucket那我们这些值都需要修改我们只能一个一个java文件的找如果我们将这些参数配置在application.xml文件中就可以避免这些问题。怎么配置呢配置之后怎么调用呢怎么配置请看下面的图我讲讲怎么调用,我们在我们声明的属性上面使用Value注解来给属性赋值语法是Value(${ aliyun.oss.参数名})优化方案二还有一个问题就是如果我们需要注入配置的参数比较多的化复用性要求较高时这个方法就比较鸡肋我们就可以用另一套方案新创建一个实体类来封装这些参数这个实体类用Data注解来获得setting和getting方法用Component注解将这个类提交给IOC容器用ConfigurationProperties来配置属性值prefix是后缀名。当我们需要使用到这写属性的时候直接用Autowired来注入调用getting方法就可以了编程随想1.怎么判断一个集合里是否有值用if(CollectionUtils.isEmpty(exprList))进行条件判断2.怎么给一个集合中的某个属性赋值用循环遍历方法foreach()来找并赋值