完成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 执行过程来实现分页功能。具体步骤如下:
- 调用
PageHelper.startPage()
方法:在执行 SQL 查询之前,调用该方法并传入页码和每页记录数,这会在当前线程中保存分页信息。 - 执行 SQL 查询:当执行第一条 SQL 查询语句时,
PageHelper
会拦截该查询,并根据之前保存的分页信息对 SQL 语句进行改写。例如,对于 MySQL 数据库,会在原 SQL 语句后面添加LIMIT
子句来实现分页。 - 返回分页结果:查询执行完成后,
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密钥
个人用户