项目操作

  1. SpringBoot 初始化:

    1. Spring Initializr 一般 jdk 选 8,版本选 3.0 以下的(报错的话重新初始化)
    2. 常见依赖:SpringWeb、SpringConfigurationProcessor、SpringBootDevTools、mysqlDriver、junit、mybatisFramework、Lombok
    3. 如果是直接下载的整个项目文件的pom.xml版本报错,先右键重新加载成maven文件
    4. application.yml不是小绿叶而是红色的:
      1. 找到maven重新刷一遍image-20240423164720658
      2. 还不行的话看这个:[IDEA创建application.yml不是小绿叶图标解决办法](https://blog.csdn.net/weixin_43085797/article/details/106333243#:~:text=1、File >>Project Structure 将项目关联到spring中 2、File >>Project,Structure 将项目resources文件变成配置文件夹 选中java文件夹,点击Sources,将java文件夹变成下图所示,这样才能在java这个文件夹里面新建java.class 3、添加application.yml 4、添加启动类 在启动类上加%40SpringBootApplication注解提升没有这个包,点击下载 完美解决,application.yml变成绿叶了)
  2. 常量可以专门放在一个包里面(比如说是 controller、service 都要用的那种)

    image-20240423165243283

  3. 导包相关操作

    1. http://mvnrepository.com/这里面找

    2. 选择风险点少的,人数多的

    3. 复制依赖进 pom.xml,再刷新就行【有时需要注意各个包之间的版本关系】

  4. Test 类增加断言:Assertions.assertEquals(预期值, 实际值);

  5. 封装全局异常处理逻辑关系:ErrorCode定义错误码 –>ResultUtil 利用BaseResponce生成响应对象 –> BusinessException 用于标识业务异常 –> GlobalExceptionHandler 用于捕获和处理这些异常并返回适当的响应

  6. throw new RuntimeException("xxx");return Result.fail(xxx);的区别

  7. 抛出异常会被全局异常处理器捕获,返回fail不会

  8. 用Object数据类型获取session属性值

    1. Object是 Java 中的一个通用数据类型,是所有类的超类。因此,Object 可以用来表示任何 Java 对象。【很牛的功能】

    2. session.getAttribute("xxx") 方法返回的值是一个通用的 Object 类型,因为会话可以存储各种不同类型的数据

    3. 如果知道是具体的数据类型也可以进行转换

  9. String code = (String) cacheCode; // 将 Object 强制转换为 String
    

    8. 自动装箱和自动拆箱

    1. 自动装箱(Autoboxing):将基本数据类型转换为对应的包装类对象。

    1. 自动拆箱(Unboxing):将包装类对象转换为对应的基本数据类型。

    1. ❗尤其注意:如果尝试对一个为null的包装类对象进行自动拆箱,会导致NullPointerException异常,因此在使用自动拆箱时需要谨慎处理可能为null的情况。

    ```Java
    Integer num = 5; // 自动装箱:将int类型的5自动转换为Integer对象
    int intValue = num; // 自动拆箱:将Integer对象num自动转换为int类型
  10. 巧用泛型写工具类(redis)

  11. 使用ThreadLocal获取当前登录用户

// ThreadLocal 是一个线程级别的变量,它允许你在每个线程中存储和访问不同的数据。
// 使用 ThreadLocal 存储 UserDTO 对象,使得每个线程都可以独立地访问自己的 UserDTO 实例。
public class UserHolder {
private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();

public static void saveUser(UserDTO user){tl.set(user);}
public static UserDTO getUser(){return tl.get();}
public static void removeUser(){tl.remove();}
}
  1. Idea启动多个SpringBoot项目 https://blog.csdn.net/linxingliang/article/details/129248244

辅助工具操作(插件/库)

  1. MybatisX-Generator 快速生成 domain、mapper、service 配置
  2. apache common utils库:很好用,比如说判断字符串是否为空StringUtills.isAnyBlank(s1,s2...)
  3. mybatisplus 可以默认帮助我们查询出来没有被删的用户:application 配置 + @TableLogic 配置:逻辑删除 | MyBatis-Plus (baomidou.com)
  4. 想输出日志时传入多个参数的log要从@sl4fj导入,不然只能传一个参数
log.debug("发送验证码:{},到手机:{}", code, phone);
  1. TODO:检验数据输入格式是否正确:封装正则表达式 ——> 能不能直接调用个第三方库

  2. MyBatis-Plus——LambdaQueryWrapper的使用

// QueryWrapper  最基础的使用方法
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", name);
List<User> userList= userMapper.selectList(wrapper);

// 引入lambda 避免写类似name的硬编码,代码更加简洁,适用于不需要动态构建查询条件的情况
List<User> userList= this.lambdaQuery()..eq(User::getName, name).select();

// LambdaQueryWrapper 简化lambda的使用,更加灵活,可以根据不同的条件动态添加查询条件。
LambdaQueryWrapper<User> wrapper = new QueryWrapper<User>().lambda();
wrapper.eq(User::getName, name);;
List<User> userList= userMapper.selectList(wrapper);

// 再简化
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getName, name);
List<User> userList= userMapper.selectList(wrapper);

常见方法

 wrapper.eq("实体类::查询字段", "条件值"); //相当于where条件
wrapper.between("实体类::查询字段", "区间一", "区间二");//相当于范围内使用的between
wrapper.like("实体类::查询字段", "模糊查询的字符"); //模糊查询like
wrapper.groupBy("实体类::查询字段"); //相当于group by分组
wrapper.in("实体类::查询字段", "包括的值,分割"); //相当于in
wrapper.orderByAsc("实体类::查询字段"); //升序
wrapper.orderByDesc("实体类::查询字段");//降序
wrapper.ge("实体类::查询字段", "要比较的值"); //大于等于
wrapper.le("实体类::查询字段", "要比较的值"); //小于等于

// 动态查询,第一个参数必须为true是才添加到查询中
queryWrapper.eq(StringUtils.isNotBlank(phone),User::getPhone,phone);

// 此外,MyBatis-Plus还提供了一种链式查询的方式
List<User> bannerItems = new LambdaQueryChainWrapper<>(userMapper)
.eq(User::getName, name)
.list();
  1. BeanUtils.copyProperties使用

    1. 需要对应的属性有 gettersetter 方法(内部实现时,使用反射拿到 setget 方法,再去获取/设置属性值)

    2. 如果两个类之间存在名称不相同的属性,则 BeanUtils 不对这些属性进行处理,需要程序员手动处理。

BeanUtils.copyProperties(Object source, Object target); 
=> BeanUtils.copyProperties("转换前的类", "转换后的类");

idea 操作

  1. alt+enter 快捷键
    1. 创建测试,会在 test 文件夹创建测试类
    2. Genterate all setter with default value,就会调用该对象所有的 set 方法,并可以指定默认值
  2. ctrl 快捷键
    1. ctrl+p,会显示该方法或函数所接受的参数信息【我趣好好用,就是这个快捷键单手不太好按,比弹琴跨得还开、、、】
    2. ctrl+B 快速进入
    3. fn+shift+f6 重构
    4. ctrl + alt + t 构建try方法
  3. private static final 可以先输入 prsf,按下 enter 快速生成
  4. 添加快捷输入(像 sout) 设置—编辑器-实时模板—新建模板/快捷指令,类似ResultUtil.success($END$),$END$就是输入快捷指令后光标在的位置;然后再 define 里面选上 Java
  5. 注意在写接口的时候先写完接受参数再/**+回车快速生成注释,因为是 java doc 注解类型,可以直接生成参数和返回类
  6. idea 自带测试工具,生成的测试在临时文件和控制台里面,(主要是不用自己手敲 url 就比 apifox 方便( •̀ ω •́ )y
  7. 在 service 修改了参数之后,点击左侧的 R 可以快速在 serviceimpl 中添加这个参数
  8. 在 serviceimpl 中写好了方法,再加个@Override 就可以直接拉到 service 中
  9. 写控制器函数快速填参:插件 Auto filling Java call arguments,鼠标放在括号中间 alt+enter(虽然 copilot 也会自动提示(●’◡’●)

image-20240423165045469

代码操作

  1. 序列化相关操作代码:
public class UserLoginRequest implements Serializable {
private static final long serialVersionUID = -6615735376118984333L;
......
}
  1. 注解类

    1. @Data注解作用:简化一般实体类的 get, set, toString,construct(构造函数)等的书写,简洁化代码。@Data≈@Getter + @Setter + toString() + equals 等方法

    2. @RestController注解:这个类里面所有的请求的接口返回值,响应的数据类型都是 application.json

    3. @RequestBody接收前端传递给后端的 json 字符串中的数据

    4. @RunWith(SpringRunner.class) 表明 Test 测试类要使用注入的类,比如@Autowired 注入的类,有了@RunWith(SpringRunner.class)这些类才能实例化到 spring 容器中,自动注入才能生效

    5. @RestController // 这个类里面所有的请求的接口返回值,响应的数据类型都是 application json

    6. @RequestMapping("/user")//定义请求的总路径

    // 就把前端url请求中的id赋值给followUserId,isFollow赋值给isFollow
    @PutMapping("/{id}/{isFollow}")
    public Result follow(@PathVariable("id")Long followUserId,@PathVariable("isFollow")Boolean isFollow){
    return followService.follow(followUserId,isFollow);
    }
  2. 额额额找个时间补一下LambdaQueryWrapper

git操作

  1. 撤销未push的commit
    1. Git – 选择Reset HEAD – To Commit 填写 HEAD1(撤销一次,两次的话就HEAD2或者HEAD^^,以此类推),相当于终端输出git reset --soft HEAD^

    2. image-20240423164858246

  2. 撤销push的内容(hard和soft的区别)
    // 本地修改全部清空
    git reset --hard 修订号 // 让本地分支回退到指定修订号
    git push origin main(分支名) --force //将本地强制推送到远程

    //不影响任何本地修改
    git reset --soft 修订号 // 让本地分支回退到指定修订号

奇怪Bug

  1. 额额额什么笨蛋忘记了测试类加@SpringBootTest,所以一直报错空指针异常
  2. nginx改了端口号但是访问地址没改
  3. 更离谱的出现了,没开mysql服务就去跑后端,出现的报错是 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure .The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets

常用库:

工具

测试

其他