当前位置: 首页 > news >正文

完成springBoot+vue项目时学习到的知识点

1、nginx反向代理

2、密码加密

3、使用yapi导入接口文档

1、访问登录yapi

2、创建项目

3、导入接口文件

5、查看接口文档

4、Swagger

通过解析controller文件生成接口文档

弄好配置文件后,运行springboot项目启动类,输入网址

5、ThreadLocal

在多线程环境下存储和管理当前线程的特定数据

6、分页查询

PageHelper.startPage(employeePageQueryDTO.getPage(), employeePageQueryDTO.getPageSize())
<!--            分页查询--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelper}</version></dependency>

代码作用

这行代码的主要作用是开启分页功能,它会根据传入的页码和每页记录数,对后续执行的 SQL 查询语句进行拦截和修改,从而实现分页查询。具体来说:

  • employeePageQueryDTO.getPage():从 employeePageQueryDTO 对象中获取当前请求的页码。
  • employeePageQueryDTO.getPageSize():从 employeePageQueryDTO 对象中获取每页要显示的记录数。
  • PageHelper.startPage():这是 PageHelper 插件提供的静态方法,用于开启分页功能。当调用该方法后,后续执行的第一条 SQL 查询语句会被自动改写为带有分页功能的 SQL 语句,从而只返回当前页的数据。

工作原理

PageHelper 是一个 MyBatis 的分页插件,它通过拦截 MyBatis 的 SQL 执行过程来实现分页功能。具体步骤如下:

  1. 调用 PageHelper.startPage() 方法:在执行 SQL 查询之前,调用该方法并传入页码和每页记录数,这会在当前线程中保存分页信息。
  2. 执行 SQL 查询:当执行第一条 SQL 查询语句时,PageHelper 会拦截该查询,并根据之前保存的分页信息对 SQL 语句进行改写。例如,对于 MySQL 数据库,会在原 SQL 语句后面添加 LIMIT 子句来实现分页。
  3. 返回分页结果:查询执行完成后,PageHelper 会将查询结果封装成一个 Page 对象,该对象包含了当前页的数据、总记录数、总页数等分页信息。

7、Mybatis驼峰命名映射

数据库的字段总是命名为create_time,而ideal里的实体类属性命名总是createTime,采用驼峰命名映射可以自动将数据库的字段和实体类的属性对应上

在mapper.xml文件中

<select id="selectSomeEntity" resultType="com.example.SomeEntity">SELECT create_time FROM some_table
</select>

在yml配置文件中

mybatis:configuration:#开启驼峰命名map-underscore-to-camel-case: true

8、几个数据表里有许多相同的字段,导致代码冗余

利用注解和AOP切片操作,对insert和update数据库操作统一处理各个业务相同的字段

建立数据库操作类型枚举类,上面的字段只需要插入和更新

/*** 数据库操作类型*/
public enum OperationType {/*** 更新操作*/UPDATE,/*** 插入操作*/INSERT}

创建annotation包,建立annotation注解

/*** 需要进行公共字段自动填充的方法*/
//AutoFile 注解只能应用在方法上
@Target(ElementType.METHOD)
//@Retention用于指定该注解的保留策略。表示该注解在运行时仍然存在
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoFill {//数据库操作类型,update insertOperationType value();
}

创建aspect包,定义切片类

//表明这是一个切面类,Spring AOP 会识别并处理这个类中的切面逻辑
@Aspect
@Component
@Slf4j
public class AutoFillAspect {/*** 切入点:指定了切面逻辑要应用的目标方法*///匹配 com.sky.mapper 包下的所有类的所有方法,这些方法必须被 @AutoFill 注解标记@Pointcut("execution(* com.sky.mapper.*.*(..)) && @annotation(com.sky.annotation.AutoFill)")public void autoFillPointCut(){}/*** 前置通知(目标方法执行之前执行该通知中的逻辑),在通知中进行公共字段的赋值*/@Before("autoFillPointCut()")public void autoFill(JoinPoint joinpoint){log.info("开始进行公共字段自动填充");//获取到当前被拦截的方法上的数据库操作类型MethodSignature signature=(MethodSignature) joinpoint.getSignature();//方法签名对象AutoFill autoFill=signature.getMethod().getAnnotation(AutoFill.class);//获得方法上的注解对象OperationType operationType=autoFill.value();//获得数据库操作类型//获取到当前被拦截的方法的参数(实体对象)Object[] args=joinpoint.getArgs();//获得方法参数if(args==null || args.length==0){return;}Object entity=args[0];//准备赋值的数据LocalDateTime now=LocalDateTime.now();Long currentId= BaseContext.getCurrentId();//根据当前不同的操作类型,为对应的属性通过反射来赋值if(operationType==OperationType.INSERT){try {//获取实体对象的四个方法,为4个公共字段赋值Method setCreatedAt=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATED_AT,LocalDateTime.class);Method setUpdatedAt=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATED_AT,LocalDateTime.class);Method setUpdateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);Method setCreateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_CREATE_USER,Long.class);//通过反射为对象属性赋值setCreatedAt.invoke(entity,now);setCreateUser.invoke(entity,currentId);setUpdatedAt.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {e.printStackTrace();}}else if(operationType==OperationType.UPDATE){try {//获取实体对象的两个方法,为2个公共字段赋值Method setUpdatedAt=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATED_AT,LocalDateTime.class);Method setUpdateUser=entity.getClass().getDeclaredMethod(AutoFillConstant.SET_UPDATE_USER,Long.class);//通过反射为对象属性赋值setUpdatedAt.invoke(entity,now);setUpdateUser.invoke(entity,currentId);} catch (Exception e) {e.printStackTrace();}}}
}

在要拦截的方法上添加注解@AutoFill

删除原本在service类里的赋值代码

9、阿里云oss远程存储服务使用

1、登录官网

2、付费开通oss服务

3、点击控制台

4、搜索oss

5、创建bucket(写名字和修改权限为公共读,其他不变)

6、获取AccessKey密钥

个人用户

http://www.xdnf.cn/news/424333.html

相关文章:

  • 嵌入式STM32学习——外部中断EXTI与NVIC的基础练习⭐
  • 机试刷题:进制转换3
  • 【Pandas】pandas DataFrame cummin
  • 蓝桥杯 11.日志统计
  • 亚远景-基于ASPICE的汽车供应链质量管控培训
  • 网站遭受扫描攻击,大量爬虫应对策略
  • C++伯罗奔尼撒箭阵 全国信息素养大赛复赛决赛 C++小学/初中组 算法创意实践挑战赛 内部集训模拟题详细解析
  • springboot2.7.18 升级到3.1.5过程
  • Ubuntu 22.04.5 LTS 系统中配置仓库源
  • Gartner《如何有效融合Data Fabric 与Data Mesh数据战略》学习心得
  • 【TDengine源码阅读】DLL_EXPORT
  • 【设备管理—磁盘调度算法】
  • 【FMMT】基于模糊多模态变压器模型的个性化情感分析
  • 动态引入document.write的脚本
  • 出于PCB设计层面考虑,连排半孔需要注意哪些事项?
  • 5. 动画/过渡模块 - 交互式仪表盘
  • talk-linux 不同用户之间终端通信
  • C++ 基础知识
  • C++—特殊类设计设计模式
  • 汇添富基金徐寅喆:低利率环境下的短债基金投资策略
  • Hadoop的目录结构和组成
  • CSS3 基础知识、原理及与CSS的区别
  • 基于FPGA的视频接口之千兆网口(六GigE纯逻辑)
  • 使用scp命令拷贝hadoop100中文件到其他虚拟机中
  • SQL、Oracle 和 SQL Server 的比较与分析
  • 数据结构(一) 绪论
  • 【C语言极简自学笔记】井字棋开发
  • Ozon平台产品关键词优化指南:精准引流与转化提升实战策略
  • 影刀RPA开发-CSS选择器介绍
  • 中国品牌日 | 以科技创新为引领,激光院“风采”品牌建设结硕果